diff options
| author | Mohamed Bassem <me@mbassem.com> | 2025-11-02 20:48:17 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-02 20:48:17 +0000 |
| commit | 5358682a8cfbd12d93a4e9962f7a9f0440c42c19 (patch) | |
| tree | 0b642ca49fa047177cd1280845cf86a0a7fe32b3 /apps/workers | |
| parent | 633686b58c13fc9be9fa1354ae53cab222d37546 (diff) | |
| download | karakeep-5358682a8cfbd12d93a4e9962f7a9f0440c42c19.tar.zst | |
feat(rss): Add import tags from RSS feed categories (#2031)
* feat(feeds): Add import tags from RSS feed categories
- Add importTags boolean field to rssFeedsTable schema (default: false)
- Create database migration 0063_add_import_tags_to_feeds.sql
- Update zod schemas (zFeedSchema, zNewFeedSchema, zUpdateFeedSchema) to include importTags
- Update Feed model to handle importTags in create and update methods
- Update feedWorker to:
- Read title and categories from RSS parser
- Attach categories as tags to bookmarks when importTags is enabled
- Log warnings if tag attachment fails
Resolves #1996
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
* feat(web): Add importTags option to feed settings UI
- Add importTags toggle to FeedsEditorDialog (create feed)
- Add importTags toggle to EditFeedDialog (edit feed)
- Display as a bordered switch control with descriptive text
- Defaults to false for new feeds
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
* fix migration
* remove extra migration
---------
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: Mohamed Bassem <MohamedBassem@users.noreply.github.com>
Diffstat (limited to 'apps/workers')
| -rw-r--r-- | apps/workers/workers/feedWorker.ts | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/apps/workers/workers/feedWorker.ts b/apps/workers/workers/feedWorker.ts index f86e7424..0dfc5399 100644 --- a/apps/workers/workers/feedWorker.ts +++ b/apps/workers/workers/feedWorker.ts @@ -154,6 +154,8 @@ async function run(req: DequeuedJob<ZFeedRequestSchema>) { id: z.coerce.string(), link: z.string().optional(), guid: z.string().optional(), + title: z.string().optional(), + categories: z.array(z.string()).optional(), }); const feedItems = unparseFeedData.items @@ -209,11 +211,38 @@ async function run(req: DequeuedJob<ZFeedRequestSchema>) { trpcClient.bookmarks.createBookmark({ type: BookmarkTypes.LINK, url: item.link!, + title: item.title, source: "rss", }), ), ); + // If importTags is enabled, attach categories as tags to the created bookmarks + if (feed.importTags) { + await Promise.allSettled( + newEntries.map(async (item, idx) => { + const bookmark = createdBookmarks[idx]; + if ( + bookmark.status === "fulfilled" && + item.categories && + item.categories.length > 0 + ) { + try { + await trpcClient.bookmarks.updateTags({ + bookmarkId: bookmark.value.id, + attach: item.categories.map((tagName) => ({ tagName })), + detach: [], + }); + } catch (error) { + logger.warn( + `[feed][${jobId}] Failed to attach tags to bookmark ${bookmark.value.id}: ${error}`, + ); + } + } + }), + ); + } + // It's ok if this is not transactional as the bookmarks will get linked in the next iteration. await db .insert(rssFeedImportsTable) |
