Show data Table with pagination (startRow, endRow, filter, sorting)
This commit is contained in:
76
server/classes/queryclass.js
Normal file
76
server/classes/queryclass.js
Normal file
@@ -0,0 +1,76 @@
|
||||
|
||||
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 };
|
||||
Reference in New Issue
Block a user