mirror of
https://github.com/documenso/documenso.git
synced 2025-11-16 01:32:06 +10:00
feat: expiry links
This commit is contained in:
@ -15,6 +15,38 @@ export const isDocumentCompleted = (document: Pick<Document, 'status'> | Documen
|
||||
return status === DocumentStatus.COMPLETED || status === DocumentStatus.REJECTED;
|
||||
};
|
||||
|
||||
const getExpiryAmount = (
|
||||
meta: Partial<DocumentMeta | TemplateMeta> | undefined | null,
|
||||
): number | null => {
|
||||
if (!meta) return null;
|
||||
|
||||
if ('expiryAmount' in meta && meta.expiryAmount !== undefined) {
|
||||
return meta.expiryAmount;
|
||||
}
|
||||
|
||||
if ('defaultExpiryAmount' in meta && meta.defaultExpiryAmount !== undefined) {
|
||||
return meta.defaultExpiryAmount;
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
const getExpiryUnit = (
|
||||
meta: Partial<DocumentMeta | TemplateMeta> | undefined | null,
|
||||
): string | null => {
|
||||
if (!meta) return null;
|
||||
|
||||
if ('expiryUnit' in meta && meta.expiryUnit !== undefined) {
|
||||
return meta.expiryUnit;
|
||||
}
|
||||
|
||||
if ('defaultExpiryUnit' in meta && meta.defaultExpiryUnit !== undefined) {
|
||||
return meta.defaultExpiryUnit;
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Extracts the derived document meta which should be used when creating a document
|
||||
* from scratch, or from a template.
|
||||
@ -58,5 +90,9 @@ export const extractDerivedDocumentMeta = (
|
||||
emailReplyTo: meta.emailReplyTo ?? settings.emailReplyTo,
|
||||
emailSettings:
|
||||
meta.emailSettings || settings.emailDocumentSettings || DEFAULT_DOCUMENT_EMAIL_SETTINGS,
|
||||
|
||||
// Expiry settings.
|
||||
expiryAmount: getExpiryAmount(meta),
|
||||
expiryUnit: getExpiryUnit(meta),
|
||||
} satisfies Omit<DocumentMeta, 'id' | 'documentId'>;
|
||||
};
|
||||
|
||||
50
packages/lib/utils/expiry.ts
Normal file
50
packages/lib/utils/expiry.ts
Normal file
@ -0,0 +1,50 @@
|
||||
import type { Recipient } from '@prisma/client';
|
||||
import { DateTime } from 'luxon';
|
||||
|
||||
export const calculateRecipientExpiry = (
|
||||
documentExpiryAmount?: number | null,
|
||||
documentExpiryUnit?: string | null,
|
||||
fromDate: Date = new Date(),
|
||||
): Date | null => {
|
||||
if (!documentExpiryAmount || !documentExpiryUnit) {
|
||||
return null;
|
||||
}
|
||||
|
||||
switch (documentExpiryUnit) {
|
||||
case 'minutes':
|
||||
return DateTime.fromJSDate(fromDate).plus({ minutes: documentExpiryAmount }).toJSDate();
|
||||
case 'hours':
|
||||
return DateTime.fromJSDate(fromDate).plus({ hours: documentExpiryAmount }).toJSDate();
|
||||
case 'days':
|
||||
return DateTime.fromJSDate(fromDate).plus({ days: documentExpiryAmount }).toJSDate();
|
||||
case 'weeks':
|
||||
return DateTime.fromJSDate(fromDate).plus({ weeks: documentExpiryAmount }).toJSDate();
|
||||
case 'months':
|
||||
return DateTime.fromJSDate(fromDate).plus({ months: documentExpiryAmount }).toJSDate();
|
||||
default:
|
||||
return DateTime.fromJSDate(fromDate).plus({ days: documentExpiryAmount }).toJSDate();
|
||||
}
|
||||
};
|
||||
|
||||
export const isRecipientExpired = (recipient: Recipient): boolean => {
|
||||
if (!recipient.expired) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return DateTime.now() > DateTime.fromJSDate(recipient.expired);
|
||||
};
|
||||
|
||||
export const isValidExpirySettings = (
|
||||
expiryAmount?: number | null,
|
||||
expiryUnit?: string | null,
|
||||
): boolean => {
|
||||
if (!expiryAmount || !expiryUnit) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return expiryAmount > 0 && ['minutes', 'hours', 'days', 'weeks', 'months'].includes(expiryUnit);
|
||||
};
|
||||
|
||||
export const formatExpiryDate = (date: Date): string => {
|
||||
return DateTime.fromJSDate(date).toFormat('MMM dd, yyyy HH:mm');
|
||||
};
|
||||
Reference in New Issue
Block a user