diff --git a/apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx b/apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx index 6d89c7e7b..63ad88a3f 100644 --- a/apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx +++ b/apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx @@ -26,23 +26,29 @@ export type SuperDeleteDocumentDialogProps = { }; export const SuperDeleteDocumentDialog = ({ document }: SuperDeleteDocumentDialogProps) => { - const router = useRouter(); const { toast } = useToast(); + const router = useRouter(); + const [reason, setReason] = useState(''); + const { mutateAsync: deleteDocument, isLoading: isDeletingDocument } = trpc.admin.deleteDocument.useMutation(); const handleDeleteDocument = async () => { try { - if (reason) { - await deleteDocument({ id: document.id, userId: document.userId, reason }); - toast({ - title: 'Document deleted', - description: 'The Document has been deleted successfully.', - duration: 5000, - }); - router.push('/admin/documents'); + if (!reason) { + return; } + + await deleteDocument({ id: document.id, reason }); + + toast({ + title: 'Document deleted', + description: 'The Document has been deleted successfully.', + duration: 5000, + }); + + router.push('/admin/documents'); } catch (err) { if (err instanceof TRPCClientError && err.data?.code === 'BAD_REQUEST') { toast({ diff --git a/packages/email/template-components/template-document-delete.tsx b/packages/email/template-components/template-document-super-delete.tsx similarity index 52% rename from packages/email/template-components/template-document-delete.tsx rename to packages/email/template-components/template-document-super-delete.tsx index b23bddcc8..9cb0a9e71 100644 --- a/packages/email/template-components/template-document-delete.tsx +++ b/packages/email/template-components/template-document-super-delete.tsx @@ -17,14 +17,25 @@ export const TemplateDocumentDelete = ({
- + + Your document has been deleted by an admin! + + + + "{documentName}" has been deleted by an admin. + + + This document can not be recovered, if you would like to dispute the reason for future documents please contact support. -
"{documentName}"
- - Reason -
"{reason}" + + + The reason provided for deletion is the following: + + + + {reason}
diff --git a/packages/email/templates/document-delete.tsx b/packages/email/templates/document-super-delete.tsx similarity index 87% rename from packages/email/templates/document-delete.tsx rename to packages/email/templates/document-super-delete.tsx index 87e6b6e9a..68384e119 100644 --- a/packages/email/templates/document-delete.tsx +++ b/packages/email/templates/document-super-delete.tsx @@ -4,17 +4,17 @@ import { Body, Container, Head, Hr, Html, Img, Preview, Section, Tailwind } from import { TemplateDocumentDelete, type TemplateDocumentDeleteProps, -} from '../template-components/template-document-delete'; +} from '../template-components/template-document-super-delete'; import { TemplateFooter } from '../template-components/template-footer'; export type DocumentDeleteEmailTemplateProps = Partial; -export const DocumentDeleteEmailTemplate = ({ +export const DocumentSuperDeleteEmailTemplate = ({ documentName = 'Open Source Pledge.pdf', assetBaseUrl = 'http://localhost:3002', reason = 'Unknown', }: DocumentDeleteEmailTemplateProps) => { - const previewText = `Admin has deleted your document ${documentName}.`; + const previewText = `An admin has deleted your document "${documentName}".`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -42,6 +42,7 @@ export const DocumentDeleteEmailTemplate = ({ alt="Documenso Logo" className="mb-4 h-6" /> + { +export const superDeleteDocument = async ({ id, requestMetadata }: SuperDeleteDocumentOptions) => { const document = await prisma.document.findUnique({ where: { id, - userId, }, include: { Recipient: true, @@ -85,6 +79,7 @@ export const superDeleteDocument = async ({ }, }), }); + return await tx.document.delete({ where: { id } }); }); }; diff --git a/packages/trpc/server/admin-router/router.ts b/packages/trpc/server/admin-router/router.ts index 459c9a396..b37510be7 100644 --- a/packages/trpc/server/admin-router/router.ts +++ b/packages/trpc/server/admin-router/router.ts @@ -9,6 +9,7 @@ import { superDeleteDocument } from '@documenso/lib/server-only/document/super-d import { upsertSiteSetting } from '@documenso/lib/server-only/site-settings/upsert-site-setting'; import { deleteUser } from '@documenso/lib/server-only/user/delete-user'; import { getUserById } from '@documenso/lib/server-only/user/get-user-by-id'; +import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { adminProcedure, router } from '../trpc'; import { @@ -121,15 +122,21 @@ export const adminRouter = router({ }); } }), + deleteDocument: adminProcedure .input(ZAdminDeleteDocumentMutationSchema) - .mutation(async ({ input }) => { - const { id, userId, reason } = input; + .mutation(async ({ ctx, input }) => { + const { id, reason } = input; try { await sendDeleteEmail({ documentId: id, reason }); - return await superDeleteDocument({ id, userId }); + + return await superDeleteDocument({ + id, + requestMetadata: extractNextApiRequestMetadata(ctx.req), + }); } catch (err) { console.log(err); + throw new TRPCError({ code: 'BAD_REQUEST', message: 'We were unable to delete the specified document. Please try again.', diff --git a/packages/trpc/server/admin-router/schema.ts b/packages/trpc/server/admin-router/schema.ts index 91b0df3c1..6bb567dbd 100644 --- a/packages/trpc/server/admin-router/schema.ts +++ b/packages/trpc/server/admin-router/schema.ts @@ -51,7 +51,6 @@ export type TAdminDeleteUserMutationSchema = z.infer