77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
|
|
class CParamsQuery {
|
|
constructor(params) {
|
|
this.startRow = params.startRow;
|
|
this.endRow = params.endRow;
|
|
// this.count = params.count;
|
|
this.filter = params.filter;
|
|
this.sortBy = params.sortBy;
|
|
this.descending = params.descending;
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Query blog posts by user -> paginated results and a total count.
|
|
* @param userId {ObjectId} ID of user to retrieve blog posts for
|
|
* @param startRow {Number} First row to return in results
|
|
* @param endRow {Number} Last row to return in results
|
|
* @param [filter] {Object} Optional extra matching query object
|
|
* @param [sort] {Object} Optional sort query object
|
|
* @returns {Object} Object -> `{ rows, count }`
|
|
*/
|
|
|
|
function queryBlogPostsByUser (userId, startRow, endRow, filter = {}, sort = false) {
|
|
const User = this;
|
|
|
|
if (!(user instanceof mongoose.Types.ObjectId)) {
|
|
throw new Error('userId must be ObjectId')
|
|
} else if (typeof startRow !== 'number') {
|
|
throw new Error('startRow must be number')
|
|
} else if (typeof endRow !== 'number') {
|
|
throw new Error('endRow must be number')
|
|
}
|
|
|
|
const query = [
|
|
// more lookups go here if you need them
|
|
// we have a many-to-one from blogPost -> user
|
|
{ $lookup: {
|
|
from: 'users',
|
|
localField: 'user',
|
|
foreignField: '_id',
|
|
as: 'user'
|
|
} },
|
|
// each blog has a single user (author) so flatten it using $unwind
|
|
{ $unwind: '$user' },
|
|
// filter the results by our userId
|
|
{ $match: Object.assign({ 'user._id': userId }, filter) }
|
|
];
|
|
|
|
if (sort) {
|
|
// maybe we want to sort by blog title or something
|
|
query.push({ $sort: sort })
|
|
}
|
|
|
|
query.push(
|
|
{ $group: {
|
|
_id: null,
|
|
// get a count of every result that matches until now
|
|
count: { $sum: 1 },
|
|
// keep our results for the next operation
|
|
results: { $push: '$$ROOT' }
|
|
} },
|
|
// and finally trim the results to within the range given by start/endRow
|
|
{ $project: {
|
|
count: 1,
|
|
rows: { $slice: ['$results', startRow, endRow] }
|
|
} }
|
|
);
|
|
|
|
return User
|
|
.aggregate(query)
|
|
.then(([{ count, rows }]) => ({ count, rows }))
|
|
};
|
|
|
|
|
|
module.exports = { CParamsQuery, queryBlogPostsByUser };
|