From b5d4c11f6fcee4c2e384fbd6c48c4c38caff61dc Mon Sep 17 00:00:00 2001 From: advplyr Date: Thu, 6 Jul 2023 17:07:10 -0500 Subject: [PATCH] Fix RSS feeds to use slug instead of id --- server/Server.js | 10 ++--- server/controllers/LibraryController.js | 2 +- server/controllers/RSSFeedController.js | 20 +++------ server/managers/RssFeedManager.js | 59 +++++++++++-------------- 4 files changed, 37 insertions(+), 54 deletions(-) diff --git a/server/Server.js b/server/Server.js index 30f34d4b..b591e626 100644 --- a/server/Server.js +++ b/server/Server.js @@ -157,15 +157,15 @@ class Server { router.use('/hls', this.authMiddleware.bind(this), this.hlsRouter.router) // RSS Feed temp route - router.get('/feed/:id', (req, res) => { - Logger.info(`[Server] Requesting rss feed ${req.params.id}`) + router.get('/feed/:slug', (req, res) => { + Logger.info(`[Server] Requesting rss feed ${req.params.slug}`) this.rssFeedManager.getFeed(req, res) }) - router.get('/feed/:id/cover', (req, res) => { + router.get('/feed/:slug/cover', (req, res) => { this.rssFeedManager.getFeedCover(req, res) }) - router.get('/feed/:id/item/:episodeId/*', (req, res) => { - Logger.debug(`[Server] Requesting rss feed episode ${req.params.id}/${req.params.episodeId}`) + router.get('/feed/:slug/item/:episodeId/*', (req, res) => { + Logger.debug(`[Server] Requesting rss feed episode ${req.params.slug}/${req.params.episodeId}`) this.rssFeedManager.getFeedItem(req, res) }) diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js index 62057b71..cff0182c 100644 --- a/server/controllers/LibraryController.js +++ b/server/controllers/LibraryController.js @@ -201,7 +201,7 @@ class LibraryController { // Step 1 - Filter the retrieved library items let filterSeries = null if (payload.filterBy) { - libraryItems = libraryHelpers.getFilteredLibraryItems(libraryItems, payload.filterBy, req.user, this.rssFeedManager.feedsArray) + libraryItems = libraryHelpers.getFilteredLibraryItems(libraryItems, payload.filterBy, req.user, Database.feeds) payload.total = libraryItems.length // Determining if we are filtering titles by a series, and if so, which series diff --git a/server/controllers/RSSFeedController.js b/server/controllers/RSSFeedController.js index aa5e5dda..02f24580 100644 --- a/server/controllers/RSSFeedController.js +++ b/server/controllers/RSSFeedController.js @@ -30,7 +30,7 @@ class RSSFeedController { } // Check that this slug is not being used for another feed (slug will also be the Feed id) - if (this.rssFeedManager.feeds[options.slug]) { + if (this.rssFeedManager.findFeedBySlug(options.slug)) { Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${options.slug}" is already in use`) return res.status(400).send('Slug already in use') } @@ -55,7 +55,7 @@ class RSSFeedController { } // Check that this slug is not being used for another feed (slug will also be the Feed id) - if (this.rssFeedManager.feeds[options.slug]) { + if (this.rssFeedManager.findFeedBySlug(options.slug)) { Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${options.slug}" is already in use`) return res.status(400).send('Slug already in use') } @@ -89,7 +89,7 @@ class RSSFeedController { } // Check that this slug is not being used for another feed (slug will also be the Feed id) - if (this.rssFeedManager.feeds[options.slug]) { + if (this.rssFeedManager.findFeedBySlug(options.slug)) { Logger.error(`[RSSFeedController] Cannot open RSS feed because slug "${options.slug}" is already in use`) return res.status(400).send('Slug already in use') } @@ -111,10 +111,8 @@ class RSSFeedController { } // POST: api/feeds/:id/close - async closeRSSFeed(req, res) { - await this.rssFeedManager.closeRssFeed(req.params.id) - - res.sendStatus(200) + closeRSSFeed(req, res) { + this.rssFeedManager.closeRssFeed(req, res) } middleware(req, res, next) { @@ -123,14 +121,6 @@ class RSSFeedController { return res.sendStatus(403) } - if (req.params.id) { - const feed = this.rssFeedManager.findFeed(req.params.id) - if (!feed) { - Logger.error(`[RSSFeedController] RSS feed not found with id "${req.params.id}"`) - return res.sendStatus(404) - } - } - next() } } diff --git a/server/managers/RssFeedManager.js b/server/managers/RssFeedManager.js index 98f70978..bb52057e 100644 --- a/server/managers/RssFeedManager.js +++ b/server/managers/RssFeedManager.js @@ -8,13 +8,7 @@ const fs = require('../libs/fsExtra') const Feed = require('../objects/Feed') class RssFeedManager { - constructor() { - this.feeds = {} - } - - get feedsArray() { - return Object.values(this.feeds) - } + constructor() { } validateFeedEntity(feedObj) { if (feedObj.entityType === 'collection') { @@ -42,32 +36,30 @@ class RssFeedManager { } async init() { - const feeds = Database.feeds - if (!feeds?.length) return - - for (const feed of feeds) { + for (const feed of Database.feeds) { // Remove invalid feeds if (!this.validateFeedEntity(feed)) { await Database.removeFeed(feed.id) } - - this.feeds[feed.id] = feed - Logger.info(`[RssFeedManager] Opened rss feed ${feed.feedUrl}`) } } findFeedForEntityId(entityId) { - return Object.values(this.feeds).find(feed => feed.entityId === entityId) + return Database.feeds.find(feed => feed.entityId === entityId) } - findFeed(feedId) { - return this.feeds[feedId] || null + findFeedBySlug(slug) { + return Database.feeds.find(feed => feed.slug === slug) + } + + findFeed(id) { + return Database.feeds.find(feed => feed.id === id) } async getFeed(req, res) { - const feed = this.feeds[req.params.id] + const feed = this.findFeedBySlug(req.params.slug) if (!feed) { - Logger.debug(`[RssFeedManager] Feed not found ${req.params.id}`) + Logger.warn(`[RssFeedManager] Feed not found ${req.params.slug}`) res.sendStatus(404) return } @@ -143,9 +135,9 @@ class RssFeedManager { } getFeedItem(req, res) { - const feed = this.feeds[req.params.id] + const feed = this.findFeedBySlug(req.params.slug) if (!feed) { - Logger.debug(`[RssFeedManager] Feed not found ${req.params.id}`) + Logger.debug(`[RssFeedManager] Feed not found ${req.params.slug}`) res.sendStatus(404) return } @@ -159,9 +151,9 @@ class RssFeedManager { } getFeedCover(req, res) { - const feed = this.feeds[req.params.id] + const feed = this.findFeedBySlug(req.params.slug) if (!feed) { - Logger.debug(`[RssFeedManager] Feed not found ${req.params.id}`) + Logger.debug(`[RssFeedManager] Feed not found ${req.params.slug}`) res.sendStatus(404) return } @@ -186,9 +178,8 @@ class RssFeedManager { const feed = new Feed() feed.setFromItem(user.id, slug, libraryItem, serverAddress, preventIndexing, ownerName, ownerEmail) - this.feeds[feed.id] = feed - Logger.debug(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) + Logger.info(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) await Database.createFeed(feed) SocketAuthority.emitter('rss_feed_open', feed.toJSONMinified()) return feed @@ -203,9 +194,8 @@ class RssFeedManager { const feed = new Feed() feed.setFromCollection(user.id, slug, collectionExpanded, serverAddress, preventIndexing, ownerName, ownerEmail) - this.feeds[feed.id] = feed - Logger.debug(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) + Logger.info(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) await Database.createFeed(feed) SocketAuthority.emitter('rss_feed_open', feed.toJSONMinified()) return feed @@ -220,9 +210,8 @@ class RssFeedManager { const feed = new Feed() feed.setFromSeries(user.id, slug, seriesExpanded, serverAddress, preventIndexing, ownerName, ownerEmail) - this.feeds[feed.id] = feed - Logger.debug(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) + Logger.info(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) await Database.createFeed(feed) SocketAuthority.emitter('rss_feed_open', feed.toJSONMinified()) return feed @@ -232,13 +221,17 @@ class RssFeedManager { if (!feed) return await Database.removeFeed(feed.id) SocketAuthority.emitter('rss_feed_closed', feed.toJSONMinified()) - delete this.feeds[feed.id] Logger.info(`[RssFeedManager] Closed RSS feed "${feed.feedUrl}"`) } - closeRssFeed(id) { - if (!this.feeds[id]) return - return this.handleCloseFeed(this.feeds[id]) + async closeRssFeed(req, res) { + const feed = this.findFeed(req.params.id) + if (!feed) { + Logger.error(`[RssFeedManager] RSS feed not found with id "${req.params.id}"`) + return res.sendStatus(404) + } + await this.handleCloseFeed(feed) + res.sendStatus(200) } closeFeedForEntityId(entityId) {