Files
documenso/packages/lib/server-only/template/get-template-by-direct-link-token.ts
2025-11-07 14:17:52 +11:00

96 lines
2.6 KiB
TypeScript

import { EnvelopeType } from '@prisma/client';
import { prisma } from '@documenso/prisma';
import { AppError, AppErrorCode } from '../../errors/app-error';
import { mapSecondaryIdToTemplateId } from '../../utils/envelope';
export interface GetTemplateByDirectLinkTokenOptions {
token: string;
}
export const getTemplateByDirectLinkToken = async ({
token,
}: GetTemplateByDirectLinkTokenOptions) => {
const envelope = await prisma.envelope.findFirst({
where: {
type: EnvelopeType.TEMPLATE,
directLink: {
token,
enabled: true,
},
},
include: {
directLink: true,
recipients: {
include: {
fields: true,
},
},
envelopeItems: {
include: {
documentData: true,
},
},
documentMeta: true,
},
});
const directLink = envelope?.directLink;
const firstDocumentData = envelope?.envelopeItems[0]?.documentData;
// Doing this to enforce type safety for directLink.
if (!directLink || !firstDocumentData) {
throw new AppError(AppErrorCode.NOT_FOUND);
}
const recipientsWithMappedFields = envelope.recipients.map((recipient) => ({
...recipient,
templateId: mapSecondaryIdToTemplateId(envelope.secondaryId),
documentId: null,
fields: recipient.fields.map((field) => ({
...field,
templateId: mapSecondaryIdToTemplateId(envelope.secondaryId),
documentId: null,
})),
}));
// Backwards compatibility mapping.
return {
id: mapSecondaryIdToTemplateId(envelope.secondaryId),
envelopeId: envelope.id,
type: envelope.templateType,
visibility: envelope.visibility,
externalId: envelope.externalId,
title: envelope.title,
userId: envelope.userId,
teamId: envelope.teamId,
authOptions: envelope.authOptions,
createdAt: envelope.createdAt,
updatedAt: envelope.updatedAt,
publicTitle: envelope.publicTitle,
publicDescription: envelope.publicDescription,
folderId: envelope.folderId,
templateDocumentDataId: firstDocumentData.id,
templateDocumentData: {
...firstDocumentData,
envelopeItemId: envelope.envelopeItems[0].id,
},
directLink: {
...directLink,
templateId: mapSecondaryIdToTemplateId(envelope.secondaryId),
},
templateMeta: {
...envelope.documentMeta,
templateId: mapSecondaryIdToTemplateId(envelope.secondaryId),
},
recipients: recipientsWithMappedFields,
fields: recipientsWithMappedFields.flatMap((recipient) => recipient.fields),
envelopeItems: envelope.envelopeItems.map((item) => ({
id: item.id,
envelopeId: item.envelopeId,
})),
};
};