Merge pull request #14 from ElTimuro/doc-106

Doc-106
This commit is contained in:
Timur Ercan
2023-02-21 13:14:58 +01:00
committed by GitHub
2 changed files with 82 additions and 84 deletions

View File

@ -13,12 +13,13 @@ import { insertImageInPDF, insertTextInPDF } from "@documenso/pdf";
async function postHandler(req: NextApiRequest, res: NextApiResponse) { async function postHandler(req: NextApiRequest, res: NextApiResponse) {
const existingUser = await getUserFromToken(req, res); const existingUser = await getUserFromToken(req, res);
const { token: recipientToken } = req.query; const { token: recipientToken } = req.query;
const { signatures: signatures }: { signatures: any[] } = req.body; const { signatures: signaturesFromBody }: { signatures: any[] } = req.body;
if (!recipientToken) { if (!recipientToken) {
return res.status(401).send("Missing recipient token."); return res.status(401).send("Missing recipient token.");
} }
// The recipient who received the signing request
const recipient = await prisma.recipient.findFirstOrThrow({ const recipient = await prisma.recipient.findFirstOrThrow({
where: { token: recipientToken?.toString() }, where: { token: recipientToken?.toString() },
}); });
@ -34,29 +35,25 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) {
); );
if (!document) res.status(404).end(`No document found.`); if (!document) res.status(404).end(`No document found.`);
// todo insert if not exits
signatures.forEach(async (signature) => {
if (!signature.signatureImage && !signature.typedSignature)
throw new Error("Cant't save invalid signature.");
await prisma.signature.upsert({ // todo rename .document to documentImageAsBase64 or sth. like that
where: { let documentWithSignatureImages = document.document;
fieldId: signature.fieldId, for (const signature of signaturesFromBody) {
}, if (!signature.signatureImage && !signature.typedSignature) {
update: {}, documentWithSignatureImages = document.document;
create: { throw new Error("Cant't save invalid signature.");
recipientId: recipient.id, }
fieldId: signature.fieldId,
signatureImageAsBase64: signature.signatureImage await saveSignature(signature);
? signature.signatureImage
: null, const signedField = await prisma.field.findFirstOrThrow({
typedSignature: signature.typedSignature where: { id: signature.fieldId },
? signature.typedSignature include: { Signature: true },
: null,
},
});
}); });
await insertSignatureInDocument(signedField);
}
await prisma.recipient.update({ await prisma.recipient.update({
where: { where: {
id: recipient.id, id: recipient.id,
@ -73,23 +70,23 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) {
}, },
}); });
console.log("unsignedRecipients.length.." + unsignedRecipients.length); await prisma.document.update({
if (unsignedRecipients.length === 0) { where: {
// todo if everybody signed insert images and create signature id: recipient.documentId,
const signedFields = await prisma.field.findMany({ },
where: { documentId: document.id }, data: {
include: { Signature: true }, document: documentWithSignatureImages,
status:
unsignedRecipients.length > 0
? DocumentStatus.PENDING
: DocumentStatus.COMPLETED,
},
}); });
// todo rename .document to documentImageAsBase64 or sth. like that
let documentWithSignatureImages = document.document;
let signaturesInserted = 0;
signedFields.forEach(async (signedField) => {
if (!signedField.Signature) {
documentWithSignatureImages = document.document;
throw new Error("Invalid Signature in Field");
}
if (signedField.Signature.signatureImageAsBase64) { return res.status(200).end();
async function insertSignatureInDocument(signedField: any) {
if (signedField?.Signature?.signatureImageAsBase64) {
documentWithSignatureImages = await insertImageInPDF( documentWithSignatureImages = await insertImageInPDF(
documentWithSignatureImages, documentWithSignatureImages,
signedField.Signature signedField.Signature
@ -99,8 +96,7 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) {
signedField.positionY, signedField.positionY,
signedField.page signedField.page
); );
} else if (signedField.Signature.typedSignature) { } else if (signedField?.Signature?.typedSignature) {
console.log("inserting text");
documentWithSignatureImages = await insertTextInPDF( documentWithSignatureImages = await insertTextInPDF(
documentWithSignatureImages, documentWithSignatureImages,
signedField.Signature.typedSignature, signedField.Signature.typedSignature,
@ -112,24 +108,26 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) {
documentWithSignatureImages = document.document; documentWithSignatureImages = document.document;
throw new Error("Invalid signature could not be inserted."); throw new Error("Invalid signature could not be inserted.");
} }
}
signaturesInserted++; async function saveSignature(signature: any) {
if (signaturesInserted == signedFields.length) { await prisma.signature.upsert({
await prisma.document.update({
where: { where: {
id: recipient.documentId, fieldId: signature.fieldId,
}, },
data: { update: {},
status: DocumentStatus.COMPLETED, create: {
document: documentWithSignatureImages, recipientId: recipient.id,
fieldId: signature.fieldId,
signatureImageAsBase64: signature.signatureImage
? signature.signatureImage
: null,
typedSignature: signature.typedSignature
? signature.typedSignature
: null,
}, },
}); });
} }
// todo send notifications
});
}
return res.status(200).end();
} }
export default defaultHandler({ export default defaultHandler({

View File

@ -64,14 +64,6 @@ const RecipientsPage: NextPageWithLayout = (props: any) => {
</h2> </h2>
</div> </div>
<div className="mt-4 flex flex-shrink-0 md:mt-0 md:ml-4"> <div className="mt-4 flex flex-shrink-0 md:mt-0 md:ml-4">
<Button
icon={ArrowDownTrayIcon}
color="secondary"
className="mr-2"
href={"/api/documents/" + props.document.id}
>
Download
</Button>
<Button <Button
icon={PencilSquareIcon} icon={PencilSquareIcon}
color="secondary" color="secondary"
@ -80,6 +72,14 @@ const RecipientsPage: NextPageWithLayout = (props: any) => {
> >
Edit Document Edit Document
</Button> </Button>
<Button
icon={ArrowDownTrayIcon}
color="secondary"
className="mr-2"
href={"/api/documents/" + props.document.id}
>
Download
</Button>
<Button <Button
className="min-w-[125px]" className="min-w-[125px]"
color="primary" color="primary"