diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js index 30c9c0d9..77b79ac0 100644 --- a/server/controllers/LibraryController.js +++ b/server/controllers/LibraryController.js @@ -605,12 +605,12 @@ class LibraryController { } if (req.library.isBook) { - const authors = await authorFilters.getAuthorsWithCount(req.library.id) + const authors = await authorFilters.getAuthorsWithCount(req.library.id, 10) const genres = await libraryItemsBookFilters.getGenresWithCount(req.library.id) const bookStats = await libraryItemsBookFilters.getBookLibraryStats(req.library.id) const longestBooks = await libraryItemsBookFilters.getLongestBooks(req.library.id, 10) - stats.totalAuthors = authors.length + stats.totalAuthors = await authorFilters.getAuthorsTotalCount(req.library.id) stats.authorsWithCount = authors stats.totalGenres = genres.length stats.genresWithCount = genres diff --git a/server/utils/queries/authorFilters.js b/server/utils/queries/authorFilters.js index c6a08a61..e684232b 100644 --- a/server/utils/queries/authorFilters.js +++ b/server/utils/queries/authorFilters.js @@ -2,35 +2,49 @@ const Sequelize = require('sequelize') const Database = require('../../Database') module.exports = { + /** + * Get authors total count + * @param {string} libraryId + * @returns {number} count + */ + async getAuthorsTotalCount(libraryId) { + const authorsCount = await Database.authorModel.count({ + where: { + libraryId: libraryId + } + }); + return authorsCount; + }, + /** * Get authors with count of num books * @param {string} libraryId + * @param {number} limit * @returns {{id:string, name:string, count:number}} */ - async getAuthorsWithCount(libraryId) { - const authors = await Database.authorModel.findAll({ - where: [ - { - libraryId - }, - Sequelize.where(Sequelize.literal('count'), { - [Sequelize.Op.gt]: 0 - }) - ], + async getAuthorsWithCount(libraryId, limit) { + const authors = await Database.bookAuthorModel.findAll({ + include: [{ + model: Database.authorModel, + as: 'author', // Use the correct alias as defined in your associations + attributes: ['name'], + where: { + libraryId: libraryId + } + }], attributes: [ - 'id', - 'name', - [Sequelize.literal('(SELECT count(*) FROM bookAuthors ba WHERE ba.authorId = author.id)'), 'count'] + 'authorId', + [Sequelize.fn('COUNT', Sequelize.col('authorId')), 'count'] ], - order: [ - ['count', 'DESC'] - ] + group: ['authorId', 'author.id'], // Include 'author.id' to satisfy GROUP BY with JOIN + order: [[Sequelize.literal('count'), 'DESC']], + limit: limit }) return authors.map(au => { return { - id: au.id, - name: au.name, - count: au.dataValues.count + id: au.authorId, + name: au.author.name, + count: au.get('count') // Use get method to access aliased attributes } }) },