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