Skip to content

Commit df02370

Browse files
committed
add option to clone template
1 parent f00c9a3 commit df02370

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

src/controllers/aiTemplate.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ export const find: RequestHandler<{ id: string }> = async (req, res, next) => {
2020
next(error);
2121
}
2222
};
23+
export const clone: RequestHandler<{ id: string }, any, any> = async (req, res, next) => {
24+
try {
25+
const template = await AiTemplate.cloneModel(req.user!, req.params.id);
26+
res.status(201).json(template);
27+
} catch (error) {
28+
next(error);
29+
}
30+
};
2331
export const create: RequestHandler<any, any, any> = async (req, res, next) => {
2432
try {
2533
const template = await AiTemplate.createModel(req.user!, req.body);

src/models/AiTemplate.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,35 @@ function AiTemplate(db: PrismaClient['aiTemplate']) {
2525
}
2626
return db.findUniqueOrThrow({ where: { id } }).then((v) => prepareAiTemplate(v));
2727
},
28+
async cloneModel(actor: DbUser, id: string): Promise<DbAiTemplate> {
29+
if (!hasElevatedAccess(actor.role)) {
30+
throw new HTTP403Error('Not authorized to find AI templates');
31+
}
32+
const record = await this.findModel(actor, id);
33+
if (record.authorId !== actor.id) {
34+
throw new HTTP403Error('Not authorized to clone this AI template');
35+
}
36+
if ((record.config as any)?.text?.format?.name) {
37+
(record.config as any).text.format.name =
38+
`${(record.config as any).text.format.name} (clone)`;
39+
}
40+
const cloneData: Prisma.AiTemplateCreateInput = {
41+
config: record.config as Prisma.InputJsonValue,
42+
apiKey: record.apiKey,
43+
apiUrl: record.apiUrl,
44+
isActive: record.isActive,
45+
rateLimit: record.rateLimit,
46+
rateLimitPeriodMs: record.rateLimitPeriodMs,
47+
author: {
48+
connect: { id: actor.id }
49+
}
50+
};
51+
return db
52+
.create({
53+
data: cloneData
54+
})
55+
.then((v) => prepareAiTemplate(v));
56+
},
2857
async updateModel(actor: DbUser, id: string, data: Partial<DbAiTemplate>): Promise<DbAiTemplate> {
2958
if (!hasElevatedAccess(actor.role)) {
3059
throw new HTTP403Error('Not authorized to update AI templates');

src/routes/router.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ import {
5050
create as createAiTemplate,
5151
destroy as destroyAiTemplate,
5252
find as findAiTemplate,
53-
update as updateAiTemplate
53+
update as updateAiTemplate,
54+
clone as cloneAiTemplate
5455
} from '../controllers/aiTemplate';
5556
import {
5657
all as allAiRequests,
@@ -127,6 +128,7 @@ router.post('/cms/logout', githubLogout);
127128

128129
router.get('/admin/aiTemplates', allAiTemplates);
129130
router.get('/admin/aiTemplates/:id', findAiTemplate);
131+
router.post('/admin/aiTemplates/:id/clone', cloneAiTemplate);
130132
router.post('/admin/aiTemplates', createAiTemplate);
131133
router.put('/admin/aiTemplates/:id', updateAiTemplate);
132134
router.delete('/admin/aiTemplates/:id', destroyAiTemplate);

0 commit comments

Comments
 (0)