feat: add envelope audit logs endpoint

This commit is contained in:
Ephraim Atta-Duncan
2025-11-22 01:12:56 +00:00
parent 17c6098638
commit 1a577e55a9
4 changed files with 200 additions and 0 deletions

View File

@ -117,3 +117,121 @@ export const findDocumentAuditLogs = async ({
nextCursor,
} satisfies FindResultResponse<typeof parsedData> & { nextCursor?: string };
};
export interface FindEnvelopeAuditLogsOptions {
userId: number;
teamId: number;
envelopeId: string;
page?: number;
perPage?: number;
orderBy?: {
column: keyof DocumentAuditLog;
direction: 'asc' | 'desc';
};
cursor?: string;
filterForRecentActivity?: boolean;
}
export const findEnvelopeAuditLogs = async ({
userId,
teamId,
envelopeId,
page = 1,
perPage = 30,
orderBy,
cursor,
filterForRecentActivity,
}: FindEnvelopeAuditLogsOptions) => {
const orderByColumn = orderBy?.column ?? 'createdAt';
const orderByDirection = orderBy?.direction ?? 'desc';
// Auto-detect ID type: if it's a numeric string, treat as documentId
const isNumericId = /^\d+$/.test(envelopeId);
const { envelopeWhereInput } = await getEnvelopeWhereInput({
id: isNumericId
? {
type: 'documentId',
id: Number(envelopeId),
}
: {
type: 'envelopeId',
id: envelopeId,
},
type: isNumericId ? EnvelopeType.DOCUMENT : null,
userId,
teamId,
});
const envelope = await prisma.envelope.findUnique({
where: envelopeWhereInput,
});
if (!envelope) {
throw new AppError(AppErrorCode.NOT_FOUND);
}
const whereClause: Prisma.DocumentAuditLogWhereInput = {
envelopeId: envelope.id,
};
// Filter events down to what we consider recent activity.
if (filterForRecentActivity) {
whereClause.OR = [
{
type: {
in: [
DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_COMPLETED,
DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_CREATED,
DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_DELETED,
DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_OPENED,
DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_COMPLETED,
DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_REJECTED,
DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_SENT,
DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_MOVED_TO_TEAM,
],
},
},
{
type: DOCUMENT_AUDIT_LOG_TYPE.EMAIL_SENT,
data: {
path: ['isResending'],
equals: true,
},
},
];
}
const [data, count] = await Promise.all([
prisma.documentAuditLog.findMany({
where: whereClause,
skip: Math.max(page - 1, 0) * perPage,
take: perPage + 1,
orderBy: {
[orderByColumn]: orderByDirection,
},
cursor: cursor ? { id: cursor } : undefined,
}),
prisma.documentAuditLog.count({
where: whereClause,
}),
]);
let nextCursor: string | undefined = undefined;
const parsedData = data.map((auditLog) => parseDocumentAuditLogData(auditLog));
if (parsedData.length > perPage) {
const nextItem = parsedData.pop();
nextCursor = nextItem!.id;
}
return {
data: parsedData,
count,
currentPage: Math.max(page, 1),
perPage,
totalPages: Math.ceil(count / perPage),
nextCursor,
} satisfies FindResultResponse<typeof parsedData> & { nextCursor?: string };
};