From d5238939ad255355a988c896016c729d43c60a13 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Wed, 20 Sep 2023 09:51:04 +0000 Subject: [PATCH] feat: persist document metadata in database for a specific user --- .../forms/edit-document/add-subject.action.ts | 21 ++++++++++- .../document-meta/create-document-meta.ts | 36 +++++++++++++++++++ .../server-only/document/send-document.tsx | 14 ++++---- .../server-only/document/update-document.ts | 21 +++++++++++ 4 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 packages/lib/server-only/document-meta/create-document-meta.ts create mode 100644 packages/lib/server-only/document/update-document.ts diff --git a/apps/web/src/components/forms/edit-document/add-subject.action.ts b/apps/web/src/components/forms/edit-document/add-subject.action.ts index 7dddbe222..c3b7845f8 100644 --- a/apps/web/src/components/forms/edit-document/add-subject.action.ts +++ b/apps/web/src/components/forms/edit-document/add-subject.action.ts @@ -1,7 +1,9 @@ 'use server'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; +import { createDocumentMeta } from '@documenso/lib/server-only/document-meta/create-document-meta'; import { sendDocument } from '@documenso/lib/server-only/document/send-document'; +import { updateDocument } from '@documenso/lib/server-only/document/update-document'; import { TAddSubjectFormSchema } from '@documenso/ui/primitives/document-flow/add-subject.types'; export type CompleteDocumentActionInput = TAddSubjectFormSchema & { @@ -13,9 +15,26 @@ export const completeDocument = async ({ documentId, email }: CompleteDocumentAc const { id: userId } = await getRequiredServerComponentSession(); + const createDocumentMetaResponse = await createDocumentMeta({ + emailBody: email.message, + emailSubject: email.subject, + }); + + if (createDocumentMetaResponse) { + await updateDocument({ + documentId, + data: { + DocumentMeta: { + connect: { + id: createDocumentMetaResponse.id, + }, + }, + }, + }); + } + await sendDocument({ userId, documentId, - email, }); }; diff --git a/packages/lib/server-only/document-meta/create-document-meta.ts b/packages/lib/server-only/document-meta/create-document-meta.ts new file mode 100644 index 000000000..e77db9a87 --- /dev/null +++ b/packages/lib/server-only/document-meta/create-document-meta.ts @@ -0,0 +1,36 @@ +'use server'; + +import { prisma } from '@documenso/prisma'; + +export type CreateDocumentMetaOptions = { + emailSubject: string; + emailBody: string; +}; + +export const createDocumentMeta = async ({ + emailBody, + emailSubject, +}: CreateDocumentMetaOptions) => { + const documentMeta = await prisma.documentMeta.findFirst(); + + if (!documentMeta) { + return await prisma.documentMeta.create({ + data: { + customEmailBody: emailBody, + customEmailSubject: emailSubject, + }, + }); + } + + if (emailBody && emailSubject) { + return await prisma.documentMeta.update({ + where: { + id: documentMeta.id, + }, + data: { + customEmailBody: emailBody, + customEmailSubject: emailSubject, + }, + }); + } +}; diff --git a/packages/lib/server-only/document/send-document.tsx b/packages/lib/server-only/document/send-document.tsx index 980868a48..3bedc6ee4 100644 --- a/packages/lib/server-only/document/send-document.tsx +++ b/packages/lib/server-only/document/send-document.tsx @@ -5,16 +5,13 @@ import { render } from '@documenso/email/render'; import { DocumentInviteEmailTemplate } from '@documenso/email/templates/document-invite'; import { prisma } from '@documenso/prisma'; import { DocumentStatus, SendStatus } from '@documenso/prisma/client'; -import { TAddSubjectFormSchema } from '@documenso/ui/primitives/document-flow/add-subject.types'; -export type SendDocumentOptions = TAddSubjectFormSchema & { +export type SendDocumentOptions = { documentId: number; userId: number; }; -export const sendDocument = async ({ documentId, userId, email }: SendDocumentOptions) => { - const customEmail = email; - +export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) => { const user = await prisma.user.findFirstOrThrow({ where: { id: userId, @@ -28,9 +25,12 @@ export const sendDocument = async ({ documentId, userId, email }: SendDocumentOp }, include: { Recipient: true, + DocumentMeta: true, }, }); + const customEmail = document?.DocumentMeta; + if (!document) { throw new Error('Document not found'); } @@ -71,7 +71,9 @@ export const sendDocument = async ({ documentId, userId, email }: SendDocumentOp name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso', address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com', }, - subject: customEmail.subject ? customEmail.subject : 'Please sign this document', + subject: customEmail?.customEmailSubject + ? customEmail.customEmailSubject + : 'Please sign this document', html: render(template), text: render(template, { plainText: true }), }); diff --git a/packages/lib/server-only/document/update-document.ts b/packages/lib/server-only/document/update-document.ts new file mode 100644 index 000000000..7793c990a --- /dev/null +++ b/packages/lib/server-only/document/update-document.ts @@ -0,0 +1,21 @@ +'use server'; + +import { Prisma } from '@prisma/client'; + +import { prisma } from '@documenso/prisma'; + +export type UpdateDocumentOptions = { + documentId: number; + data: Prisma.DocumentUpdateInput; +}; + +export const updateDocument = async ({ documentId, data }: UpdateDocumentOptions) => { + return await prisma.document.update({ + where: { + id: documentId, + }, + data: { + ...data, + }, + }); +};