aboutsummaryrefslogtreecommitdiffstats
path: root/packages/trpc
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-01-11 18:09:51 +0000
committerMohamed Bassem <me@mbassem.com>2025-01-11 18:09:51 +0000
commit10506173cd5309e7c63d83055243abc67cecad4f (patch)
treef37f7dd704c63e34a1e5b0bffdda442b03179d9c /packages/trpc
parent107d923b3abd60329463957ca4604107b3427b2c (diff)
downloadkarakeep-10506173cd5309e7c63d83055243abc67cecad4f.tar.zst
feat: Add support for singlefile extension uploads. #172
Diffstat (limited to 'packages/trpc')
-rw-r--r--packages/trpc/lib/attachments.ts5
-rw-r--r--packages/trpc/routers/bookmarks.ts41
2 files changed, 41 insertions, 5 deletions
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, z.infer<typeof zAssetTypesSchema>> = {
[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<ZAssetType, AssetTypes> = {
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<ZAssetType, string> = {
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<ZAssetType, boolean> = {
screenshot: true,
fullPageArchive: false,
+ precrawledArchive: false,
bannerImage: true,
video: false,
bookmarkAsset: false,
@@ -57,6 +61,7 @@ export function isAllowedToDetachAsset(type: ZAssetType) {
const map: Record<ZAssetType, boolean> = {
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({