From 13427b9f70667bd427bab9e0427086046d119fd6 Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Tue, 22 Aug 2023 09:42:55 -0700 Subject: [PATCH 1/2] Add RSS feeds config page --- client/components/app/ConfigSideNav.vue | 5 + .../modals/rssfeed/ViewFeedModal.vue | 128 +++++++++++++ client/pages/config.vue | 1 + client/pages/config/rss-feeds.vue | 178 ++++++++++++++++++ client/strings/en-us.json | 4 + server/controllers/RSSFeedController.js | 8 + server/managers/RssFeedManager.js | 12 +- server/routers/ApiRouter.js | 9 +- 8 files changed, 338 insertions(+), 7 deletions(-) create mode 100644 client/components/modals/rssfeed/ViewFeedModal.vue create mode 100644 client/pages/config/rss-feeds.vue diff --git a/client/components/app/ConfigSideNav.vue b/client/components/app/ConfigSideNav.vue index 0868bafb..50e440d7 100644 --- a/client/components/app/ConfigSideNav.vue +++ b/client/components/app/ConfigSideNav.vue @@ -99,6 +99,11 @@ export default { id: 'config-item-metadata-utils', title: this.$strings.HeaderItemMetadataUtils, path: '/config/item-metadata-utils' + }, + { + id: 'config-rss-feeds', + title: this.$strings.HeaderRSSFeeds, + path: '/config/rss-feeds' } ] diff --git a/client/components/modals/rssfeed/ViewFeedModal.vue b/client/components/modals/rssfeed/ViewFeedModal.vue new file mode 100644 index 00000000..7637a6dc --- /dev/null +++ b/client/components/modals/rssfeed/ViewFeedModal.vue @@ -0,0 +1,128 @@ + + + + + + diff --git a/client/pages/config.vue b/client/pages/config.vue index 2b63d83c..542b7f2c 100644 --- a/client/pages/config.vue +++ b/client/pages/config.vue @@ -55,6 +55,7 @@ export default { else if (pageName === 'library-stats') return this.$strings.HeaderLibraryStats else if (pageName === 'users') return this.$strings.HeaderUsers else if (pageName === 'item-metadata-utils') return this.$strings.HeaderItemMetadataUtils + else if (pageName === 'rss-feeds') return this.$strings.HeaderRSSFeeds else if (pageName === 'email') return this.$strings.HeaderEmail } return this.$strings.HeaderSettings diff --git a/client/pages/config/rss-feeds.vue b/client/pages/config/rss-feeds.vue new file mode 100644 index 00000000..a6cf85d5 --- /dev/null +++ b/client/pages/config/rss-feeds.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/client/strings/en-us.json b/client/strings/en-us.json index 3937e8c5..34151322 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -138,6 +138,7 @@ "HeaderRemoveEpisodes": "Remove {0} Episodes", "HeaderRSSFeedGeneral": "RSS Details", "HeaderRSSFeedIsOpen": "RSS Feed is Open", + "HeaderRSSFeeds": "RSS Feeds", "HeaderSavedMediaProgress": "Saved Media Progress", "HeaderSchedule": "Schedule", "HeaderScheduleLibraryScans": "Schedule Automatic Library Scans", @@ -201,6 +202,7 @@ "LabelClosePlayer": "Close player", "LabelCodec": "Codec", "LabelCollapseSeries": "Collapse Series", + "LabelCollection": "Collection", "LabelCollections": "Collections", "LabelComplete": "Complete", "LabelConfirmPassword": "Confirm Password", @@ -428,6 +430,7 @@ "LabelShowAll": "Show All", "LabelSize": "Size", "LabelSleepTimer": "Sleep timer", + "LabelSlug": "Slug", "LabelStart": "Start", "LabelStarted": "Started", "LabelStartedAt": "Started At", @@ -516,6 +519,7 @@ "MessageChapterErrorStartLtPrev": "Invalid start time must be greater than or equal to previous chapter start time", "MessageChapterStartIsAfter": "Chapter start is after the end of your audiobook", "MessageCheckingCron": "Checking cron...", + "MessageConfirmCloseFeed": "Are you sure you want to close this feed?", "MessageConfirmDeleteBackup": "Are you sure you want to delete backup for {0}?", "MessageConfirmDeleteFile": "This will delete the file from your file system. Are you sure?", "MessageConfirmDeleteLibrary": "Are you sure you want to permanently delete library \"{0}\"?", diff --git a/server/controllers/RSSFeedController.js b/server/controllers/RSSFeedController.js index 51f818ef..0d7dc6cf 100644 --- a/server/controllers/RSSFeedController.js +++ b/server/controllers/RSSFeedController.js @@ -5,6 +5,14 @@ const libraryItemsBookFilters = require('../utils/queries/libraryItemsBookFilter class RSSFeedController { constructor() { } + async getAll(req, res) { + const feeds = await this.rssFeedManager.getFeeds() + res.json({ + feeds: feeds.map(f => f.toJSON()), + minified: feeds.map(f => f.toJSONMinified()) + }) + } + // POST: api/feeds/item/:itemId/open async openRSSFeedForItem(req, res) { const options = req.body || {} diff --git a/server/managers/RssFeedManager.js b/server/managers/RssFeedManager.js index 835f408a..c462a506 100644 --- a/server/managers/RssFeedManager.js +++ b/server/managers/RssFeedManager.js @@ -52,7 +52,7 @@ class RssFeedManager { /** * Find open feed for an entity (e.g. collection id, playlist id, library item id) - * @param {string} entityId + * @param {string} entityId * @returns {Promise} oldFeed */ findFeedForEntityId(entityId) { @@ -61,7 +61,7 @@ class RssFeedManager { /** * Find open feed for a slug - * @param {string} slug + * @param {string} slug * @returns {Promise} oldFeed */ findFeedBySlug(slug) { @@ -70,7 +70,7 @@ class RssFeedManager { /** * Find open feed for a slug - * @param {string} slug + * @param {string} slug * @returns {Promise} oldFeed */ findFeed(id) { @@ -262,5 +262,11 @@ class RssFeedManager { if (!feed) return return this.handleCloseFeed(feed) } + + async getFeeds() { + const feeds = await Database.models.feed.getOldFeeds() + Logger.info(`[RssFeedManager] Fetched all feeds`) + return feeds + } } module.exports = RssFeedManager diff --git a/server/routers/ApiRouter.js b/server/routers/ApiRouter.js index 69179006..809af6bf 100644 --- a/server/routers/ApiRouter.js +++ b/server/routers/ApiRouter.js @@ -296,9 +296,10 @@ class ApiRouter { this.router.post('/tools/item/:id/embed-metadata', ToolsController.middleware.bind(this), ToolsController.embedAudioFileMetadata.bind(this)) this.router.post('/tools/batch/embed-metadata', ToolsController.middleware.bind(this), ToolsController.batchEmbedMetadata.bind(this)) - // + // // RSS Feed Routes (Admin and up) // + this.router.get('/feeds', RSSFeedController.getAll.bind(this)) this.router.post('/feeds/item/:itemId/open', RSSFeedController.middleware.bind(this), RSSFeedController.openRSSFeedForItem.bind(this)) this.router.post('/feeds/collection/:collectionId/open', RSSFeedController.middleware.bind(this), RSSFeedController.openRSSFeedForCollection.bind(this)) this.router.post('/feeds/series/:seriesId/open', RSSFeedController.middleware.bind(this), RSSFeedController.openRSSFeedForSeries.bind(this)) @@ -354,8 +355,8 @@ class ApiRouter { // /** * Remove library item and associated entities - * @param {string} mediaType - * @param {string} libraryItemId + * @param {string} mediaType + * @param {string} libraryItemId * @param {string[]} mediaItemIds array of bookId or podcastEpisodeId */ async handleDeleteLibraryItem(mediaType, libraryItemId, mediaItemIds) { @@ -446,7 +447,7 @@ class ApiRouter { * Series is removed if it only has 1 book * TODO: Update filter data * @param {UUIDV4} bookId - * @param {UUIDV4[]} seriesIds + * @param {UUIDV4[]} seriesIds */ async checkRemoveEmptySeries(bookId, seriesIds) { if (!seriesIds?.length) return From 469167df661a6537f5aba34cdba03111dfdda95e Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 22 Aug 2023 16:37:22 -0500 Subject: [PATCH 2/2] Update get all feeds route to be admin-only, map translation strings --- .../modals/rssfeed/ViewFeedModal.vue | 18 +++++++----------- client/pages/config/rss-feeds.vue | 10 ++++------ client/strings/de.json | 4 ++++ client/strings/es.json | 4 ++++ client/strings/fr.json | 4 ++++ client/strings/gu.json | 4 ++++ client/strings/hi.json | 4 ++++ client/strings/hr.json | 4 ++++ client/strings/it.json | 4 ++++ client/strings/lt.json | 4 ++++ client/strings/nl.json | 4 ++++ client/strings/pl.json | 4 ++++ client/strings/ru.json | 4 ++++ client/strings/zh-cn.json | 4 ++++ server/routers/ApiRouter.js | 2 +- 15 files changed, 60 insertions(+), 18 deletions(-) diff --git a/client/components/modals/rssfeed/ViewFeedModal.vue b/client/components/modals/rssfeed/ViewFeedModal.vue index 7637a6dc..9e34b17f 100644 --- a/client/components/modals/rssfeed/ViewFeedModal.vue +++ b/client/components/modals/rssfeed/ViewFeedModal.vue @@ -1,15 +1,12 @@