From 1fe7f78479afb8181f34c84b9feecc2e492efd86 Mon Sep 17 00:00:00 2001 From: Catalin Pit Date: Thu, 20 Nov 2025 12:07:15 +0200 Subject: [PATCH] feat: implement get envelopes by IDs route with validation schemas --- .../envelope-router/get-envelopes-by-ids.ts | 93 +++++++++++++++++++ .../get-envelopes-by-ids.types.ts | 24 +++++ 2 files changed, 117 insertions(+) create mode 100644 packages/trpc/server/envelope-router/get-envelopes-by-ids.ts create mode 100644 packages/trpc/server/envelope-router/get-envelopes-by-ids.types.ts diff --git a/packages/trpc/server/envelope-router/get-envelopes-by-ids.ts b/packages/trpc/server/envelope-router/get-envelopes-by-ids.ts new file mode 100644 index 000000000..4001ddb72 --- /dev/null +++ b/packages/trpc/server/envelope-router/get-envelopes-by-ids.ts @@ -0,0 +1,93 @@ +import { getEnvelopeWhereInput } from '@documenso/lib/server-only/envelope/get-envelope-by-id'; +import { prisma } from '@documenso/prisma'; + +import { authenticatedProcedure } from '../trpc'; +import { + ZGetEnvelopesByIdsRequestSchema, + ZGetEnvelopesByIdsResponseSchema, + getEnvelopesByIdsMeta, +} from './get-envelopes-by-ids.types'; + +export const getEnvelopesByIdsRoute = authenticatedProcedure + .meta(getEnvelopesByIdsMeta) + .input(ZGetEnvelopesByIdsRequestSchema) + .output(ZGetEnvelopesByIdsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId, user } = ctx; + const { envelopeIds } = input; + + ctx.logger.info({ + input: { + envelopeIds, + }, + }); + + const { envelopeWhereInput } = await getEnvelopeWhereInput({ + id: { + type: 'envelopeId', + id: envelopeIds[0], + }, + userId: user.id, + teamId, + type: null, + }); + + const envelopeOrInput = envelopeWhereInput.OR!; + + const envelopes = await prisma.envelope.findMany({ + where: { + id: { + in: envelopeIds, + }, + OR: envelopeOrInput, + }, + include: { + envelopeItems: { + include: { + documentData: true, + }, + orderBy: { + order: 'asc', + }, + }, + folder: true, + documentMeta: true, + user: { + select: { + id: true, + name: true, + email: true, + }, + }, + recipients: { + orderBy: { + id: 'asc', + }, + }, + fields: true, + team: { + select: { + id: true, + url: true, + }, + }, + directLink: { + select: { + directTemplateRecipientId: true, + enabled: true, + id: true, + token: true, + }, + }, + }, + }); + + return envelopes.map((envelope) => ({ + ...envelope, + user: { + id: envelope.user.id, + name: envelope.user.name || '', + email: envelope.user.email, + }, + })); + }); diff --git a/packages/trpc/server/envelope-router/get-envelopes-by-ids.types.ts b/packages/trpc/server/envelope-router/get-envelopes-by-ids.types.ts new file mode 100644 index 000000000..f48199225 --- /dev/null +++ b/packages/trpc/server/envelope-router/get-envelopes-by-ids.types.ts @@ -0,0 +1,24 @@ +import { z } from 'zod'; + +import { ZEnvelopeSchema } from '@documenso/lib/types/envelope'; + +import type { TrpcRouteMeta } from '../trpc'; + +export const getEnvelopesByIdsMeta: TrpcRouteMeta = { + openapi: { + method: 'POST', + path: '/envelope/get-many', + summary: 'Get multiple envelopes', + description: 'Retrieve multiple envelopes by their IDs', + tags: ['Envelope'], + }, +}; + +export const ZGetEnvelopesByIdsRequestSchema = z.object({ + envelopeIds: z.array(z.string()).min(1), +}); + +export const ZGetEnvelopesByIdsResponseSchema = z.array(ZEnvelopeSchema); + +export type TGetEnvelopesByIdsRequest = z.infer; +export type TGetEnvelopesByIdsResponse = z.infer;