From 38f477bb5afc023c952db34a40f1f588ec782a94 Mon Sep 17 00:00:00 2001 From: Henry <30578846+hjball@users.noreply.github.com> Date: Fri, 5 Dec 2025 22:04:53 +0000 Subject: [PATCH] fix: delete attachment from s3 (#272) --- packages/api/src/routers/attachment.ts | 14 +++++++++++++- packages/api/src/utils/s3.ts | 11 +++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/api/src/routers/attachment.ts b/packages/api/src/routers/attachment.ts index df99938f..0d4586ae 100644 --- a/packages/api/src/routers/attachment.ts +++ b/packages/api/src/routers/attachment.ts @@ -9,7 +9,7 @@ import { generateUID } from "@kan/shared/utils"; import { createTRPCRouter, protectedProcedure } from "../trpc"; import { assertUserInWorkspace } from "../utils/auth"; -import { generateUploadUrl } from "../utils/s3"; +import { deleteObject, generateUploadUrl } from "../utils/s3"; export const attachmentRouter = createTRPCRouter({ generateUploadUrl: protectedProcedure @@ -189,6 +189,18 @@ export const attachmentRouter = createTRPCRouter({ await assertUserInWorkspace(ctx.db, userId, workspaceId); + const bucket = process.env.NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME; + if (bucket) { + try { + await deleteObject(bucket, attachment.s3Key); + } catch (error) { + console.error( + `Failed to delete attachment from S3: ${attachment.s3Key}`, + error, + ); + } + } + await cardAttachmentRepo.softDelete(ctx.db, { attachmentId: attachment.id, deletedAt: new Date(), diff --git a/packages/api/src/utils/s3.ts b/packages/api/src/utils/s3.ts index 8b5bdcbc..8d78d55c 100644 --- a/packages/api/src/utils/s3.ts +++ b/packages/api/src/utils/s3.ts @@ -1,4 +1,5 @@ import { + DeleteObjectCommand, GetObjectCommand, PutObjectCommand, S3Client, @@ -56,3 +57,13 @@ export async function generateDownloadUrl( { expiresIn }, ); } + +export async function deleteObject(bucket: string, key: string) { + const client = createS3Client(); + await client.send( + new DeleteObjectCommand({ + Bucket: bucket, + Key: key, + }), + ); +}