All files / koa/libs/plugins paginate.js

6.98% Statements 3/43
0% Branches 0/34
12.5% Functions 1/8
7.14% Lines 3/42

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81                                                                                                                                                        3x 9x     3x
'use strict'
 
function paginate(query, options, callback) {
  query = query || {};
  options = Object.assign({}, paginate.options, options);
 
  options.limit = Number(options.limit) > 0 ? Number(options.limit) : 10 // 默认10
  let sortBy = String(options.sortBy || 'updatedAt') // 默认updatedAt
  options.sort = Number(options.sort || -1) > 0 ? sortBy : '-' + sortBy // 默认+updatedAt(倒序)
 
  options.lean = options.lean || false;
  let leanWithId = options.leanWithId ? options.leanWithId : true;
  let promises;
 
  if (options.offset) {
    options.offset = options.offset;
    options.skip = options.offset;
  } else if (options.page) {
    options.page = options.page;
    options.skip = (options.page - 1) * options.limit;
  } else {
    options.page = 1;
    options.offset = 0;
    options.skip = options.offset;
  }
  if (options.limit) {
    let docsQuery = this.find(query)
      .select(options.select)
      .sort(options.sort)
      .skip(options.skip)
      .limit(options.limit)
      .lean(options.lean);
    if (options.populate) {
      [].concat(options.populate).forEach((item) => {
        docsQuery.populate(item);
      });
    }
    promises = {
      docs: docsQuery.exec(),
      count: this.count(query).exec(),
    };
    if (options.lean && leanWithId) {
      promises.docs = promises.docs.then((docs) => {
        docs.forEach((doc) => {
          doc.id = String(doc._id);
        });
        return docs;
      });
    }
  }
  promises = Object.keys(promises).map((x) => promises[x]);
  return Promise.all(promises).then((data) => {
    let result = {
      list: data[0],
      count: data[1],
      limit: options.limit,
    };
    if (options.offset !== undefined) {
      result.offset = options.offset;
    }
    if (options.page !== undefined) {
      result.page = options.page;
      result.pages = Math.ceil(result.count / options.limit) || 1;
    }
    if (typeof callback === 'function') {
      return callback(null, result);
    }
    return new Promise((resolve, reject) => {
      resolve(result);
    });
  });
}
 
/**
 * @param {Schema} schema
 */
module.exports = function (schema) {
  schema.statics.paginate = paginate;
};
 
module.exports.paginate = paginate;