diff --git a/app/components/DocumentTemplatizeDialog.tsx b/app/components/DocumentTemplatizeDialog.tsx index 3145673235..0750b305e3 100644 --- a/app/components/DocumentTemplatizeDialog.tsx +++ b/app/components/DocumentTemplatizeDialog.tsx @@ -23,7 +23,7 @@ function DocumentTemplatizeDialog({ documentId }: Props) { const template = await document?.templatize(); if (template) { history.push(documentPath(template)); - toast.message(t("Template created, go ahead and customize it")); + toast.success(t("Template created, go ahead and customize it")); } }, [document, history, t]); diff --git a/server/routes/api/documents/documents.ts b/server/routes/api/documents/documents.ts index 05048abb8d..4f74d144e6 100644 --- a/server/routes/api/documents/documents.ts +++ b/server/routes/api/documents/documents.ts @@ -885,46 +885,61 @@ router.post( auth({ member: true }), rateLimiter(RateLimiterStrategy.TwentyFivePerMinute), validate(T.DocumentsTemplatizeSchema), + transaction(), async (ctx: APIContext) => { const { id } = ctx.input.body; const { user } = ctx.state.auth; + const { transaction } = ctx.state; const original = await Document.findByPk(id, { userId: user.id, + transaction, }); + authorize(user, "update", original); - const document = await Document.create({ - editorVersion: original.editorVersion, - collectionId: original.collectionId, - teamId: original.teamId, - userId: user.id, - publishedAt: new Date(), - lastModifiedById: user.id, - createdById: user.id, - template: true, - emoji: original.emoji, - title: original.title, - text: original.text, - }); - await Event.create({ - name: "documents.create", - documentId: document.id, - collectionId: document.collectionId, - teamId: document.teamId, - actorId: user.id, - data: { - title: document.title, + const document = await Document.create( + { + editorVersion: original.editorVersion, + collectionId: original.collectionId, + teamId: original.teamId, + userId: user.id, + publishedAt: new Date(), + lastModifiedById: user.id, + createdById: user.id, template: true, + emoji: original.emoji, + title: original.title, + text: original.text, }, - ip: ctx.request.ip, - }); + { + transaction, + } + ); + await Event.create( + { + name: "documents.create", + documentId: document.id, + collectionId: document.collectionId, + teamId: document.teamId, + actorId: user.id, + data: { + title: document.title, + template: true, + }, + ip: ctx.request.ip, + }, + { + transaction, + } + ); // reload to get all of the data needed to present (user, collection etc) const reloaded = await Document.findByPk(document.id, { userId: user.id, - rejectOnEmpty: true, + transaction, }); + invariant(reloaded, "document not found"); ctx.body = { data: await presentDocument(reloaded),