'use strict'; const withDefaultPagination = params => { const { page = 1, pageSize = 100, ...rest } = params; return { page: parseInt(page), pageSize: parseInt(pageSize), ...rest, }; }; const createRepository = (uid, db) => { return { findOne(params) { return db.entityManager.findOne(uid, params); }, findMany(params) { return db.entityManager.findMany(uid, params); }, findWithCount(params) { return Promise.all([ db.entityManager.findMany(uid, params), db.entityManager.count(uid, params), ]); }, async findPage(params) { const { page, pageSize, ...rest } = withDefaultPagination(params); const offset = Math.max(page - 1, 0) * pageSize; const limit = pageSize; const query = { ...rest, limit, offset, }; const [results, total] = await Promise.all([ db.entityManager.findMany(uid, query), db.entityManager.count(uid, query), ]); return { results, pagination: { page, pageSize, pageCount: Math.ceil(total / pageSize), total, }, }; }, create(params) { return db.entityManager.create(uid, params); }, createMany(params) { return db.entityManager.createMany(uid, params); }, update(params) { return db.entityManager.update(uid, params); }, updateMany(params) { return db.entityManager.updateMany(uid, params); }, delete(params) { return db.entityManager.delete(uid, params); }, deleteMany(params) { return db.entityManager.deleteMany(uid, params); }, count(params) { return db.entityManager.count(uid, params); }, // TODO: add relation API populate() {}, load() {}, }; }; module.exports = { createRepository, };