diff --git a/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx b/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx index 8429870b0..d04b3a998 100644 --- a/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx +++ b/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx @@ -6,6 +6,7 @@ import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; import type { Recipient } from '@documenso/prisma/client'; +import { cn } from '@documenso/ui/lib/utils'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { StackAvatar } from './stack-avatar'; @@ -19,6 +20,10 @@ export function AvatarWithRecipient({ recipient }: AvatarWithRecipientProps) { const { toast } = useToast(); const onRecipientClick = () => { + if (!recipient.token) { + return; + } + void copy(`${process.env.NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`).then(() => { toast({ title: 'Copied to clipboard', @@ -28,19 +33,22 @@ export function AvatarWithRecipient({ recipient }: AvatarWithRecipientProps) { }; return ( -
+
- - {recipient.email} - + + {recipient.email}
); } diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 18600ebe6..def85f2d4 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -7,6 +7,7 @@ import { SigningStatus } from '@documenso/prisma/client'; import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status'; import type { FindResultSet } from '../../types/find-result-set'; +import { maskRecipientTokensForDocument } from '../../utils/mask-recipient-tokens-for-document'; export type FindDocumentsOptions = { userId: number; @@ -173,8 +174,15 @@ export const findDocuments = async ({ }), ]); + const maskedData = data.map((document) => + maskRecipientTokensForDocument({ + document, + user, + }), + ); + return { - data, + data: maskedData, count, currentPage: Math.max(page, 1), perPage, diff --git a/packages/lib/server-only/document/update-document.ts b/packages/lib/server-only/document/update-document.ts index 5ad686860..29ab2c998 100644 --- a/packages/lib/server-only/document/update-document.ts +++ b/packages/lib/server-only/document/update-document.ts @@ -5,14 +5,16 @@ import type { Prisma } from '@prisma/client'; import { prisma } from '@documenso/prisma'; export type UpdateDocumentOptions = { - documentId: number; data: Prisma.DocumentUpdateInput; + userId: number; + documentId: number; }; -export const updateDocument = async ({ documentId, data }: UpdateDocumentOptions) => { +export const updateDocument = async ({ documentId, userId, data }: UpdateDocumentOptions) => { return await prisma.document.update({ where: { id: documentId, + userId, }, data: { ...data, diff --git a/packages/lib/utils/mask-recipient-tokens-for-document.ts b/packages/lib/utils/mask-recipient-tokens-for-document.ts new file mode 100644 index 000000000..ed6e2b13e --- /dev/null +++ b/packages/lib/utils/mask-recipient-tokens-for-document.ts @@ -0,0 +1,38 @@ +import type { User } from '@documenso/prisma/client'; +import type { DocumentWithRecipients } from '@documenso/prisma/types/document-with-recipient'; + +export type MaskRecipientTokensForDocumentOptions = { + document: T; + user?: User; + token?: string; +}; + +export const maskRecipientTokensForDocument = ({ + document, + user, + token, +}: MaskRecipientTokensForDocumentOptions) => { + const maskedRecipients = document.Recipient.map((recipient) => { + if (document.userId === user?.id) { + return recipient; + } + + if (recipient.email === user?.email) { + return recipient; + } + + if (recipient.token === token) { + return recipient; + } + + return { + ...recipient, + token: '', + }; + }); + + return { + ...document, + Recipient: maskedRecipients, + }; +}; diff --git a/packages/prisma/seed/initial-seed.ts b/packages/prisma/seed/initial-seed.ts index b01c2d434..6409c5bd9 100644 --- a/packages/prisma/seed/initial-seed.ts +++ b/packages/prisma/seed/initial-seed.ts @@ -18,6 +18,7 @@ export const seedDatabase = async () => { create: { name: 'Example User', email: 'example@documenso.com', + emailVerified: new Date(), password: hashSync('password'), roles: [Role.USER], }, @@ -31,6 +32,7 @@ export const seedDatabase = async () => { create: { name: 'Admin User', email: 'admin@documenso.com', + emailVerified: new Date(), password: hashSync('password'), roles: [Role.USER, Role.ADMIN], },