split getAuthorsWithCount to 2 lighter functions

getAuthorsWithCount - now only gets the top 10 authors (in that library) by number of books
getAuthorsTotalCount - new function to only get total number of authors (in that library)
This commit is contained in:
CoffeeKnyte 2024-04-30 11:14:55 -04:00 committed by GitHub
parent 182527bfa8
commit 95cdb23efb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -2,35 +2,48 @@ const Sequelize = require('sequelize')
const Database = require('../../Database') const Database = require('../../Database')
module.exports = { module.exports = {
/**
* Get authors total count
* @param {string} libraryId
* @returns {{id:string, name:string, count:number}}
*/
async getAuthorsTotalCount(libraryId) {
const authorsCount = await Database.authorModel.count({
where: {
libraryId: libraryId
}
});
return authorsCount;
},
/** /**
* Get authors with count of num books * Get authors with count of num books
* @param {string} libraryId * @param {string} libraryId
* @returns {{id:string, name:string, count:number}} * @returns {{id:string, name:string, count:number}}
*/ */
async getAuthorsWithCount(libraryId) { async getAuthorsWithCount(libraryId) {
const authors = await Database.authorModel.findAll({ const authors = await Database.bookAuthorModel.findAll({
where: [ include: [{
{ model: Database.authorModel,
libraryId as: 'author', // Use the correct alias as defined in your associations
}, attributes: ['name'],
Sequelize.where(Sequelize.literal('count'), { where: {
[Sequelize.Op.gt]: 0 libraryId: libraryId
}) }
], }],
attributes: [ attributes: [
'id', 'authorId',
'name', [Sequelize.fn('COUNT', Sequelize.col('authorId')), 'count']
[Sequelize.literal('(SELECT count(*) FROM bookAuthors ba WHERE ba.authorId = author.id)'), 'count']
], ],
order: [ group: ['authorId', 'author.id'], // Include 'author.id' to satisfy GROUP BY with JOIN
['count', 'DESC'] order: [[Sequelize.literal('count'), 'DESC']],
] limit: 10
}) })
return authors.map(au => { return authors.map(au => {
return { return {
id: au.id, id: au.authorId,
name: au.name, name: au.author.name,
count: au.dataValues.count count: au.get('count') // Use get method to access aliased attributes
} }
}) })
}, },