Remove invalid RSS feeds on init and remove feeds when associated entity is removed

This commit is contained in:
advplyr 2022-12-31 14:08:34 -06:00
parent 0e6b0d3eff
commit c6763dee2d
5 changed files with 67 additions and 21 deletions

View File

@ -280,7 +280,7 @@ class Db {
}
getAllEntities(entityName) {
var entityDb = this.getEntityDb(entityName)
const entityDb = this.getEntityDb(entityName)
return entityDb.select(() => true).then((results) => results.data).catch((error) => {
Logger.error(`[DB] Failed to get all ${entityName}`, error)
return null
@ -371,16 +371,16 @@ class Db {
}
updateEntity(entityName, entity) {
var entityDb = this.getEntityDb(entityName)
const entityDb = this.getEntityDb(entityName)
var jsonEntity = entity
let jsonEntity = entity
if (entity && entity.toJSON) {
jsonEntity = entity.toJSON()
}
return entityDb.update((record) => record.id === entity.id, () => jsonEntity).then((results) => {
Logger.debug(`[DB] Updated ${entityName}: ${results.updated}`)
var arrayKey = this.getEntityArrayKey(entityName)
const arrayKey = this.getEntityArrayKey(entityName)
if (this[arrayKey]) {
this[arrayKey] = this[arrayKey].map(e => {
return e.id === entity.id ? entity : e

View File

@ -40,8 +40,8 @@ class CollectionController {
async update(req, res) {
const collection = req.collection
var wasUpdated = collection.update(req.body)
var jsonExpanded = collection.toJSONExpanded(this.db.libraryItems)
const wasUpdated = collection.update(req.body)
const jsonExpanded = collection.toJSONExpanded(this.db.libraryItems)
if (wasUpdated) {
await this.db.updateEntity('collection', collection)
SocketAuthority.emitter('collection_updated', jsonExpanded)
@ -51,7 +51,11 @@ class CollectionController {
async delete(req, res) {
const collection = req.collection
var jsonExpanded = collection.toJSONExpanded(this.db.libraryItems)
const jsonExpanded = collection.toJSONExpanded(this.db.libraryItems)
// Close rss feed - remove from db and emit socket event
await this.rssFeedManager.closeFeedForEntityId(collection.id)
await this.db.removeEntity('collection', collection.id)
SocketAuthority.emitter('collection_removed', jsonExpanded)
res.sendStatus(200)
@ -59,7 +63,7 @@ class CollectionController {
async addBook(req, res) {
const collection = req.collection
var libraryItem = this.db.libraryItems.find(li => li.id === req.body.id)
const libraryItem = this.db.libraryItems.find(li => li.id === req.body.id)
if (!libraryItem) {
return res.status(500).send('Book not found')
}
@ -70,7 +74,7 @@ class CollectionController {
return res.status(500).send('Book already in collection')
}
collection.addBook(req.body.id)
var jsonExpanded = collection.toJSONExpanded(this.db.libraryItems)
const jsonExpanded = collection.toJSONExpanded(this.db.libraryItems)
await this.db.updateEntity('collection', collection)
SocketAuthority.emitter('collection_updated', jsonExpanded)
res.json(jsonExpanded)

View File

@ -17,14 +17,43 @@ class RssFeedManager {
return Object.values(this.feeds)
}
validateFeedEntity(feedObj) {
if (feedObj.entityType === 'collection') {
if (!this.db.collections.some(li => li.id === feedObj.entityId)) {
Logger.error(`[RssFeedManager] Removing feed "${feedObj.id}". Collection "${feedObj.entityId}" not found`)
return false
}
} else if (feedObj.entityType === 'libraryItem') {
if (!this.db.libraryItems.some(li => li.id === feedObj.entityId)) {
Logger.error(`[RssFeedManager] Removing feed "${feedObj.id}". Library item "${feedObj.entityId}" not found`)
return false
}
} else {
Logger.error(`[RssFeedManager] Removing feed "${feedObj.id}". Invalid entityType "${feedObj.entityType}"`)
return false
}
return true
}
async init() {
const feedObjects = await this.db.getAllEntities('feed')
if (feedObjects && feedObjects.length) {
feedObjects.forEach((feedObj) => {
const feed = new Feed(feedObj)
this.feeds[feed.id] = feed
Logger.info(`[RssFeedManager] Opened rss feed ${feed.feedUrl}`)
})
if (!feedObjects || !feedObjects.length) return
for (const feedObj of feedObjects) {
// Migration: In v2.2.12 entityType "item" was updated to "libraryItem"
if (feedObj.entityType === 'item') {
feedObj.entityType = 'libraryItem'
await this.db.updateEntity('feed', feedObj)
}
// Remove invalid feeds
if (!this.validateFeedEntity(feedObj)) {
await this.db.removeEntity('feed', feedObj.id)
}
const feed = new Feed(feedObj)
this.feeds[feed.id] = feed
Logger.info(`[RssFeedManager] Opened rss feed ${feed.feedUrl}`)
}
}
@ -141,13 +170,23 @@ class RssFeedManager {
return feed
}
async closeRssFeed(id) {
if (!this.feeds[id]) return
const feed = this.feeds[id]
await this.db.removeEntity('feed', id)
async handleCloseFeed(feed) {
if (!feed) return
await this.db.removeEntity('feed', feed.id)
SocketAuthority.emitter('rss_feed_closed', feed.toJSONMinified())
delete this.feeds[id]
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])
}
closeFeedForEntityId(entityId) {
const feed = this.findFeedForEntityId(entityId)
if (!feed) return
return this.handleCloseFeed(feed)
}
}
module.exports = RssFeedManager

View File

@ -87,7 +87,7 @@ class Feed {
this.id = slug
this.slug = slug
this.userId = userId
this.entityType = 'item'
this.entityType = 'libraryItem'
this.entityId = libraryItem.id
this.entityUpdatedAt = libraryItem.updatedAt
this.coverPath = media.coverPath || null

View File

@ -386,6 +386,9 @@ class ApiRouter {
}
}
// Close rss feed - remove from db and emit socket event
await this.rssFeedManager.closeFeedForEntityId(libraryItem.id)
// purge cover cache
if (libraryItem.media.coverPath) {
await this.cacheManager.purgeCoverCache(libraryItem.id)