From 71a474268e6381f8630f6d906471c830342dc50f Mon Sep 17 00:00:00 2001 From: omnitrix Date: Wed, 16 Apr 2025 16:18:04 +0200 Subject: feat(web): Add support for merging lists (#1231) * feat: Support list merging * some fixes * move @hoarder to @karakeep --------- Co-authored-by: Mohamed Bassem --- packages/trpc/models/lists.ts | 46 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'packages/trpc/models') diff --git a/packages/trpc/models/lists.ts b/packages/trpc/models/lists.ts index a6b1720c..8072060f 100644 --- a/packages/trpc/models/lists.ts +++ b/packages/trpc/models/lists.ts @@ -145,6 +145,10 @@ export abstract class List implements PrivacyAware { abstract getSize(ctx: AuthedContext): Promise; abstract addBookmark(bookmarkId: string): Promise; abstract removeBookmark(bookmarkId: string): Promise; + abstract mergeInto( + targetList: List, + deleteSourceAfterMerge: boolean, + ): Promise; } export class SmartList extends List { @@ -200,6 +204,16 @@ export class SmartList extends List { message: "Smart lists cannot be removed from", }); } + + mergeInto( + _targetList: List, + _deleteSourceAfterMerge: boolean, + ): Promise { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Smart lists cannot be merged", + }); + } } export class ManualList extends List { @@ -276,4 +290,36 @@ export class ManualList extends List { } return super.update(input); } + + async mergeInto( + targetList: List, + deleteSourceAfterMerge: boolean, + ): Promise { + if (targetList.type !== "manual") { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "You can only merge into a manual list", + }); + } + + const bookmarkIds = await this.getBookmarkIds(); + + await this.ctx.db.transaction(async (tx) => { + await tx + .insert(bookmarksInLists) + .values( + bookmarkIds.map((id) => ({ + bookmarkId: id, + listId: targetList.list.id, + })), + ) + .onConflictDoNothing(); + + if (deleteSourceAfterMerge) { + await tx + .delete(bookmarkLists) + .where(eq(bookmarkLists.id, this.list.id)); + } + }); + } } -- cgit v1.2.3-70-g09d2