mirror of
https://github.com/documenso/documenso.git
synced 2025-11-13 16:23:06 +10:00
This change actually makes the authoring flow work for the most part by tying in emailing and more. We have also done a number of quality of life updates to simplify the codebase overall making it easier to continue work on the refresh.
95 lines
2.3 KiB
TypeScript
95 lines
2.3 KiB
TypeScript
import { createElement } from 'react';
|
|
|
|
import { mailer } from '@documenso/email/mailer';
|
|
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';
|
|
|
|
export interface SendDocumentOptions {
|
|
documentId: number;
|
|
userId: number;
|
|
}
|
|
|
|
export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) => {
|
|
const user = await prisma.user.findFirstOrThrow({
|
|
where: {
|
|
id: userId,
|
|
},
|
|
});
|
|
|
|
const document = await prisma.document.findUnique({
|
|
where: {
|
|
id: documentId,
|
|
userId,
|
|
},
|
|
include: {
|
|
Recipient: true,
|
|
},
|
|
});
|
|
|
|
if (!document) {
|
|
throw new Error('Document not found');
|
|
}
|
|
|
|
if (document.Recipient.length === 0) {
|
|
throw new Error('Document has no recipients');
|
|
}
|
|
|
|
if (document.status === DocumentStatus.COMPLETED) {
|
|
throw new Error('Can not send completed document');
|
|
}
|
|
|
|
await Promise.all([
|
|
document.Recipient.map(async (recipient) => {
|
|
const { email, name } = recipient;
|
|
|
|
if (recipient.sendStatus === SendStatus.SENT) {
|
|
return;
|
|
}
|
|
|
|
const template = createElement(DocumentInviteEmailTemplate, {
|
|
documentName: document.title,
|
|
assetBaseUrl: process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000',
|
|
inviterName: user.name || undefined,
|
|
inviterEmail: user.email,
|
|
signDocumentLink: 'https://example.com',
|
|
});
|
|
|
|
mailer.sendMail({
|
|
to: {
|
|
address: email,
|
|
name,
|
|
},
|
|
from: {
|
|
name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso',
|
|
address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com',
|
|
},
|
|
subject: 'Please sign this document',
|
|
html: render(template),
|
|
text: render(template, { plainText: true }),
|
|
});
|
|
|
|
await prisma.recipient.update({
|
|
where: {
|
|
id: recipient.id,
|
|
},
|
|
data: {
|
|
sendStatus: SendStatus.SENT,
|
|
},
|
|
});
|
|
}),
|
|
]);
|
|
|
|
const updatedDocument = await prisma.document.update({
|
|
where: {
|
|
id: documentId,
|
|
},
|
|
data: {
|
|
status: DocumentStatus.PENDING,
|
|
},
|
|
});
|
|
|
|
return updatedDocument;
|
|
};
|