{"version":3,"file":"entity-repository.mjs","sources":["../../src/entity-manager/entity-repository.ts"],"sourcesContent":["import { isString } from 'lodash/fp';\nimport type { Database } from '..';\nimport type { Repository, Params } from './types';\n\nconst withDefaultPagination = (params: Params) => {\n  const { page = 1, pageSize = 10, ...rest } = params;\n\n  return {\n    page: Number(page),\n    pageSize: Number(pageSize),\n    ...rest,\n  };\n};\n\ntype ParamsWithLimits = Omit<Params, 'page' | 'pageSize'> & {\n  limit: number;\n  offset: number;\n};\n\nconst withOffsetLimit = (\n  params: Params\n): [ParamsWithLimits, { page: number; pageSize: number }] => {\n  const { page, pageSize, ...rest } = withDefaultPagination(params);\n\n  const offset = Math.max(page - 1, 0) * pageSize;\n  const limit = pageSize;\n\n  const query = {\n    ...rest,\n    limit,\n    offset,\n  };\n\n  return [query, { page, pageSize }];\n};\n\nexport const createRepository = (uid: string, db: Database): Repository => {\n  return {\n    findOne(params = {}) {\n      return db.entityManager.findOne(uid, params);\n    },\n\n    findMany(params = {}) {\n      return db.entityManager.findMany(uid, params);\n    },\n\n    findWithCount(params = {}) {\n      return Promise.all([\n        db.entityManager.findMany(uid, params),\n        db.entityManager.count(uid, params),\n      ]);\n    },\n\n    async findPage(params) {\n      const [query, { page, pageSize }] = withOffsetLimit(params);\n\n      const [results, total] = await Promise.all([\n        db.entityManager.findMany(uid, query),\n        db.entityManager.count(uid, query),\n      ]);\n\n      return {\n        results,\n        pagination: {\n          page,\n          pageSize,\n          pageCount: Math.ceil(total / pageSize),\n          total,\n        },\n      };\n    },\n\n    create(params) {\n      return db.entityManager.create(uid, params);\n    },\n\n    createMany(params) {\n      return db.entityManager.createMany(uid, params);\n    },\n\n    update(params) {\n      return db.entityManager.update(uid, params);\n    },\n\n    updateMany(params) {\n      return db.entityManager.updateMany(uid, params);\n    },\n\n    delete(params) {\n      return db.entityManager.delete(uid, params);\n    },\n\n    deleteMany(params = {}) {\n      return db.entityManager.deleteMany(uid, params);\n    },\n\n    count(params) {\n      return db.entityManager.count(uid, params);\n    },\n\n    async attachRelations(id, data) {\n      const trx = await db.transaction();\n      try {\n        await db.entityManager.attachRelations(uid, id, data, { transaction: trx.get() });\n        return await trx.commit();\n      } catch (e) {\n        await trx.rollback();\n        throw e;\n      }\n    },\n\n    async updateRelations(id, data) {\n      const trx = await db.transaction();\n      try {\n        await db.entityManager.updateRelations(uid, id, data, { transaction: trx.get() });\n        return await trx.commit();\n      } catch (e) {\n        await trx.rollback();\n        throw e;\n      }\n    },\n\n    deleteRelations(id) {\n      return db.entityManager.deleteRelations(uid, id);\n    },\n\n    populate(entity, populate) {\n      return db.entityManager.populate(uid, entity, populate);\n    },\n\n    load(entity, fields, params) {\n      return db.entityManager.load(uid, entity, fields, params);\n    },\n\n    async loadPages(entity, field, params) {\n      if (!isString(field)) {\n        throw new Error(`Invalid load. Expected ${field} to be a string`);\n      }\n\n      const { attributes } = db.metadata.get(uid);\n      const attribute = attributes[field];\n\n      if (\n        !attribute ||\n        attribute.type !== 'relation' ||\n        !attribute.relation ||\n        !['oneToMany', 'manyToMany'].includes(attribute.relation)\n      ) {\n        throw new Error(`Invalid load. Expected ${field} to be an anyToMany relational attribute`);\n      }\n\n      const [query, { page, pageSize }] = withOffsetLimit(params);\n\n      const [results, { count: total }] = await Promise.all([\n        db.entityManager.load(uid, entity, field, query),\n        db.entityManager.load(uid, entity, field, { ...query, count: true }),\n      ]);\n\n      return {\n        results,\n        pagination: {\n          page,\n          pageSize,\n          pageCount: Math.ceil(total / pageSize),\n          total,\n        },\n      };\n    },\n  };\n};\n"],"names":["withDefaultPagination","params","page","pageSize","rest","Number","withOffsetLimit","offset","Math","max","limit","query","createRepository","uid","db","findOne","entityManager","findMany","findWithCount","Promise","all","count","findPage","results","total","pagination","pageCount","ceil","create","createMany","update","updateMany","delete","deleteMany","attachRelations","id","data","trx","transaction","get","commit","e","rollback","updateRelations","deleteRelations","populate","entity","load","fields","loadPages","field","isString","Error","attributes","metadata","attribute","type","relation","includes"],"mappings":"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"}