From 268a5c6508cb932f6e5e2f5c1fa1c9c500c8f4e2 Mon Sep 17 00:00:00 2001 From: Mythie Date: Thu, 21 Dec 2023 17:01:12 +1100 Subject: [PATCH] fix: swap server-actions for trpc mutations --- apps/marketing/src/components/constants.ts | 2 +- .../templates/[id]/edit-template.tsx | 9 +++--- .../add-template-fields.action.ts | 32 ------------------- .../add-template-placeholders.action.ts | 28 ---------------- packages/trpc/server/field-router/router.ts | 23 +++++++++++++ packages/trpc/server/field-router/schema.ts | 19 +++++++++++ .../trpc/server/recipient-router/router.ts | 32 ++++++++++++++++++- .../trpc/server/recipient-router/schema.ts | 23 +++++++++++++ ...d-template-placeholder-recipients.types.ts | 2 +- 9 files changed, 103 insertions(+), 67 deletions(-) delete mode 100644 apps/web/src/components/forms/edit-template/add-template-fields.action.ts delete mode 100644 apps/web/src/components/forms/edit-template/add-template-placeholders.action.ts diff --git a/apps/marketing/src/components/constants.ts b/apps/marketing/src/components/constants.ts index 1f11df116..dcbb631a2 100644 --- a/apps/marketing/src/components/constants.ts +++ b/apps/marketing/src/components/constants.ts @@ -1,5 +1,5 @@ export const STEP = { EMAIL: 'EMAIL', NAME: 'NAME', - SIGN: "SIGN" + SIGN: 'SIGN', } as const; diff --git a/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx b/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx index 920cac247..bdc769e79 100644 --- a/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx +++ b/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx @@ -5,6 +5,7 @@ import { useState } from 'react'; import { useRouter } from 'next/navigation'; import type { DocumentData, Field, Recipient, Template, User } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { @@ -20,9 +21,6 @@ import { AddTemplatePlaceholderRecipientsFormPartial } from '@documenso/ui/primi import type { TAddTemplatePlacholderRecipientsFormSchema } from '@documenso/ui/primitives/template-flow/add-template-placeholder-recipients.types'; import { useToast } from '@documenso/ui/primitives/use-toast'; -import { addTemplateFields } from '~/components/forms/edit-template/add-template-fields.action'; -import { addTemplatePlaceholders } from '~/components/forms/edit-template/add-template-placeholders.action'; - export type EditTemplateFormProps = { className?: string; user: User; @@ -63,11 +61,14 @@ export const EditTemplateForm = ({ const currentDocumentFlow = documentFlow[step]; + const { mutateAsync: addTemplateFields } = trpc.field.addTemplateFields.useMutation(); + const { mutateAsync: addTemplateSigners } = trpc.recipient.addTemplateSigners.useMutation(); + const onAddTemplatePlaceholderFormSubmit = async ( data: TAddTemplatePlacholderRecipientsFormSchema, ) => { try { - await addTemplatePlaceholders({ + await addTemplateSigners({ templateId: template.id, signers: data.signers, }); diff --git a/apps/web/src/components/forms/edit-template/add-template-fields.action.ts b/apps/web/src/components/forms/edit-template/add-template-fields.action.ts deleted file mode 100644 index 845ae5faf..000000000 --- a/apps/web/src/components/forms/edit-template/add-template-fields.action.ts +++ /dev/null @@ -1,32 +0,0 @@ -'use server'; - -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; -import { setFieldsForTemplate } from '@documenso/lib/server-only/field/set-fields-for-template'; -import type { TAddTemplateFieldsFormSchema } from '@documenso/ui/primitives/template-flow/add-template-fields.types'; - -export type AddTemplateFieldsActionInput = TAddTemplateFieldsFormSchema & { - templateId: number; -}; - -export const addTemplateFields = async ({ templateId, fields }: AddTemplateFieldsActionInput) => { - 'use server'; - - const { user } = await getRequiredServerComponentSession(); - - await setFieldsForTemplate({ - userId: user.id, - templateId, - fields: fields.map((field) => ({ - id: field.nativeId, - signerEmail: field.signerEmail, - signerId: field.signerId, - signerToken: field.signerToken, - type: field.type, - pageNumber: field.pageNumber, - pageX: field.pageX, - pageY: field.pageY, - pageWidth: field.pageWidth, - pageHeight: field.pageHeight, - })), - }); -}; diff --git a/apps/web/src/components/forms/edit-template/add-template-placeholders.action.ts b/apps/web/src/components/forms/edit-template/add-template-placeholders.action.ts deleted file mode 100644 index ba5a3e004..000000000 --- a/apps/web/src/components/forms/edit-template/add-template-placeholders.action.ts +++ /dev/null @@ -1,28 +0,0 @@ -'use server'; - -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; -import { setRecipientsForTemplate } from '@documenso/lib/server-only/recipient/set-recipients-for-template'; -import type { TAddTemplatePlacholderRecipientsFormSchema } from '@documenso/ui/primitives/template-flow/add-template-placeholder-recipients.types'; - -export type AddTemplatePlaceholdersActionInput = TAddTemplatePlacholderRecipientsFormSchema & { - templateId: number; -}; - -export const addTemplatePlaceholders = async ({ - templateId, - signers, -}: AddTemplatePlaceholdersActionInput) => { - 'use server'; - - const { user } = await getRequiredServerComponentSession(); - - await setRecipientsForTemplate({ - userId: user.id, - templateId, - recipients: signers.map((signer) => ({ - id: signer.nativeId!, - email: signer.email, - name: signer.name!, - })), - }); -}; diff --git a/packages/trpc/server/field-router/router.ts b/packages/trpc/server/field-router/router.ts index 7d049df0d..07cdcd347 100644 --- a/packages/trpc/server/field-router/router.ts +++ b/packages/trpc/server/field-router/router.ts @@ -2,11 +2,13 @@ import { TRPCError } from '@trpc/server'; import { removeSignedFieldWithToken } from '@documenso/lib/server-only/field/remove-signed-field-with-token'; import { setFieldsForDocument } from '@documenso/lib/server-only/field/set-fields-for-document'; +import { setFieldsForTemplate } from '@documenso/lib/server-only/field/set-fields-for-template'; import { signFieldWithToken } from '@documenso/lib/server-only/field/sign-field-with-token'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { ZAddFieldsMutationSchema, + ZAddTemplateFieldsMutationSchema, ZRemovedSignedFieldWithTokenMutationSchema, ZSignFieldWithTokenMutationSchema, } from './schema'; @@ -42,6 +44,27 @@ export const fieldRouter = router({ } }), + addTemplateFields: authenticatedProcedure + .input(ZAddTemplateFieldsMutationSchema) + .mutation(async ({ input, ctx }) => { + const { templateId, fields } = input; + + await setFieldsForTemplate({ + userId: ctx.user.id, + templateId, + fields: fields.map((field) => ({ + id: field.nativeId, + signerEmail: field.signerEmail, + type: field.type, + pageNumber: field.pageNumber, + pageX: field.pageX, + pageY: field.pageY, + pageWidth: field.pageWidth, + pageHeight: field.pageHeight, + })), + }); + }), + signFieldWithToken: procedure .input(ZSignFieldWithTokenMutationSchema) .mutation(async ({ input }) => { diff --git a/packages/trpc/server/field-router/schema.ts b/packages/trpc/server/field-router/schema.ts index d9f207adb..9bd576667 100644 --- a/packages/trpc/server/field-router/schema.ts +++ b/packages/trpc/server/field-router/schema.ts @@ -21,6 +21,25 @@ export const ZAddFieldsMutationSchema = z.object({ export type TAddFieldsMutationSchema = z.infer; +export const ZAddTemplateFieldsMutationSchema = z.object({ + templateId: z.number(), + fields: z.array( + z.object({ + formId: z.string().min(1), + nativeId: z.number().optional(), + type: z.nativeEnum(FieldType), + signerEmail: z.string().min(1), + pageNumber: z.number().min(1), + pageX: z.number().min(0), + pageY: z.number().min(0), + pageWidth: z.number().min(0), + pageHeight: z.number().min(0), + }), + ), +}); + +export type TAddTemplateFieldsMutationSchema = z.infer; + export const ZSignFieldWithTokenMutationSchema = z.object({ token: z.string(), fieldId: z.number(), diff --git a/packages/trpc/server/recipient-router/router.ts b/packages/trpc/server/recipient-router/router.ts index 913749dde..09097895c 100644 --- a/packages/trpc/server/recipient-router/router.ts +++ b/packages/trpc/server/recipient-router/router.ts @@ -2,9 +2,14 @@ import { TRPCError } from '@trpc/server'; import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token'; import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document'; +import { setRecipientsForTemplate } from '@documenso/lib/server-only/recipient/set-recipients-for-template'; import { authenticatedProcedure, procedure, router } from '../trpc'; -import { ZAddSignersMutationSchema, ZCompleteDocumentWithTokenMutationSchema } from './schema'; +import { + ZAddSignersMutationSchema, + ZAddTemplateSignersMutationSchema, + ZCompleteDocumentWithTokenMutationSchema, +} from './schema'; export const recipientRouter = router({ addSigners: authenticatedProcedure @@ -32,6 +37,31 @@ export const recipientRouter = router({ } }), + addTemplateSigners: authenticatedProcedure + .input(ZAddTemplateSignersMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + const { templateId, signers } = input; + + return await setRecipientsForTemplate({ + userId: ctx.user.id, + templateId, + recipients: signers.map((signer) => ({ + id: signer.nativeId, + email: signer.email, + name: signer.name, + })), + }); + } catch (err) { + console.error(err); + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to sign this field. Please try again later.', + }); + } + }), + completeDocumentWithToken: procedure .input(ZCompleteDocumentWithTokenMutationSchema) .mutation(async ({ input }) => { diff --git a/packages/trpc/server/recipient-router/schema.ts b/packages/trpc/server/recipient-router/schema.ts index ca177a3d5..8920e7672 100644 --- a/packages/trpc/server/recipient-router/schema.ts +++ b/packages/trpc/server/recipient-router/schema.ts @@ -23,6 +23,29 @@ export const ZAddSignersMutationSchema = z export type TAddSignersMutationSchema = z.infer; +export const ZAddTemplateSignersMutationSchema = z + .object({ + templateId: z.number(), + signers: z.array( + z.object({ + nativeId: z.number().optional(), + email: z.string().email().min(1), + name: z.string(), + }), + ), + }) + .refine( + (schema) => { + const emails = schema.signers.map((signer) => signer.email.toLowerCase()); + + return new Set(emails).size === emails.length; + }, + // Dirty hack to handle errors when .root is populated for an array type + { message: 'Signers must have unique emails', path: ['signers__root'] }, + ); + +export type TAddTemplateSignersMutationSchema = z.infer; + export const ZCompleteDocumentWithTokenMutationSchema = z.object({ token: z.string(), documentId: z.number(), diff --git a/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts b/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts index 89c197f5e..780405a0c 100644 --- a/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts +++ b/packages/ui/primitives/template-flow/add-template-placeholder-recipients.types.ts @@ -7,7 +7,7 @@ export const ZAddTemplatePlacholderRecipientsFormSchema = z formId: z.string().min(1), nativeId: z.number().optional(), email: z.string().min(1).email(), - name: z.string().optional(), + name: z.string(), }), ), })