Update controllers to use new user model

This commit is contained in:
advplyr 2024-08-10 17:15:21 -05:00
parent 202ceb02b5
commit 68ef3a07a7
20 changed files with 396 additions and 304 deletions

View file

@ -16,7 +16,7 @@ module.exports = {
/**
* Get library items using filter and sort
* @param {import('../../objects/Library')} library
* @param {import('../../objects/user/User')} user
* @param {import('../../models/User')} user
* @param {object} options
* @returns {object} { libraryItems:LibraryItem[], count:number }
*/
@ -42,7 +42,7 @@ module.exports = {
/**
* Get library items for continue listening & continue reading shelves
* @param {import('../../objects/Library')} library
* @param {import('../../objects/user/User')} user
* @param {import('../../models/User')} user
* @param {string[]} include
* @param {number} limit
* @returns {Promise<{ items:import('../../models/LibraryItem')[], count:number }>}
@ -79,7 +79,7 @@ module.exports = {
/**
* Get library items for most recently added shelf
* @param {import('../../objects/Library')} library
* @param {oldUser} user
* @param {import('../../models/User')} user
* @param {string[]} include
* @param {number} limit
* @returns {object} { libraryItems:LibraryItem[], count:number }
@ -127,7 +127,7 @@ module.exports = {
/**
* Get library items for continue series shelf
* @param {import('../../objects/Library')} library
* @param {oldUser} user
* @param {import('../../models/User')} user
* @param {string[]} include
* @param {number} limit
* @returns {object} { libraryItems:LibraryItem[], count:number }
@ -155,7 +155,7 @@ module.exports = {
/**
* Get library items or podcast episodes for the "Listen Again" and "Read Again" shelf
* @param {import('../../objects/Library')} library
* @param {oldUser} user
* @param {import('../../models/User')} user
* @param {string[]} include
* @param {number} limit
* @returns {object} { items:object[], count:number }
@ -192,7 +192,7 @@ module.exports = {
/**
* Get series for recent series shelf
* @param {import('../../objects/Library')} library
* @param {import('../../objects/user/User')} user
* @param {import('../../models/User')} user
* @param {string[]} include
* @param {number} limit
* @returns {{ series:import('../../objects/entities/Series')[], count:number}}
@ -235,7 +235,7 @@ module.exports = {
if (!user.canAccessExplicitContent) {
attrQuery += ' AND b.explicit = 0'
}
if (!user.permissions.accessAllTags && user.itemTagsSelected.length) {
if (!user.permissions?.accessAllTags && user.permissions?.itemTagsSelected?.length) {
if (user.permissions.selectedTagsNotAccessible) {
attrQuery += ' AND (SELECT count(*) FROM json_each(tags) WHERE json_valid(tags) AND json_each.value IN (:userTagsSelected)) = 0'
} else {
@ -317,7 +317,7 @@ module.exports = {
* Get most recently created authors for "Newest Authors" shelf
* Author must be linked to at least 1 book
* @param {oldLibrary} library
* @param {oldUser} user
* @param {import('../../models/User')} user
* @param {number} limit
* @returns {object} { authors:oldAuthor[], count:number }
*/
@ -360,7 +360,7 @@ module.exports = {
/**
* Get book library items for the "Discover" shelf
* @param {oldLibrary} library
* @param {oldUser} user
* @param {import('../../models/User')} user
* @param {string[]} include
* @param {number} limit
* @returns {object} {libraryItems:oldLibraryItem[], count:number}
@ -387,7 +387,7 @@ module.exports = {
/**
* Get podcast episodes most recently added
* @param {oldLibrary} library
* @param {oldUser} user
* @param {import('../../models/User')} user
* @param {number} limit
* @returns {object} {libraryItems:oldLibraryItem[], count:number}
*/
@ -408,7 +408,7 @@ module.exports = {
/**
* Get library items for an author, optional use user permissions
* @param {oldAuthor} author
* @param {[oldUser]} user
* @param {import('../../models/User')} user
* @param {number} limit
* @param {number} offset
* @returns {Promise<object>} { libraryItems:LibraryItem[], count:number }

View file

@ -6,7 +6,7 @@ const libraryItemsPodcastFilters = require('./libraryItemsPodcastFilters')
module.exports = {
/**
* Get all library items that have tags
* @param {string[]} tags
* @param {string[]} tags
* @returns {Promise<import('../../models/LibraryItem')[]>}
*/
async getAllLibraryItemsWithTags(tags) {
@ -71,7 +71,7 @@ module.exports = {
/**
* Get all library items that have genres
* @param {string[]} genres
* @param {string[]} genres
* @returns {Promise<import('../../models/LibraryItem')[]>}
*/
async getAllLibraryItemsWithGenres(genres) {
@ -131,10 +131,10 @@ module.exports = {
},
/**
* Get all library items that have narrators
* @param {string[]} narrators
* @returns {Promise<import('../../models/LibraryItem')[]>}
*/
* Get all library items that have narrators
* @param {string[]} narrators
* @returns {Promise<import('../../models/LibraryItem')[]>}
*/
async getAllLibraryItemsWithNarrators(narrators) {
const libraryItems = []
const booksWithGenre = await Database.bookModel.findAll({
@ -172,24 +172,24 @@ module.exports = {
/**
* Search library items
* @param {import('../../objects/user/User')} oldUser
* @param {import('../../objects/Library')} oldLibrary
* @param {import('../../models/User')} user
* @param {import('../../objects/Library')} oldLibrary
* @param {string} query
* @param {number} limit
* @param {number} limit
* @returns {{book:object[], narrators:object[], authors:object[], tags:object[], series:object[], podcast:object[]}}
*/
search(oldUser, oldLibrary, query, limit) {
search(user, oldLibrary, query, limit) {
if (oldLibrary.isBook) {
return libraryItemsBookFilters.search(oldUser, oldLibrary, query, limit, 0)
return libraryItemsBookFilters.search(user, oldLibrary, query, limit, 0)
} else {
return libraryItemsPodcastFilters.search(oldUser, oldLibrary, query, limit, 0)
return libraryItemsPodcastFilters.search(user, oldLibrary, query, limit, 0)
}
},
/**
* Get largest items in library
* @param {string} libraryId
* @param {number} limit
* @param {string} libraryId
* @param {number} limit
* @returns {Promise<{ id:string, title:string, size:number }[]>}
*/
async getLargestItems(libraryId, limit) {
@ -208,12 +208,10 @@ module.exports = {
attributes: ['id', 'title']
}
],
order: [
['size', 'DESC']
],
order: [['size', 'DESC']],
limit
})
return libraryItems.map(libraryItem => {
return libraryItems.map((libraryItem) => {
return {
id: libraryItem.id,
title: libraryItem.media.title,
@ -221,4 +219,4 @@ module.exports = {
}
})
}
}
}

View file

@ -8,7 +8,7 @@ const ShareManager = require('../../managers/ShareManager')
module.exports = {
/**
* User permissions to restrict books for explicit content & tags
* @param {import('../../objects/user/User')} user
* @param {import('../../models/User')} user
* @returns {{ bookWhere:Sequelize.WhereOptions, replacements:object }}
*/
getUserPermissionBookWhereQuery(user) {
@ -21,8 +21,8 @@ module.exports = {
explicit: false
})
}
if (!user.permissions.accessAllTags && user.itemTagsSelected.length) {
replacements['userTagsSelected'] = user.itemTagsSelected
if (!user.permissions?.accessAllTags && user.permissions?.itemTagsSelected?.length) {
replacements['userTagsSelected'] = user.permissions.itemTagsSelected
if (user.permissions.selectedTagsNotAccessible) {
bookWhere.push(Sequelize.where(Sequelize.literal(`(SELECT count(*) FROM json_each(tags) WHERE json_valid(tags) AND json_each.value IN (:userTagsSelected))`), 0))
} else {
@ -333,7 +333,7 @@ module.exports = {
/**
* Get library items for book media type using filter and sort
* @param {string} libraryId
* @param {import('../../objects/user/User')} user
* @param {import('../../models/User')} user
* @param {string|null} filterGroup
* @param {string|null} filterValue
* @param {string} sortBy
@ -637,7 +637,7 @@ module.exports = {
* 3. Has at least 1 unfinished book
* TODO: Reduce queries
* @param {import('../../objects/Library')} library
* @param {import('../../objects/user/User')} user
* @param {import('../../models/User')} user
* @param {string[]} include
* @param {number} limit
* @param {number} offset
@ -672,7 +672,7 @@ module.exports = {
where: [
{
id: {
[Sequelize.Op.notIn]: user.seriesHideFromContinueListening
[Sequelize.Op.notIn]: user.extraData?.seriesHideFromContinueListening || []
},
libraryId
},
@ -780,7 +780,7 @@ module.exports = {
* Random selection of books that are not started
* - only includes the first book of a not-started series
* @param {string} libraryId
* @param {oldUser} user
* @param {import('../../models/User')} user
* @param {string[]} include
* @param {number} limit
* @returns {object} {libraryItems:LibraryItem, count:number}
@ -955,25 +955,25 @@ module.exports = {
/**
* Get library items for series
* @param {import('../../objects/entities/Series')} oldSeries
* @param {import('../../objects/user/User')} [oldUser]
* @param {import('../../models/User')} [user]
* @returns {Promise<import('../../objects/LibraryItem')[]>}
*/
async getLibraryItemsForSeries(oldSeries, oldUser) {
const { libraryItems } = await this.getFilteredLibraryItems(oldSeries.libraryId, oldUser, 'series', oldSeries.id, null, null, false, [], null, null)
async getLibraryItemsForSeries(oldSeries, user) {
const { libraryItems } = await this.getFilteredLibraryItems(oldSeries.libraryId, user, 'series', oldSeries.id, null, null, false, [], null, null)
return libraryItems.map((li) => Database.libraryItemModel.getOldLibraryItem(li))
},
/**
* Search books, authors, series
* @param {import('../../objects/user/User')} oldUser
* @param {import('../../models/User')} user
* @param {import('../../objects/Library')} oldLibrary
* @param {string} query
* @param {number} limit
* @param {number} offset
* @returns {{book:object[], narrators:object[], authors:object[], tags:object[], series:object[]}}
*/
async search(oldUser, oldLibrary, query, limit, offset) {
const userPermissionBookWhere = this.getUserPermissionBookWhereQuery(oldUser)
async search(user, oldLibrary, query, limit, offset) {
const userPermissionBookWhere = this.getUserPermissionBookWhereQuery(user)
const normalizedQuery = query

View file

@ -1,12 +1,11 @@
const Sequelize = require('sequelize')
const Database = require('../../Database')
const Logger = require('../../Logger')
const { asciiOnlyToLowerCase } = require('../index')
module.exports = {
/**
* User permissions to restrict podcasts for explicit content & tags
* @param {import('../../objects/user/User')} user
* @param {import('../../models/User')} user
* @returns {{ podcastWhere:Sequelize.WhereOptions, replacements:object }}
*/
getUserPermissionPodcastWhereQuery(user) {
@ -17,18 +16,20 @@ module.exports = {
explicit: false
})
}
if (!user.permissions.accessAllTags && user.itemTagsSelected.length) {
replacements['userTagsSelected'] = user.itemTagsSelected
if (!user.permissions?.accessAllTags && user.permissions?.itemTagsSelected?.length) {
replacements['userTagsSelected'] = user.permissions.itemTagsSelected
if (user.permissions.selectedTagsNotAccessible) {
podcastWhere.push(Sequelize.where(Sequelize.literal(`(SELECT count(*) FROM json_each(tags) WHERE json_valid(tags) AND json_each.value IN (:userTagsSelected))`), 0))
bookWhere.push(Sequelize.where(Sequelize.literal(`(SELECT count(*) FROM json_each(tags) WHERE json_valid(tags) AND json_each.value IN (:userTagsSelected))`), 0))
} else {
podcastWhere.push(
bookWhere.push(
Sequelize.where(Sequelize.literal(`(SELECT count(*) FROM json_each(tags) WHERE json_valid(tags) AND json_each.value IN (:userTagsSelected))`), {
[Sequelize.Op.gte]: 1
})
)
}
}
return {
podcastWhere,
replacements
@ -98,7 +99,7 @@ module.exports = {
/**
* Get library items for podcast media type using filter and sort
* @param {string} libraryId
* @param {oldUser} user
* @param {import('../../models/User')} user
* @param {[string]} filterGroup
* @param {[string]} filterValue
* @param {string} sortBy
@ -200,7 +201,7 @@ module.exports = {
/**
* Get podcast episodes filtered and sorted
* @param {string} libraryId
* @param {oldUser} user
* @param {import('../../models/User')} user
* @param {[string]} filterGroup
* @param {[string]} filterValue
* @param {string} sortBy
@ -304,15 +305,15 @@ module.exports = {
/**
* Search podcasts
* @param {import('../../objects/user/User')} oldUser
* @param {import('../../models/User')} user
* @param {import('../../objects/Library')} oldLibrary
* @param {string} query
* @param {number} limit
* @param {number} offset
* @returns {{podcast:object[], tags:object[]}}
*/
async search(oldUser, oldLibrary, query, limit, offset) {
const userPermissionPodcastWhere = this.getUserPermissionPodcastWhereQuery(oldUser)
async search(user, oldLibrary, query, limit, offset) {
const userPermissionPodcastWhere = this.getUserPermissionPodcastWhereQuery(user)
const normalizedQuery = query
const matchTitle = Database.matchExpression('title', normalizedQuery)
@ -410,14 +411,14 @@ module.exports = {
/**
* Most recent podcast episodes not finished
* @param {import('../../objects/user/User')} oldUser
* @param {import('../../models/User')} user
* @param {import('../../objects/Library')} oldLibrary
* @param {number} limit
* @param {number} offset
* @returns {Promise<object[]>}
*/
async getRecentEpisodes(oldUser, oldLibrary, limit, offset) {
const userPermissionPodcastWhere = this.getUserPermissionPodcastWhereQuery(oldUser)
async getRecentEpisodes(user, oldLibrary, limit, offset) {
const userPermissionPodcastWhere = this.getUserPermissionPodcastWhereQuery(user)
const episodes = await Database.podcastEpisodeModel.findAll({
where: {
@ -441,7 +442,7 @@ module.exports = {
{
model: Database.mediaProgressModel,
where: {
userId: oldUser.id
userId: user.id
},
required: false
}

View file

@ -12,7 +12,7 @@ module.exports = {
* Get series filtered and sorted
*
* @param {import('../../objects/Library')} library
* @param {import('../../objects/user/User')} user
* @param {import('../../models/User')} user
* @param {string} filterBy
* @param {string} sortBy
* @param {boolean} sortDesc
@ -93,7 +93,7 @@ module.exports = {
if (!user.canAccessExplicitContent) {
attrQuery += ' AND b.explicit = 0'
}
if (!user.permissions.accessAllTags && user.itemTagsSelected.length) {
if (!user.permissions?.accessAllTags && user.permissions?.itemTagsSelected?.length) {
if (user.permissions.selectedTagsNotAccessible) {
attrQuery += ' AND (SELECT count(*) FROM json_each(tags) WHERE json_valid(tags) AND json_each.value IN (:userTagsSelected)) = 0'
} else {