From 0eee57078101fc31cfb656f768187aa25413514e Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Tue, 23 Apr 2024 12:33:40 +0300 Subject: [PATCH 1/5] fix: complete document when all recipients are CC --- .../documents/[id]/edit-document.tsx | 13 ++++++++++++- .../trpc/server/document-router/router.ts | 19 +++++++++++++++++++ .../trpc/server/document-router/schema.ts | 6 ++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 2e2f0c889..fbc700219 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -8,6 +8,7 @@ import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION, SKIP_QUERY_BATCH_META, } from '@documenso/lib/constants/trpc'; +import { DocumentStatus, RecipientRole } from '@documenso/prisma/client'; import type { DocumentWithDetails } from '@documenso/prisma/types/document'; import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; @@ -68,6 +69,10 @@ export const EditDocumentForm = ({ const { Recipient: recipients, Field: fields } = document; + const allRecipientsAreCC = recipients.every((recipient) => recipient.role === RecipientRole.CC); + + const { mutateAsync: updateDocumentStatus } = trpc.document.updateDocument.useMutation(); + const { mutateAsync: setSettingsForDocument } = trpc.document.setSettingsForDocument.useMutation({ ...DO_NOT_INVALIDATE_QUERY_ON_MUTATION, onSuccess: (newData) => { @@ -248,8 +253,14 @@ export const EditDocumentForm = ({ const onAddSubjectFormSubmit = async (data: TAddSubjectFormSchema) => { const { subject, message } = data.meta; - try { + if (allRecipientsAreCC) { + await updateDocumentStatus({ + documentId: document.id, + data: { status: DocumentStatus.COMPLETED }, + }); + } + await sendDocument({ documentId: document.id, teamId: team?.id, diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts index d12002674..fa9d95262 100644 --- a/packages/trpc/server/document-router/router.ts +++ b/packages/trpc/server/document-router/router.ts @@ -16,6 +16,7 @@ import { getDocumentWithDetailsById } from '@documenso/lib/server-only/document/ import { resendDocument } from '@documenso/lib/server-only/document/resend-document'; import { searchDocumentsWithKeyword } from '@documenso/lib/server-only/document/search-documents-with-keyword'; import { sendDocument } from '@documenso/lib/server-only/document/send-document'; +import { updateDocument } from '@documenso/lib/server-only/document/update-document'; import { updateDocumentSettings } from '@documenso/lib/server-only/document/update-document-settings'; import { updateTitle } from '@documenso/lib/server-only/document/update-title'; import { symmetricEncrypt } from '@documenso/lib/universal/crypto'; @@ -36,6 +37,7 @@ import { ZSetPasswordForDocumentMutationSchema, ZSetSettingsForDocumentMutationSchema, ZSetTitleForDocumentMutationSchema, + ZUpdateDocumentMutationSchema, } from './schema'; export const documentRouter = router({ @@ -132,6 +134,23 @@ export const documentRouter = router({ } }), + updateDocument: authenticatedProcedure + .input(ZUpdateDocumentMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + const { documentId, data } = input; + + await updateDocument({ documentId, data, userId: ctx.user.id }); + } catch (err) { + console.error(err); + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to delete this document. Please try again later.', + }); + } + }), + deleteDocument: authenticatedProcedure .input(ZDeleteDocumentMutationSchema) .mutation(async ({ input, ctx }) => { diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index 483d32e50..4936aae37 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -48,6 +48,12 @@ export const ZCreateDocumentMutationSchema = z.object({ teamId: z.number().optional(), }); +export const ZUpdateDocumentMutationSchema = z.object({ + documentId: z.number().min(1), + teamId: z.number().optional(), + data: z.any(), +}); + export type TCreateDocumentMutationSchema = z.infer; export const ZSetSettingsForDocumentMutationSchema = z.object({ From 4d5365bddcd94dacad4fd6c4df3e84652b6f9504 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Tue, 23 Apr 2024 14:24:58 +0300 Subject: [PATCH 2/5] fix: complete document when all recipients are CC --- .../documents/[id]/edit-document.tsx | 12 ------------ .../server-only/document/send-document.tsx | 6 +++++- .../trpc/server/document-router/router.ts | 19 ------------------- .../trpc/server/document-router/schema.ts | 6 ------ 4 files changed, 5 insertions(+), 38 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index fbc700219..e175ae18a 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -8,7 +8,6 @@ import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION, SKIP_QUERY_BATCH_META, } from '@documenso/lib/constants/trpc'; -import { DocumentStatus, RecipientRole } from '@documenso/prisma/client'; import type { DocumentWithDetails } from '@documenso/prisma/types/document'; import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; @@ -69,10 +68,6 @@ export const EditDocumentForm = ({ const { Recipient: recipients, Field: fields } = document; - const allRecipientsAreCC = recipients.every((recipient) => recipient.role === RecipientRole.CC); - - const { mutateAsync: updateDocumentStatus } = trpc.document.updateDocument.useMutation(); - const { mutateAsync: setSettingsForDocument } = trpc.document.setSettingsForDocument.useMutation({ ...DO_NOT_INVALIDATE_QUERY_ON_MUTATION, onSuccess: (newData) => { @@ -254,13 +249,6 @@ export const EditDocumentForm = ({ const onAddSubjectFormSubmit = async (data: TAddSubjectFormSchema) => { const { subject, message } = data.meta; try { - if (allRecipientsAreCC) { - await updateDocumentStatus({ - documentId: document.id, - data: { status: DocumentStatus.COMPLETED }, - }); - } - await sendDocument({ documentId: document.id, teamId: team?.id, diff --git a/packages/lib/server-only/document/send-document.tsx b/packages/lib/server-only/document/send-document.tsx index 5bb7e2352..6b9ab8037 100644 --- a/packages/lib/server-only/document/send-document.tsx +++ b/packages/lib/server-only/document/send-document.tsx @@ -211,6 +211,10 @@ export const sendDocument = async ({ }), ); + const allRecipientsAreCC = document.Recipient.every( + (recipient) => recipient.role === RecipientRole.CC, + ); + const updatedDocument = await prisma.$transaction(async (tx) => { if (document.status === DocumentStatus.DRAFT) { await tx.documentAuditLog.create({ @@ -229,7 +233,7 @@ export const sendDocument = async ({ id: documentId, }, data: { - status: DocumentStatus.PENDING, + status: allRecipientsAreCC ? DocumentStatus.COMPLETED : DocumentStatus.PENDING, }, include: { Recipient: true, diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts index fa9d95262..d12002674 100644 --- a/packages/trpc/server/document-router/router.ts +++ b/packages/trpc/server/document-router/router.ts @@ -16,7 +16,6 @@ import { getDocumentWithDetailsById } from '@documenso/lib/server-only/document/ import { resendDocument } from '@documenso/lib/server-only/document/resend-document'; import { searchDocumentsWithKeyword } from '@documenso/lib/server-only/document/search-documents-with-keyword'; import { sendDocument } from '@documenso/lib/server-only/document/send-document'; -import { updateDocument } from '@documenso/lib/server-only/document/update-document'; import { updateDocumentSettings } from '@documenso/lib/server-only/document/update-document-settings'; import { updateTitle } from '@documenso/lib/server-only/document/update-title'; import { symmetricEncrypt } from '@documenso/lib/universal/crypto'; @@ -37,7 +36,6 @@ import { ZSetPasswordForDocumentMutationSchema, ZSetSettingsForDocumentMutationSchema, ZSetTitleForDocumentMutationSchema, - ZUpdateDocumentMutationSchema, } from './schema'; export const documentRouter = router({ @@ -134,23 +132,6 @@ export const documentRouter = router({ } }), - updateDocument: authenticatedProcedure - .input(ZUpdateDocumentMutationSchema) - .mutation(async ({ input, ctx }) => { - try { - const { documentId, data } = input; - - await updateDocument({ documentId, data, userId: ctx.user.id }); - } catch (err) { - console.error(err); - - throw new TRPCError({ - code: 'BAD_REQUEST', - message: 'We were unable to delete this document. Please try again later.', - }); - } - }), - deleteDocument: authenticatedProcedure .input(ZDeleteDocumentMutationSchema) .mutation(async ({ input, ctx }) => { diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index 4936aae37..483d32e50 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -48,12 +48,6 @@ export const ZCreateDocumentMutationSchema = z.object({ teamId: z.number().optional(), }); -export const ZUpdateDocumentMutationSchema = z.object({ - documentId: z.number().min(1), - teamId: z.number().optional(), - data: z.any(), -}); - export type TCreateDocumentMutationSchema = z.infer; export const ZSetSettingsForDocumentMutationSchema = z.object({ From bb43547a459dc3ef3ae0d02ccf2607b674373f67 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Wed, 24 Apr 2024 09:39:47 +0300 Subject: [PATCH 3/5] fix: complete document when all recipients are CC --- .../lib/server-only/document/send-document.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/lib/server-only/document/send-document.tsx b/packages/lib/server-only/document/send-document.tsx index 6b9ab8037..8d92de3a3 100644 --- a/packages/lib/server-only/document/send-document.tsx +++ b/packages/lib/server-only/document/send-document.tsx @@ -4,6 +4,8 @@ import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { DocumentInviteEmailTemplate } from '@documenso/email/templates/document-invite'; import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; +import { sealDocument } from '@documenso/lib/server-only/document/seal-document'; +import { updateDocument } from '@documenso/lib/server-only/document/update-document'; import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; @@ -215,6 +217,17 @@ export const sendDocument = async ({ (recipient) => recipient.role === RecipientRole.CC, ); + if (allRecipientsAreCC) { + const updatedDocument = await updateDocument({ + documentId, + userId, + teamId, + data: { status: DocumentStatus.COMPLETED }, + }); + + return await sealDocument({ documentId: updatedDocument.id, requestMetadata }); + } + const updatedDocument = await prisma.$transaction(async (tx) => { if (document.status === DocumentStatus.DRAFT) { await tx.documentAuditLog.create({ @@ -233,7 +246,7 @@ export const sendDocument = async ({ id: documentId, }, data: { - status: allRecipientsAreCC ? DocumentStatus.COMPLETED : DocumentStatus.PENDING, + status: DocumentStatus.PENDING, }, include: { Recipient: true, From d7959950e21684286caad13cbddacaa46b4d559e Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Wed, 24 Apr 2024 09:41:34 +0300 Subject: [PATCH 4/5] fix: edit-document line --- apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index e175ae18a..2e2f0c889 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -248,6 +248,7 @@ export const EditDocumentForm = ({ const onAddSubjectFormSubmit = async (data: TAddSubjectFormSchema) => { const { subject, message } = data.meta; + try { await sendDocument({ documentId: document.id, From 40808066069d189ad21ddaf06fdaf9fee612dd56 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Fri, 26 Apr 2024 02:17:56 +0000 Subject: [PATCH 5/5] fix: minor updates --- .../lib/server-only/document/send-document.tsx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/lib/server-only/document/send-document.tsx b/packages/lib/server-only/document/send-document.tsx index 8d92de3a3..9f68ed29b 100644 --- a/packages/lib/server-only/document/send-document.tsx +++ b/packages/lib/server-only/document/send-document.tsx @@ -213,11 +213,11 @@ export const sendDocument = async ({ }), ); - const allRecipientsAreCC = document.Recipient.every( + const allRecipientsHaveNoActionToTake = document.Recipient.every( (recipient) => recipient.role === RecipientRole.CC, ); - if (allRecipientsAreCC) { + if (allRecipientsHaveNoActionToTake) { const updatedDocument = await updateDocument({ documentId, userId, @@ -225,7 +225,17 @@ export const sendDocument = async ({ data: { status: DocumentStatus.COMPLETED }, }); - return await sealDocument({ documentId: updatedDocument.id, requestMetadata }); + await sealDocument({ documentId: updatedDocument.id, requestMetadata }); + + // Keep the return type the same for the `sendDocument` method + return await prisma.document.findFirstOrThrow({ + where: { + id: documentId, + }, + include: { + Recipient: true, + }, + }); } const updatedDocument = await prisma.$transaction(async (tx) => {