From 31960fcd11daa2dfaf8ae409c80b572c9b22940f Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sat, 8 Nov 2025 15:22:14 +0000 Subject: feat: Add support for user uploaded files (#2100) * feat: add user file upload support for bookmarks Add a new "user-uploaded" asset type that allows users to upload and attach their own files to bookmarks from the attachment box in the bookmark preview page. Changes: - Add USER_UPLOADED asset type to database schema - Add userUploaded to zAssetTypesSchema for type safety - Update attachment permissions to allow attaching/detaching user files - Add fileName field to asset schema for displaying custom filenames - Add "Upload File" button in AttachmentBox component - Display actual filename for user-uploaded files - Allow any file type for user uploads (respects existing upload limits) - Add Upload icon for user-uploaded files Fixes #1863 related asset attachment improvements * fix: ensure fileName is returned and remove edit button for user uploads - Fix attachAsset mutation to fetch and return complete asset with fileName instead of just returning the input (which lacks fileName) - Remove replace/edit button for user-uploaded files - users can only delete and re-upload instead - This ensures the filename displays correctly in the UI immediately after upload Fixes fileName propagation issue for user-uploaded assets * fix asset file name * remove filename from attach asset api --------- Co-authored-by: Claude --- packages/trpc/routers/assets.ts | 17 +++++++++++++---- packages/trpc/routers/bookmarks.ts | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) (limited to 'packages/trpc/routers') diff --git a/packages/trpc/routers/assets.ts b/packages/trpc/routers/assets.ts index af508a4e..7be85446 100644 --- a/packages/trpc/routers/assets.ts +++ b/packages/trpc/routers/assets.ts @@ -99,7 +99,10 @@ export const assetsAppRouter = router({ .input( z.object({ bookmarkId: z.string(), - asset: zAssetSchema, + asset: z.object({ + id: z.string(), + assetType: zAssetTypesSchema, + }), }), ) .output(zAssetSchema) @@ -112,7 +115,7 @@ export const assetsAppRouter = router({ message: "You can't attach this type of asset", }); } - await ctx.db + const [updatedAsset] = await ctx.db .update(assets) .set({ assetType: mapSchemaAssetTypeToDB(input.asset.assetType), @@ -120,8 +123,14 @@ export const assetsAppRouter = router({ }) .where( and(eq(assets.id, input.asset.id), eq(assets.userId, ctx.user.id)), - ); - return input.asset; + ) + .returning(); + + return { + id: updatedAsset.id, + assetType: mapDBAssetTypeToUserType(updatedAsset.assetType), + fileName: updatedAsset.fileName, + }; }), replaceAsset: authedProcedure .input( diff --git a/packages/trpc/routers/bookmarks.ts b/packages/trpc/routers/bookmarks.ts index 5a2fc1eb..72c6c1d1 100644 --- a/packages/trpc/routers/bookmarks.ts +++ b/packages/trpc/routers/bookmarks.ts @@ -253,6 +253,7 @@ async function toZodSchema( assets: assets.map((a) => ({ id: a.id, assetType: mapDBAssetTypeToUserType(a.assetType), + fileName: a.fileName, })), ...rest, }; -- cgit v1.2.3-70-g09d2