This commit is contained in:
Dyson 2026-05-06 13:51:20 +02:00 committed by GitHub
commit 661e23c6bb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 109 additions and 0 deletions

View file

@ -421,6 +421,27 @@ class MeController {
res.json(req.user.toOldJSONForBrowser())
}
/**
* POST: /api/me/series/:id/hide
*
* @param {RequestWithUser} req
* @param {Response} res
*/
async hideSeries(req, res) {
if (!(await Database.seriesModel.checkExistsById(req.params.id))) {
Logger.error(`[MeController] hideSeries: Series ${req.params.id} not found`)
return res.sendStatus(404)
}
const { makeHidden } = req.body
const hasUpdated = await req.user.hideSeries(req.params.id, makeHidden)
if (hasUpdated) {
SocketAuthority.clientEmitter(req.user.id, 'user_updated', req.user.toOldJSONForBrowser())
}
res.json(req.user.toOldJSONForBrowser())
}
/**
* GET: api/me/progress/:id/remove-from-continue-listening
*

View file

@ -178,6 +178,7 @@ class UserController {
permissions,
bookmarks: [],
extraData: {
hiddenSeries: [],
seriesHideFromContinueListening: []
}
}

View file

@ -603,6 +603,7 @@ class User extends Model {
*/
toOldJSONForBrowser(hideRootToken = false, minimal = false) {
const seriesHideFromContinueListening = this.extraData?.seriesHideFromContinueListening || []
const hiddenSeries = this.extraData?.hiddenSeries || []
const librariesAccessible = this.permissions?.librariesAccessible || []
const itemTagsSelected = this.permissions?.itemTagsSelected || []
const permissions = { ...this.permissions }
@ -621,6 +622,7 @@ class User extends Model {
isOldToken: this.isOldToken,
mediaProgress: this.mediaProgresses?.map((mp) => mp.getOldMediaProgress()) || [],
seriesHideFromContinueListening: [...seriesHideFromContinueListening],
hiddenSeries: [...hiddenSeries],
bookmarks: this.bookmarks?.map((b) => ({ ...b })) || [],
isActive: this.isActive,
isLocked: this.isLocked,
@ -945,6 +947,30 @@ class User extends Model {
return true
}
/**
*
* @param {string} seriesId
* @param {boolean} makeHidden
* @returns {Promise<boolean>}
*/
async hideSeries(seriesId, makeHidden) {
if (!this.extraData) this.extraData = {}
let hiddenSeries = this.extraData.hiddenSeries || []
if (makeHidden) {
if (hiddenSeries.includes(seriesId)) return false
hiddenSeries.push(seriesId)
} else {
if (!hiddenSeries.includes(seriesId)) return false
hiddenSeries = hiddenSeries.filter((sid) => sid !== seriesId)
}
this.extraData.hiddenSeries = hiddenSeries
this.changed('extraData', true)
await this.save()
return true
}
/**
* Update user permissions from external JSON
*

View file

@ -186,6 +186,7 @@ class ApiRouter {
this.router.get('/me/items-in-progress', MeController.getAllLibraryItemsInProgress.bind(this))
this.router.get('/me/series/:id/remove-from-continue-listening', MeController.removeSeriesFromContinueListening.bind(this))
this.router.get('/me/series/:id/readd-to-continue-listening', MeController.readdSeriesFromContinueListening.bind(this))
this.router.post('/me/series/:id/hide', MeController.hideSeries.bind(this))
this.router.get('/me/stats/year/:year', MeController.getStatsForYear.bind(this))
this.router.post('/me/ereader-devices', MeController.updateUserEReaderDevices.bind(this))

View file

@ -106,6 +106,15 @@ module.exports = {
}
}
// Don't return hidden series
if (user.extraData.hiddenSeries) {
seriesWhere.push({
id: {
[Sequelize.Op.notIn]: user.extraData.hiddenSeries
}
})
}
if (attrQuery) {
seriesWhere.push(
Sequelize.where(Sequelize.literal(`(${attrQuery})`), {