import { prisma } from '@documenso/prisma'; import { SigningStatus, User } from '@documenso/prisma/client'; import { isExtendedDocumentStatus } from '@documenso/prisma/guards/is-extended-document-status'; import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status'; export type GetStatsInput = { user: User; }; export const getStats = async ({ user }: GetStatsInput) => { const [ownerCounts, notSignedCounts, hasSignedCounts] = await Promise.all([ prisma.document.groupBy({ by: ['status'], _count: { _all: true, }, where: { userId: user.id, }, }), prisma.document.groupBy({ by: ['status'], _count: { _all: true, }, where: { status: ExtendedDocumentStatus.PENDING, Recipient: { some: { email: user.email, signingStatus: SigningStatus.NOT_SIGNED, }, }, }, }), prisma.document.groupBy({ by: ['status'], _count: { _all: true, }, where: { status: { not: ExtendedDocumentStatus.DRAFT, }, Recipient: { some: { email: user.email, signingStatus: SigningStatus.SIGNED, }, }, }, }), ]); const stats: Record = { [ExtendedDocumentStatus.DRAFT]: 0, [ExtendedDocumentStatus.PENDING]: 0, [ExtendedDocumentStatus.COMPLETED]: 0, [ExtendedDocumentStatus.INBOX]: 0, [ExtendedDocumentStatus.ALL]: 0, }; ownerCounts.forEach((stat) => { stats[stat.status] = stat._count._all; }); notSignedCounts.forEach((stat) => { stats[ExtendedDocumentStatus.INBOX] += stat._count._all; }); hasSignedCounts.forEach((stat) => { if (stat.status === ExtendedDocumentStatus.COMPLETED) { stats[ExtendedDocumentStatus.COMPLETED] += stat._count._all; } if (stat.status === ExtendedDocumentStatus.PENDING) { stats[ExtendedDocumentStatus.PENDING] += stat._count._all; } }); Object.keys(stats).forEach((key) => { if (key !== ExtendedDocumentStatus.ALL && isExtendedDocumentStatus(key)) { stats[ExtendedDocumentStatus.ALL] += stats[key]; } }); return stats; };