From 10506173cd5309e7c63d83055243abc67cecad4f Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sat, 11 Jan 2025 18:09:51 +0000 Subject: feat: Add support for singlefile extension uploads. #172 --- packages/trpc/lib/attachments.ts | 5 +++++ packages/trpc/routers/bookmarks.ts | 41 +++++++++++++++++++++++++++++++++----- 2 files changed, 41 insertions(+), 5 deletions(-) (limited to 'packages/trpc') diff --git a/packages/trpc/lib/attachments.ts b/packages/trpc/lib/attachments.ts index 0fd41d1b..f4fda9cd 100644 --- a/packages/trpc/lib/attachments.ts +++ b/packages/trpc/lib/attachments.ts @@ -7,6 +7,7 @@ export function mapDBAssetTypeToUserType(assetType: AssetTypes): ZAssetType { const map: Record> = { [AssetTypes.LINK_SCREENSHOT]: "screenshot", [AssetTypes.LINK_FULL_PAGE_ARCHIVE]: "fullPageArchive", + [AssetTypes.LINK_PRECRAWLED_ARCHIVE]: "precrawledArchive", [AssetTypes.LINK_BANNER_IMAGE]: "bannerImage", [AssetTypes.LINK_VIDEO]: "video", [AssetTypes.BOOKMARK_ASSET]: "bookmarkAsset", @@ -21,6 +22,7 @@ export function mapSchemaAssetTypeToDB( const map: Record = { screenshot: AssetTypes.LINK_SCREENSHOT, fullPageArchive: AssetTypes.LINK_FULL_PAGE_ARCHIVE, + precrawledArchive: AssetTypes.LINK_PRECRAWLED_ARCHIVE, bannerImage: AssetTypes.LINK_BANNER_IMAGE, video: AssetTypes.LINK_VIDEO, bookmarkAsset: AssetTypes.BOOKMARK_ASSET, @@ -33,6 +35,7 @@ export function humanFriendlyNameForAssertType(type: ZAssetType) { const map: Record = { screenshot: "Screenshot", fullPageArchive: "Full Page Archive", + precrawledArchive: "Precrawled Archive", bannerImage: "Banner Image", video: "Video", bookmarkAsset: "Bookmark Asset", @@ -45,6 +48,7 @@ export function isAllowedToAttachAsset(type: ZAssetType) { const map: Record = { screenshot: true, fullPageArchive: false, + precrawledArchive: false, bannerImage: true, video: false, bookmarkAsset: false, @@ -57,6 +61,7 @@ export function isAllowedToDetachAsset(type: ZAssetType) { const map: Record = { screenshot: true, fullPageArchive: true, + precrawledArchive: false, bannerImage: true, video: true, bookmarkAsset: false, diff --git a/packages/trpc/routers/bookmarks.ts b/packages/trpc/routers/bookmarks.ts index 15e4cb7c..026bd322 100644 --- a/packages/trpc/routers/bookmarks.ts +++ b/packages/trpc/routers/bookmarks.ts @@ -22,7 +22,10 @@ import { rssFeedImportsTable, tagsOnBookmarks, } from "@hoarder/db/schema"; -import { deleteAsset } from "@hoarder/shared/assetdb"; +import { + deleteAsset, + SUPPORTED_BOOKMARK_ASSET_TYPES, +} from "@hoarder/shared/assetdb"; import serverConfig from "@hoarder/shared/config"; import { InferenceClientFactory } from "@hoarder/shared/inference"; import { buildSummaryPrompt } from "@hoarder/shared/prompts"; @@ -98,9 +101,6 @@ export const ensureAssetOwnership = async (opts: { }) => { const asset = await opts.ctx.db.query.assets.findFirst({ where: eq(bookmarks.id, opts.assetId), - columns: { - userId: true, - }, }); if (!opts.ctx.user) { throw new TRPCError({ @@ -120,6 +120,7 @@ export const ensureAssetOwnership = async (opts: { message: "User is not allowed to access resource", }); } + return asset; }; async function getBookmark(ctx: AuthedContext, bookmarkId: string) { @@ -307,6 +308,24 @@ export const bookmarksAppRouter = router({ }) .returning() )[0]; + if (input.precrawledArchiveId) { + await ensureAssetOwnership({ + ctx, + assetId: input.precrawledArchiveId, + }); + await tx + .update(assets) + .set({ + bookmarkId: bookmark.id, + assetType: AssetTypes.LINK_PRECRAWLED_ARCHIVE, + }) + .where( + and( + eq(assets.id, input.precrawledArchiveId), + eq(assets.userId, ctx.user.id), + ), + ); + } content = { type: BookmarkTypes.LINK, ...link, @@ -344,7 +363,19 @@ export const bookmarksAppRouter = router({ sourceUrl: null, }) .returning(); - await ensureAssetOwnership({ ctx, assetId: input.assetId }); + const uploadedAsset = await ensureAssetOwnership({ + ctx, + assetId: input.assetId, + }); + if ( + !uploadedAsset.contentType || + !SUPPORTED_BOOKMARK_ASSET_TYPES.has(uploadedAsset.contentType) + ) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Unsupported asset type", + }); + } await tx .update(assets) .set({ -- cgit v1.2.3-70-g09d2