{"version":3,"sources":["index.ts","middleware.ts","core.ts","manager.ts","global-options.ts","model-options.ts","lib.ts","default-model-options.ts","data-options.ts","meta.ts","collection.ts","document.ts","query.ts","enums.ts","errors.ts","index.ts","permission.ts","base.ts","service.ts","model.ts","logger.ts","public-service.ts","data-service.ts","processors.ts","symbols.ts","cache.ts","model-router.ts","root-router.ts","data-router.ts","core-data.ts","plugins.ts"],"sourcesContent":["import isString from 'lodash/isString';\nimport isObject from 'lodash/isObject';\nimport isPlainObject from 'lodash/isPlainObject';\nimport isUndefined from 'lodash/isUndefined';\nimport middleware, { guard } from './middleware';\nimport { RootRouter, ModelRouter } from './routers';\nimport {\n  setGlobalOptions,\n  setGlobalOption,\n  getGlobalOptions,\n  getGlobalOption,\n  setModelOptions,\n  setModelOption,\n  getModelOptions,\n  getModelOption,\n  getModelNames,\n  getModelJsonSchema,\n  setDefaultModelOptions,\n  setDefaultModelOption,\n  getDefaultModelOptions,\n  getDefaultModelOption,\n} from './options';\nimport { GlobalOptions, RootRouterOptions, ModelRouterOptions, DataRouterOptions } from './interfaces';\nimport { DataRouter } from './routers/data-router';\nexport {\n  RootRouter,\n  ModelRouter,\n  guard,\n  setGlobalOptions,\n  setGlobalOption,\n  getGlobalOptions,\n  getGlobalOption,\n  setModelOptions,\n  setModelOption,\n  getModelOptions,\n  getModelOption,\n  getModelNames,\n  getModelJsonSchema,\n  setDefaultModelOptions,\n  setDefaultModelOption,\n  getDefaultModelOptions,\n  getDefaultModelOption,\n};\nexport * from './permission';\nexport * from './plugins';\nexport * from './interfaces';\nexport * from './symbols';\nexport * from './enums';\n\ntype CreateRouter = {\n  (modelName: string, options: ModelRouterOptions): ModelRouter;\n  (options: RootRouterOptions): RootRouter;\n};\n\ntype CreateDataRouter = {\n  (dataName: string, options: DataRouterOptions): DataRouter;\n};\n\ntype EgoseSet = {\n  <K extends keyof GlobalOptions>(key: K, value: GlobalOptions[K]): void;\n  (options: { [K in keyof GlobalOptions]: GlobalOptions[K] }): void;\n};\n\ninterface Egose {\n  createRouter: CreateRouter;\n  createDataRouter: CreateDataRouter;\n  set: EgoseSet;\n  setGlobalOptions: typeof setGlobalOptions;\n  setGlobalOption: typeof setGlobalOption;\n  getGlobalOptions: typeof getGlobalOptions;\n  getGlobalOption: typeof getGlobalOption;\n  setModelOptions: typeof setModelOptions;\n  setModelOption: typeof setModelOption;\n  getModelOptions: typeof getModelOptions;\n  getModelOption: typeof getModelOption;\n  getModelNames: typeof getModelNames;\n  getModelJsonSchema: typeof getModelJsonSchema;\n  setDefaultModelOptions: typeof setDefaultModelOptions;\n  setDefaultModelOption: typeof setDefaultModelOption;\n  getDefaultModelOptions: typeof getDefaultModelOptions;\n  getDefaultModelOption: typeof getDefaultModelOption;\n  RootRouter: typeof RootRouter;\n  ModelRouter: typeof ModelRouter;\n  DataRouter: typeof DataRouter;\n}\n\nconst egose = middleware as typeof middleware & Egose;\n\negose.createRouter = function (modelName: string | RootRouterOptions, options: ModelRouterOptions | undefined) {\n  return isUndefined(options)\n    ? new RootRouter(modelName as RootRouterOptions)\n    : new ModelRouter(modelName as string, options);\n} as CreateRouter;\n\negose.createDataRouter = function (dataName: string, options: DataRouterOptions) {\n  return new DataRouter(dataName, options);\n};\n\negose.set = function <K extends keyof GlobalOptions>(keyOrOptions: K | GlobalOptions, value?: unknown) {\n  if (arguments.length === 2 && isString(keyOrOptions)) {\n    return setGlobalOption(keyOrOptions as K, value as GlobalOptions[K]);\n  }\n\n  if (arguments.length === 1 && isPlainObject(keyOrOptions)) {\n    return setGlobalOptions(keyOrOptions as GlobalOptions);\n  }\n};\n\negose.setGlobalOptions = setGlobalOptions;\negose.setGlobalOption = setGlobalOption;\negose.getGlobalOptions = getGlobalOptions;\negose.getGlobalOption = getGlobalOption;\negose.setModelOptions = setModelOptions;\negose.setModelOption = setModelOption;\negose.getModelOptions = getModelOptions;\negose.getModelOption = getModelOption;\negose.setDefaultModelOptions = setDefaultModelOptions;\negose.setDefaultModelOption = setDefaultModelOption;\negose.getDefaultModelOptions = getDefaultModelOptions;\negose.getDefaultModelOption = getDefaultModelOption;\negose.RootRouter = RootRouter;\negose.ModelRouter = ModelRouter;\negose.DataRouter = DataRouter;\n\nexport default egose;\n","import { Response, NextFunction } from 'express';\nimport JsonRouter from 'express-json-router';\nimport isString from 'lodash/isString';\nimport isArray from 'lodash/isArray';\nimport isFunction from 'lodash/isFunction';\nimport isPlainObject from 'lodash/isPlainObject';\nimport { setCore } from './core';\nimport Permission from './permission';\nimport { Request } from './interfaces';\nimport { createValidator, getDocPermissions } from './helpers';\nimport { getGlobalOption, getModelOption } from './options';\nimport { MIDDLEWARE, PERMISSIONS, PERMISSION_KEYS } from './symbols';\n\nexport default function macl() {\n  return async function (req: Request, res: Response, next: NextFunction) {\n    await setCore(req, res, next);\n  };\n}\n\nexport interface GuardModelConditionID {\n  type: string;\n  key: string;\n}\n\nexport interface GuardModelCondition {\n  modelName: string;\n  id: string | GuardModelConditionID;\n  condition: string | string[];\n}\n\nexport function guard(condition: string);\nexport function guard(conditions: string[]);\nexport function guard(conditionFunc: Function);\nexport function guard(modelCondition: GuardModelCondition);\n\nexport function guard(condition: unknown) {\n  return async (req: Request, res: Response, next: NextFunction) => {\n    const permissions = req[PERMISSIONS] as Permission;\n    let cond = condition;\n    let phas = (key) => permissions.has(key);\n\n    if (isPlainObject(condition)) {\n      const { modelName, id, condition: _cond } = condition as GuardModelCondition;\n      const svc = req.macl.getPublicService(modelName);\n      const select = getModelOption(modelName, `mandatoryFields.read`, undefined);\n\n      let _id = id;\n      if (isPlainObject(id)) {\n        const { type = 'param', key } = id as GuardModelConditionID;\n        if (type === 'param') {\n          _id = req.params[key];\n        } else if (type === 'query') {\n          const _qval = req.query[key];\n          if (isArray(_qval)) _id = _qval.length > 0 ? (_qval[0] as string) : null;\n          else _id = _qval as string;\n        } else {\n          _id = null;\n        }\n      }\n\n      if (!isString(_id) || !_id) {\n        return next(new JsonRouter.clientErrors.BadRequestError());\n      }\n\n      const result = await svc._read(_id, { select });\n      if (!result.success) {\n        return next(new JsonRouter.clientErrors.UnauthorizedError());\n      }\n\n      const docPermissions = getDocPermissions(modelName, result.data);\n      phas = (key) => permissions.has(key) || docPermissions[key];\n      cond = _cond;\n    }\n\n    const { stringHandler, arrayHandler } = createValidator(phas);\n    if (isString(cond)) {\n      if (stringHandler(cond)) return next();\n    } else if (isArray(cond)) {\n      if (arrayHandler(cond)) return next();\n    } else if (isFunction(cond)) {\n      const result = await cond.call(req, permissions);\n      if (!!result) return next();\n    }\n\n    next(new JsonRouter.clientErrors.UnauthorizedError());\n  };\n}\n","import { Response, NextFunction } from 'express';\nimport mongoose, { Model } from 'mongoose';\nimport assign from 'lodash/assign';\nimport castArray from 'lodash/castArray';\nimport compact from 'lodash/compact';\nimport difference from 'lodash/difference';\nimport forEach from 'lodash/forEach';\nimport get from 'lodash/get';\nimport intersection from 'lodash/intersection';\nimport isUndefined from 'lodash/isUndefined';\nimport isArray from 'lodash/isArray';\nimport isBoolean from 'lodash/isBoolean';\nimport isEmpty from 'lodash/isEmpty';\nimport isFunction from 'lodash/isFunction';\nimport isNaN from 'lodash/isNaN';\nimport isPlainObject from 'lodash/isPlainObject';\nimport isString from 'lodash/isString';\nimport isNil from 'lodash/isNil';\nimport noop from 'lodash/noop';\nimport pick from 'lodash/pick';\nimport set from 'lodash/set';\nimport reduce from 'lodash/reduce';\nimport { getGlobalOption, getModelOption, getExactModelOption } from './options';\nimport { getModelRef } from './meta';\nimport {\n  Populate,\n  Projection,\n  Filter,\n  MiddlewareContext,\n  Validation,\n  Request,\n  SelectAccess,\n  RouteGuardAccess,\n  DocPermissionsAccess,\n  BaseFilterAccess,\n  DecorateAccess,\n  DecorateAllAccess,\n  ValidateAccess,\n  PrepareAccess,\n  TransformAccess,\n  FinalizeAccess,\n  Task,\n} from './interfaces';\nimport Permission, { Permissions } from './permission';\nimport { Service, PublicService, Base } from './services';\nimport {\n  normalizeSelect,\n  createValidator,\n  getDocPermissions,\n  setDocValue,\n  toObject,\n  pickDocFields,\n  genPagination,\n} from './helpers';\nimport { copyAndDepopulate } from './processors';\nimport { isDocument, arrToObj } from './lib';\nimport { MIDDLEWARE, PERMISSIONS, PERMISSION_KEYS } from './symbols';\nimport { Cache } from './cache';\n\nexport class Core {\n  private req: Request;\n  private caches: {\n    baseFilter: Cache<string, any>;\n  };\n\n  constructor(req: Request) {\n    this.req = req;\n    this.caches = {\n      baseFilter: new Cache<string, any>(),\n    };\n  }\n\n  getIdentifier(modelName: string) {\n    const identifier = getModelOption(modelName, 'identifier');\n\n    if (isFunction(identifier)) {\n      return null;\n    }\n\n    if (isString(identifier)) {\n      return identifier;\n    }\n\n    return '_id';\n  }\n\n  async genIDFilter(modelName: string, id: string) {\n    const identifier = getModelOption(modelName, 'identifier');\n\n    if (isString(identifier)) {\n      return { [identifier]: id };\n    }\n\n    if (isFunction(identifier)) {\n      return identifier.call(this.req, id);\n    }\n\n    return { _id: id };\n  }\n\n  async genFilter(modelName: string, access: BaseFilterAccess = 'read', _filter: Filter = null): Promise<Filter> {\n    const permissions = this.getGlobalPermissions();\n\n    let overrideFilterFn = getModelOption(modelName, `overrideFilter.${access}`, null);\n    if (isFunction(overrideFilterFn)) {\n      _filter = await overrideFilterFn.call(this.req, _filter, permissions);\n    }\n\n    let baseFilterFn = getModelOption(modelName, `baseFilter.${access}`, null);\n    if (!isFunction(baseFilterFn)) return _filter || {};\n\n    let baseFilter = null;\n    const cacheKey = `${modelName}_baseFilter_${access}`;\n    if (this.caches.baseFilter.has(cacheKey)) {\n      baseFilter = this.caches.baseFilter.get(cacheKey);\n    } else {\n      baseFilter = await baseFilterFn.call(this.req, permissions);\n    }\n\n    if (baseFilter === false) return false;\n    if (baseFilter === true || isEmpty(baseFilter)) return _filter || {};\n    if (!_filter) return baseFilter;\n\n    const result = { $and: [baseFilter, _filter] };\n    this.caches.baseFilter.set(cacheKey, result);\n    return result;\n  }\n\n  private removePrefix(str, prefix) {\n    if (!prefix) return str;\n\n    if (str.startsWith(prefix)) {\n      return str.substring(prefix.length);\n    }\n    return str;\n  }\n\n  async genAllowedFields(modelName: string, doc: any, access: SelectAccess, baseFields = []) {\n    let fields = [...(baseFields ?? [])];\n\n    const permissionSchema = getModelOption(modelName, 'permissionSchema');\n    if (!permissionSchema) return fields;\n\n    const modelPermissionPrefix = getModelOption(modelName, 'modelPermissionPrefix', '');\n\n    const permissions = this.getGlobalPermissions();\n    const docPermissions = getDocPermissions(modelName, doc);\n    // get keys from permission schema as some fields might not be filled when created\n    const keys = Object.keys(permissionSchema);\n    // const keys = getModelKeys(doc);\n\n    const phas = (key) => permissions.has(key) || docPermissions[this.removePrefix(key, modelPermissionPrefix)];\n    const { stringHandler, arrayHandler } = createValidator(phas);\n\n    for (let x = 0; x < keys.length; x++) {\n      const key = keys[x];\n      if (baseFields.includes(key)) continue;\n\n      const val = permissionSchema[key];\n      const value = (val && val[access]) || val;\n\n      if (isBoolean(value)) {\n        if (value) fields.push(key);\n      } else if (isString(value)) {\n        if (stringHandler(value)) fields.push(key);\n      } else if (isArray(value)) {\n        if (arrayHandler(value)) fields.push(key);\n      } else if (isFunction(value)) {\n        if (await value.call(this.req, permissions, docPermissions)) fields.push(key);\n      }\n    }\n\n    return fields;\n  }\n\n  async pickAllowedFields(modelName: string, doc: any, access: SelectAccess, baseFields = []) {\n    const allowed = await this.genAllowedFields(modelName, doc, access, baseFields);\n    return pickDocFields(doc, allowed);\n  }\n\n  async genSelect(\n    modelName: string,\n    access: SelectAccess,\n    targetFields: Projection = null,\n    skipChecks = true,\n    subPaths = [],\n  ) {\n    let normalizedSelect = normalizeSelect(targetFields);\n    let fields = [];\n\n    const permissionSchema = getModelOption(modelName, ['permissionSchema'].concat(subPaths).join('.'));\n    if (!permissionSchema) return fields;\n\n    const permissions = this.getGlobalPermissions();\n\n    const phas = (key) => {\n      if (permissions.prop(key)) {\n        if (permissions.has(key)) return true;\n      } else if (skipChecks) {\n        return true;\n      }\n\n      return false;\n    };\n\n    const { stringHandler, arrayHandler } = createValidator(phas);\n\n    const keys = Object.keys(permissionSchema);\n    for (let x = 0; x < keys.length; x++) {\n      const key = keys[x];\n      const val = permissionSchema[key];\n      const value = val[access] || val;\n\n      if (isBoolean(value)) {\n        if (value) fields.push(key);\n      } else if (isString(value)) {\n        if (stringHandler(value)) fields.push(key);\n      } else if (isArray(value)) {\n        if (arrayHandler(value)) fields.push(key);\n      } else if (isFunction(value)) {\n        if (await value.call(this.req, permissions)) fields.push(key);\n      }\n    }\n\n    if (normalizedSelect.length > 0) {\n      const excludeid = normalizedSelect.includes('-_id');\n      const excludeall = normalizedSelect.every((v) => v.startsWith('-'));\n      if (excludeall) {\n        normalizedSelect = normalizedSelect.map((v) => v.substring(1));\n        fields = difference(fields, normalizedSelect);\n        if (excludeid) fields.push('-_id');\n      } else {\n        fields = intersection(normalizedSelect, fields.concat(excludeid ? '-_id' : '_id'));\n      }\n    }\n\n    const mandatoryFields = subPaths.length > 0 ? [] : getModelOption(modelName, `mandatoryFields.${access}`, []);\n    return fields.concat(mandatoryFields);\n  }\n\n  async genPopulate(modelName: string, access: SelectAccess | BaseFilterAccess = 'read', _populate: any = null) {\n    if (!_populate) return [];\n\n    let populate = Array.isArray(_populate) ? _populate : [_populate];\n    populate = compact(\n      await Promise.all(\n        populate.map(async (p: Populate | string) => {\n          const ret: Populate = isString(p)\n            ? { path: p }\n            : {\n                path: p.path,\n                select: normalizeSelect(p.select),\n              };\n\n          const refModelName = getModelRef(modelName, ret.path);\n          if (!refModelName) return null;\n\n          if (!isString(p) && p.access) access = p.access;\n          ret.select = await this.genSelect(refModelName, access as SelectAccess, ret.select, false);\n          const filter = await this.genFilter(refModelName, access as BaseFilterAccess, null);\n          if (filter === false) return null;\n\n          ret.match = filter;\n          return ret;\n        }),\n      ),\n    );\n\n    return populate;\n  }\n\n  async validate(modelName: string, allowedData: any, access: ValidateAccess, context: MiddlewareContext) {\n    const validate = getModelOption(modelName, `validate.${access}`, null);\n\n    if (isFunction(validate)) {\n      const permissions = this.getGlobalPermissions();\n      return validate.call(this.req, allowedData, permissions, context) as boolean | any[];\n    } else if (isBoolean(validate) || isArray(validate)) {\n      return validate;\n    } else {\n      return true;\n    }\n  }\n\n  async prepare(modelName: string, allowedData: any, access: PrepareAccess, context: MiddlewareContext) {\n    const prepare = getModelOption(modelName, `prepare.${access}`, null);\n    const permissions = this.getGlobalPermissions();\n    return this.callMiddleware(prepare, allowedData, permissions, context);\n  }\n\n  async transform(modelName: string, doc: any, access: TransformAccess, context: MiddlewareContext) {\n    const transform = getModelOption(modelName, `transform.${access}`, null);\n    const permissions = this.getGlobalPermissions();\n    return this.callMiddleware(transform, doc, permissions, context);\n  }\n\n  async finalize(modelName: string, doc: any, access: FinalizeAccess, context: MiddlewareContext) {\n    const finalize = getModelOption(modelName, `finalize.${access}`, null);\n    const permissions = this.getGlobalPermissions();\n    return this.callMiddleware(finalize, doc, permissions, context);\n  }\n\n  async changes(modelName: string, doc: any, context: MiddlewareContext) {\n    const changeOptions = getModelOption(modelName, `change`, {});\n\n    for (let x = 0; x < context.modifiedPaths.length; x++) {\n      const mpath = context.modifiedPaths[x];\n\n      if (isFunction(changeOptions[mpath])) {\n        await changeOptions[mpath].call(\n          this.req,\n          context.originalDocObject[mpath],\n          doc[mpath],\n          context.changes.filter((di) => di.path.length > 0 && di.path[0] === mpath),\n          context,\n        );\n      }\n    }\n  }\n\n  async genDocPermissions(modelName: string, doc: any, access: DocPermissionsAccess, context: MiddlewareContext) {\n    const docPermissionsFn = getModelOption(modelName, `docPermissions.${access}`, null);\n    let docPermissions = {};\n\n    if (isFunction(docPermissionsFn)) {\n      const permissions = this.getGlobalPermissions();\n      try {\n        docPermissions = await docPermissionsFn.call(this.req, doc, permissions, context);\n      } catch {}\n    }\n\n    return docPermissions;\n  }\n\n  addEmptyPermissions(modelName: string, doc: any) {\n    const docPermissionField = getModelOption(modelName, 'permissionField');\n    // Mongoose `toObject` method omits empty values\n    setDocValue(doc, docPermissionField, { _view: { $: '_' }, _edit: { $: '_' } });\n    return doc;\n  }\n\n  async addDocPermissions(modelName: string, doc: any, access: DocPermissionsAccess, context: MiddlewareContext) {\n    const docPermissionField = getModelOption(modelName, 'permissionField');\n    const docPermissions = await this.genDocPermissions(modelName, doc, access, context);\n    setDocValue(doc, docPermissionField, docPermissions);\n    return doc;\n  }\n\n  async addFieldPermissions(modelName: string, doc: any, access: DocPermissionsAccess, context: MiddlewareContext) {\n    const svc = this.req.macl.getService(modelName);\n    const docPermissionField = getModelOption(modelName, 'permissionField');\n\n    // TODO: do we need falsy fields as well?\n    // const permissionSchemaKeys = getModelOption(modelName, 'permissionSchemaKeys');\n\n    let readExists = true;\n    let updateExists = true;\n\n    if (access !== 'read') {\n      readExists = (await svc.exists({ _id: doc._id }, { access: 'read' })).data;\n    }\n\n    if (access !== 'update') {\n      updateExists = (await svc.exists({ _id: doc._id }, { access: 'update' })).data;\n    }\n\n    const [views, edits] = await Promise.all([\n      readExists ? svc.genAllowedFields(doc, 'read') : [],\n      updateExists ? svc.genAllowedFields(doc, 'update') : [],\n    ]);\n\n    const viewObj = reduce(\n      views,\n      (ret, view) => {\n        ret[view] = true;\n        return ret;\n      },\n      {},\n    );\n\n    const editObj = reduce(\n      edits,\n      (ret, view) => {\n        ret[view] = true;\n        return ret;\n      },\n      {},\n    );\n\n    setDocValue(doc, `${docPermissionField}._view`, viewObj);\n    setDocValue(doc, `${docPermissionField}._edit`, editObj);\n\n    return doc;\n  }\n\n  async decorate(modelName: string, doc: any, access: DecorateAccess, context: MiddlewareContext) {\n    const decorate = getModelOption(modelName, `decorate.${access}`, null);\n\n    const permissions = this.getGlobalPermissions();\n    context.docPermissions = getDocPermissions(modelName, doc);\n\n    return this.callMiddleware(decorate, doc, permissions, context);\n  }\n\n  async decorateAll(modelName: string, docs: any[], access: DecorateAllAccess, context: MiddlewareContext) {\n    const decorateAll = getModelOption(modelName, `decorateAll.${access}`, null);\n    const permissions = this.getGlobalPermissions();\n\n    return this.callMiddleware(decorateAll, docs, permissions, context);\n  }\n\n  runTasks(modelName: string, docObject: any, task: Task | Task[]) {\n    const tasks = compact(castArray(task));\n    if (tasks.length === 0) return docObject;\n\n    forEach(tasks, (task) => {\n      const { type, args, options } = task;\n\n      switch (type) {\n        case 'COPY_AND_DEPOPULATE':\n          docObject = copyAndDepopulate(docObject, args, options);\n          break;\n      }\n    });\n\n    return docObject;\n  }\n\n  getPermissions() {\n    const permissionField = getGlobalOption('permissionField');\n    return new Permission(this.req[permissionField] || {});\n  }\n\n  async setPermissions() {\n    const permissionField = getGlobalOption('permissionField');\n    if (this.req[permissionField]) return;\n\n    const globalPermissions = getGlobalOption('globalPermissions');\n    if (isFunction(globalPermissions)) {\n      const gp = await globalPermissions.call(this.req, this.req);\n      if (isPlainObject(gp)) this.req[permissionField] = gp;\n      else if (isArray(gp)) this.req[permissionField] = arrToObj(gp);\n      else if (isString(gp)) this.req[permissionField] = { [gp]: true };\n    }\n  }\n\n  async canActivate(routeGuard: Validation) {\n    let allowed = false;\n\n    const permissions = this.getGlobalPermissions();\n    const phas = (key) => permissions.has(key);\n    const { stringHandler, arrayHandler } = createValidator(phas);\n\n    if (isBoolean(routeGuard)) {\n      allowed = routeGuard === true;\n    } else if (isString(routeGuard)) {\n      allowed = stringHandler(routeGuard);\n    } else if (isArray(routeGuard)) {\n      allowed = arrayHandler(routeGuard);\n    } else if (isFunction(routeGuard)) {\n      allowed = routeGuard.call(this.req, permissions);\n    }\n\n    return allowed;\n  }\n\n  async isAllowed(modelName: string, access: RouteGuardAccess | string) {\n    if (access.startsWith('subs')) {\n      const keys = access.split('.');\n      if (keys.length < 3) {\n        return false;\n      }\n\n      const [, field, op] = keys;\n      const subOption = getExactModelOption(modelName, `routeGuard.${access}`);\n      if (isUndefined(subOption)) {\n        const subFieldOption = getExactModelOption(modelName, `routeGuard.subs.${field}`);\n        if (isUndefined(subFieldOption)) {\n          const opOption = getModelOption(modelName, `routeGuard.${op}`);\n          return this.canActivate(opOption);\n        }\n\n        return this.canActivate(subFieldOption);\n      }\n\n      return this.canActivate(subOption);\n    }\n\n    const routeGuard = getModelOption(modelName, `routeGuard.${access}`);\n    return this.canActivate(routeGuard);\n  }\n\n  getService(modelName: string) {\n    return new Service(this.req, modelName);\n  }\n\n  getPublicService(modelName: string) {\n    return new PublicService(this.req, modelName);\n  }\n\n  service(modelName: string) {\n    return this.getPublicService(modelName);\n  }\n\n  svc(modelName: string) {\n    return this.getPublicService(modelName);\n  }\n\n  private getGlobalPermissions() {\n    return this.req[PERMISSIONS] as Permission;\n  }\n\n  private async callMiddleware(\n    middleware: Function | Function[],\n    doc: any,\n    permissions: Permissions,\n    context: MiddlewareContext,\n  ) {\n    middleware = castArray(middleware);\n    for (let x = 0; x < middleware.length; x++) {\n      if (isFunction(middleware[x])) {\n        doc = await middleware[x].call(this.req, doc, permissions, context);\n      }\n    }\n\n    return doc;\n  }\n}\n\nexport async function setCore(req: Request, res: Response, next: NextFunction) {\n  if (req[MIDDLEWARE]) return next();\n\n  const core = new Core(req);\n  await core.setPermissions();\n\n  req.macl = core;\n  req[PERMISSIONS] = core.getPermissions();\n  req[PERMISSION_KEYS] = req[PERMISSIONS].$_permissionKeys;\n  req[MIDDLEWARE] = true;\n\n  next();\n}\n","import get from 'lodash/get';\nimport set from 'lodash/set';\nimport assign from 'lodash/assign';\n\nexport class OptionsManager<T1 extends object, T2 extends object> {\n  private readonly defaultOptions: T1;\n  private currentOptions: T1;\n  private listeners: { [key in keyof T1]?: Function };\n\n  constructor(defaultOptions: T1) {\n    this.defaultOptions = defaultOptions;\n    this.listeners = {};\n    const _this = this;\n\n    this.currentOptions = new Proxy({} as T1, {\n      set(target, key, value) {\n        const keystr = String(key);\n        const oldvalue = target[key];\n        target[key] = value;\n        _this.listeners[keystr] && _this.listeners[keystr].call(_this, value, keystr, target, oldvalue);\n        return true;\n      },\n    });\n  }\n\n  build() {\n    this.assign(this.defaultOptions);\n    return this;\n  }\n\n  get<K extends keyof T2>(key: K | string, defaultValue?: T2[K]) {\n    return get(this.currentOptions, key, defaultValue);\n  }\n\n  set<K extends keyof T2>(key: K | string, value: T2[K]) {\n    set(this.currentOptions, key, value);\n  }\n\n  fetch() {\n    return { ...this.currentOptions };\n  }\n\n  assign(options: T1) {\n    assign(this.currentOptions, options);\n  }\n\n  onchange<K extends keyof T1>(key: K | string, func: Function) {\n    set(this.listeners, key, func);\n    return this;\n  }\n}\n","import { OptionsManager } from './manager';\nimport { GlobalOptions } from '../interfaces';\n\nconst globalOptions = new OptionsManager<GlobalOptions, GlobalOptions>({\n  permissionField: '_permissions',\n  globalPermissions: () => ({}),\n}).build();\n\nexport const setGlobalOptions = (options: GlobalOptions) => {\n  globalOptions.assign(options);\n};\n\nexport const setGlobalOption = <K extends keyof GlobalOptions>(key: K, value: GlobalOptions[K]) => {\n  globalOptions.set(key, value);\n};\n\nexport const getGlobalOptions = () => {\n  return globalOptions.fetch();\n};\n\nexport const getGlobalOption = <K extends keyof GlobalOptions>(key: K, defaultValue?: GlobalOptions[K]) => {\n  return globalOptions.get(key, defaultValue);\n};\n","import mongoose from 'mongoose';\nimport mschema2Jsonschema from 'mongoose-schema-jsonschema';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\nimport isNil from 'lodash/isNil';\nimport isBoolean from 'lodash/isBoolean';\nimport isFunction from 'lodash/isFunction';\nimport isString from 'lodash/isString';\nimport isArray from 'lodash/isArray';\nimport forEach from 'lodash/forEach';\nimport { addLeadingSlash } from '../lib';\nimport { OptionsManager } from './manager';\nimport { ModelRouterOptions, DefaultModelRouterOptions, ExtendedModelRouterOptions } from '../interfaces';\nimport { getDefaultModelOption, getDefaultModelOptions } from './default-model-options';\n\nmschema2Jsonschema(mongoose);\nconst pluralize = mongoose.pluralize();\n\ntype ExtendedModel = mongoose.Model<any> & { jsonSchema: Function };\n\nconst defaultModelOptions: ModelRouterOptions = {\n  basePath: null,\n  mandatoryFields: [],\n};\n\nconst modelOptions: Record<string, OptionsManager<ModelRouterOptions, ExtendedModelRouterOptions>> = {};\n\nconst modelJsonSchemas: Record<string, any> = {};\n\nconst createModelOptions = (modelName: string) => {\n  const model = mongoose.model(modelName) as ExtendedModel;\n\n  // TODO: display warning that the model does not exist\n  if (!model) return null;\n\n  const manager = new OptionsManager<ModelRouterOptions, ExtendedModelRouterOptions>({\n    ...defaultModelOptions,\n    modelName,\n  });\n\n  manager\n    .onchange('permissionSchema', function (newval, key, target, oldval) {\n      const schemaKeys = Object.keys(newval);\n\n      const globalPermissionKeys = {};\n      const modelPermissionKeys = {};\n\n      const stringHandler = (str) =>\n        str\n          .trim()\n          .split(' ')\n          .some((v) => v.startsWith(target.modelPermissionPrefix));\n\n      const arrayHandler = (arr) =>\n        arr.some((item) => {\n          if (isString(item)) return stringHandler(item);\n          else if (isArray(item)) return arrayHandler(item);\n          else return true;\n        });\n\n      forEach(schemaKeys, (skey) => {\n        forEach(newval[skey], (val, key) => {\n          if (!isArray(globalPermissionKeys[key])) {\n            globalPermissionKeys[key] = [];\n          }\n\n          if (!isArray(modelPermissionKeys[key])) {\n            modelPermissionKeys[key] = [];\n          }\n\n          if (isBoolean(val)) {\n            globalPermissionKeys[key].push(skey);\n          } else {\n            if (target.modelPermissionPrefix) {\n              if (isString(val)) {\n                const hasModelPermission = stringHandler(val);\n                if (hasModelPermission) {\n                  modelPermissionKeys[key].push(skey);\n                } else {\n                  globalPermissionKeys[key].push(skey);\n                }\n              } else if (isArray(val)) {\n                const hasModelPermission = arrayHandler(val);\n                if (hasModelPermission) {\n                  modelPermissionKeys[key].push(skey);\n                } else {\n                  globalPermissionKeys[key].push(skey);\n                }\n              } else if (isFunction(val)) {\n                modelPermissionKeys[key].push(skey);\n              }\n            } else {\n              modelPermissionKeys[key].push(skey);\n            }\n          }\n        });\n      });\n\n      target._permissionSchemaKeys = schemaKeys;\n      target._globalPermissionKeys = globalPermissionKeys;\n      target._modelPermissionKeys = modelPermissionKeys;\n    })\n    .onchange('basePath', function (newval, key, target, oldval) {\n      let basePath = '';\n      if (isNil(newval)) {\n        basePath = `/${pluralize(modelName)}`;\n      } else if (isString(newval)) {\n        basePath = addLeadingSlash(basePath);\n      }\n\n      target[key] = basePath;\n    })\n    .build();\n\n  modelJsonSchemas[modelName] = model.jsonSchema();\n  return manager;\n};\n\nconst getOrCreateModelOptions = (modelName: string) => {\n  let manager = modelOptions[modelName];\n  if (!manager) {\n    manager = createModelOptions(modelName);\n    modelOptions[modelName] = manager;\n  }\n\n  return manager;\n};\n\nexport const setModelOptions = (modelName: string, options: ModelRouterOptions) => {\n  const manager = getOrCreateModelOptions(modelName);\n  const modelOptions = manager.fetch();\n  const defaultOptions = getDefaultModelOptions();\n\n  manager.assign({ ...modelOptions, ...defaultOptions, ...options });\n};\n\nexport const setModelOption = <K extends keyof ExtendedModelRouterOptions>(\n  modelName: string,\n  key: K,\n  value: ExtendedModelRouterOptions[K],\n) => {\n  const manager = getOrCreateModelOptions(modelName);\n\n  manager.set(key, value);\n};\n\nexport const getModelOptions = (modelName: string) => {\n  const manager = getOrCreateModelOptions(modelName);\n  return manager.fetch();\n};\n\nexport const getModelOption = <K extends keyof ExtendedModelRouterOptions>(\n  modelName: string,\n  key: K | string,\n  defaultValue?: ExtendedModelRouterOptions[K],\n) => {\n  const manager = getOrCreateModelOptions(modelName);\n  const defaultModelValue = getDefaultModelOption(key as keyof DefaultModelRouterOptions, defaultValue);\n\n  const keys = key.split('.');\n  if (keys.length === 1) return manager.get(key, defaultModelValue);\n\n  let option = manager.get(key, undefined);\n  if (option) return option;\n\n  const parentKey = keys.slice(0, -1).join('.') as keyof ModelRouterOptions;\n  option = manager.get(`${parentKey}.default`);\n\n  if (option === undefined) option = manager.get(parentKey, defaultModelValue);\n  return option;\n};\n\nexport const getExactModelOption = <K extends keyof ExtendedModelRouterOptions>(modelName: string, key: K | string) => {\n  const manager = getOrCreateModelOptions(modelName);\n  const defaultModelValue = getDefaultModelOption(key as keyof DefaultModelRouterOptions);\n  return manager.get(key, defaultModelValue);\n};\n\nexport const getModelNames = () => {\n  return Object.keys(modelOptions);\n};\n\nexport const getModelJsonSchema = (modelName: string) => {\n  return modelJsonSchemas[modelName];\n};\n","import { Document, Schema } from 'mongoose';\nimport isFunction from 'lodash/isFunction';\nimport isPlainObject from 'lodash/isPlainObject';\n\nexport class PermissionDoc extends Document {\n  _doc: any;\n\n  constructor(...args: any[]) {\n    super(...args);\n    this._doc = {};\n  }\n}\n\nexport const isSchema = (val) => val instanceof Schema;\nexport const isObjectIdType = (val) => val === 'ObjectId' || val === Schema.Types.ObjectId;\nexport const isReference = (val) => isPlainObject(val) && val.ref && isObjectIdType(val.type);\n\nexport const isPromise = function isPromise(val) {\n  return val && val.then && isFunction(val.then);\n};\n\nexport const isDocument = function isDocument(doc): doc is PermissionDoc {\n  return doc instanceof Document;\n};\n\nexport const toAsyncFn = function toAsyncFn(fn: Function, defaultValue?: any) {\n  if (!fn) return () => Promise.resolve(defaultValue);\n  return function asyncFn(...args) {\n    const ret = fn.apply(this, args);\n    return isPromise(ret) ? ret : Promise.resolve(ret);\n  };\n};\n\nexport const mapValuesAsync = async function mapValuesAsync(object, asyncFn) {\n  return Object.fromEntries(\n    await Promise.all(Object.entries(object).map(async ([key, value]) => [key, await asyncFn(value, key, object)])),\n  );\n};\n\nexport const arrToObj = (arr: string[]): any => {\n  const obj = {};\n  for (let x = 0; x < arr.length; x++) {\n    obj[arr[x]] = true;\n  }\n  return obj;\n};\n\nexport const addLeadingSlash = (str) => (str.startsWith('/') ? str : `/${str}`);\n\nexport const removeConsecutiveSlashesFromUrl = (url) => url.replace(/\\/{2,}/g, '/');\n\nexport const processUrl = (url) => addLeadingSlash(removeConsecutiveSlashesFromUrl(url));\n","import { OptionsManager } from './manager';\nimport { DefaultModelRouterOptions, ExtendedDefaultModelRouterOptions } from '../interfaces';\n\nexport const DEFAULT_QUERY_PATH = '__query';\nexport const DEFAULT_MUTATION_PATH = '__mutation';\n\nconst defaultModelOptions = new OptionsManager<DefaultModelRouterOptions, ExtendedDefaultModelRouterOptions>({\n  listHardLimit: 1000,\n  permissionField: '_permissions',\n  idParam: 'id',\n  identifier: '_id',\n  parentPath: '/',\n  queryPath: DEFAULT_QUERY_PATH,\n  mutationPath: DEFAULT_MUTATION_PATH,\n  routeGuard: false,\n  modelPermissionPrefix: '',\n}).build();\n\nexport const setDefaultModelOptions = (options: DefaultModelRouterOptions) => {\n  defaultModelOptions.assign(options);\n};\n\nexport const setDefaultModelOption = <K extends keyof ExtendedDefaultModelRouterOptions>(\n  key: K,\n  value: ExtendedDefaultModelRouterOptions[K],\n) => {\n  defaultModelOptions.set(key, value);\n};\n\nexport const getDefaultModelOptions = () => {\n  return defaultModelOptions.fetch();\n};\n\nexport const getDefaultModelOption = <K extends keyof ExtendedDefaultModelRouterOptions>(\n  key: K,\n  defaultValue?: ExtendedDefaultModelRouterOptions[K],\n) => {\n  return defaultModelOptions.get(key, defaultValue);\n};\n","import mongoose from 'mongoose';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\nimport isNil from 'lodash/isNil';\nimport isBoolean from 'lodash/isBoolean';\nimport isFunction from 'lodash/isFunction';\nimport isString from 'lodash/isString';\nimport isArray from 'lodash/isArray';\nimport forEach from 'lodash/forEach';\nimport { addLeadingSlash } from '../lib';\nimport { OptionsManager } from './manager';\nimport { DataRouterOptions } from '../interfaces';\n\nconst pluralize = mongoose.pluralize();\n\nconst dataOptions: Record<string, OptionsManager<DataRouterOptions, DataRouterOptions>> = {};\n\nconst defaultDataOptions: DataRouterOptions = {\n  basePath: null,\n  queryPath: '__query',\n};\n\nconst createDataOptions = (dataName: string) => {\n  const manager = new OptionsManager<DataRouterOptions, DataRouterOptions>({\n    ...defaultDataOptions,\n    dataName,\n  });\n\n  manager\n    .onchange('basePath', function (newval, key, target, oldval) {\n      let basePath = '';\n      if (isNil(newval)) {\n        basePath = `/${pluralize(dataName)}`;\n      } else if (isString(newval)) {\n        basePath = addLeadingSlash(basePath);\n      }\n\n      target[key] = basePath;\n    })\n    .build();\n\n  return manager;\n};\n\nconst getOrCreateDataOptions = (dataName: string) => {\n  let manager = dataOptions[dataName];\n  if (!manager) {\n    manager = createDataOptions(dataName);\n    dataOptions[dataName] = manager;\n  }\n\n  return manager;\n};\n\nexport const setDataOptions = (dataName: string, options: DataRouterOptions) => {\n  const manager = getOrCreateDataOptions(dataName);\n  const dataOptions = manager.fetch();\n\n  manager.assign({ ...dataOptions, ...options });\n};\n\nexport const setDataOption = <K extends keyof DataRouterOptions>(\n  dataName: string,\n  key: K,\n  value: DataRouterOptions[K],\n) => {\n  const manager = getOrCreateDataOptions(dataName);\n\n  manager.set(key, value);\n};\n\nexport const getDataOptions = (dataName: string) => {\n  const manager = getOrCreateDataOptions(dataName);\n  return manager.fetch();\n};\n\nexport const getDataOption = <K extends keyof DataRouterOptions>(\n  dataName: string,\n  key: K | string,\n  defaultValue?: DataRouterOptions[K],\n) => {\n  const manager = getOrCreateDataOptions(dataName);\n\n  const keys = key.split('.');\n  if (keys.length === 1) return manager.get(key, defaultValue);\n\n  let option = manager.get(key, undefined);\n  if (option) return option;\n\n  const parentKey = keys.slice(0, -1).join('.') as keyof DataRouterOptions;\n  option = manager.get(`${parentKey}.default`);\n\n  if (option === undefined) option = manager.get(parentKey, defaultValue);\n  return option;\n};\n\nexport const getDataNames = () => {\n  return Object.keys(dataOptions);\n};\n","import mongoose from 'mongoose';\nimport get from 'lodash/get';\nimport keys from 'lodash/keys';\nimport forEach from 'lodash/forEach';\nimport { buildRefs, buildSubPaths } from './helpers';\n\nlet isReady = false;\nconst modelRefs = {};\nconst modelSubs: { [key: string]: string[] } = {};\nconst modelAtts = {};\nconst listeners = [];\n\nexport const checkIfReady = () => isReady;\nexport const listen = (fn) => listeners.push(fn);\n\nlet _interval = setInterval(() => {\n  const modelNames = Object.keys(mongoose.models);\n  modelNames.forEach((modelName) => {\n    const schema = mongoose.models[modelName].schema;\n    // @ts-ignore\n    const references = buildRefs(schema.tree);\n    // @ts-ignore\n    const subPaths = buildSubPaths(schema.tree);\n    modelRefs[modelName] = references;\n    modelSubs[modelName] = subPaths;\n    modelAtts[modelName] = keys(schema.obj);\n  });\n\n  if (modelNames.length > 0) {\n    clearInterval(_interval);\n    forEach(listeners, (listener) => {\n      listener();\n    });\n    isReady = true;\n  }\n}, 10);\n\nexport const getModelRef = (modelName: string, refPath: string) => get(modelRefs, `${modelName}.${refPath}`, null);\nexport const getModelSub = (modelName: string) => get(modelSubs, modelName, []) as string[];\nexport const getModelAtt = (modelName: string) => get(modelAtts, modelName, []);\n","import { Schema } from 'mongoose';\nimport sift from 'sift';\nimport filter from 'lodash/filter';\nimport find from 'lodash/find';\nimport isMatch from 'lodash/isMatch';\n\nexport const filterCollection = (collection, predicate) => {\n  return filter(collection, sift(predicate));\n};\n\nexport const findElement = (collection, predicate) => {\n  return find(collection, sift(predicate));\n};\n\nexport const matchElement = (element, predicate) => {\n  return isMatch(element, sift(predicate));\n};\n\ntype DocId = string | Schema.Types.ObjectId;\n\nexport const findElementById = (collection, id: DocId) => {\n  return findElement(collection, { _id: id });\n};\n","import { Document, Schema } from 'mongoose';\nimport isPlainObject from 'lodash/isPlainObject';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\nimport pick from 'lodash/pick';\nimport keys from 'lodash/keys';\nimport isArray from 'lodash/isArray';\nimport filter from 'lodash/filter';\nimport find from 'lodash/find';\nimport isMatch from 'lodash/isMatch';\nimport isString from 'lodash/isString';\nimport { isDocument, isPromise } from '../lib';\nimport { getModelOption } from '../options';\nimport { SubPopulate } from '../interfaces';\nimport { normalizeSelect } from './query';\n\nexport function getDocValue(doc, path, defalutValue) {\n  if (isDocument(doc)) {\n    return get(doc._doc, path, defalutValue);\n  } else if (isPlainObject(doc)) {\n    return get(doc, path, defalutValue);\n  }\n}\n\nexport function setDocValue(doc, path, value) {\n  if (isDocument(doc)) {\n    set(doc._doc, path, value);\n  } else if (isPlainObject(doc)) {\n    set(doc, path, value);\n  }\n}\n\nexport function getDocPermissions(modelName, doc) {\n  const docPermissionField = getModelOption(modelName, 'permissionField');\n  return getDocValue(doc, docPermissionField, {});\n}\n\nexport function getModelKeys(doc) {\n  return Object.keys(isDocument(doc) ? doc._doc : doc);\n}\n\nexport function toObject(doc) {\n  return isDocument(doc) ? doc.toObject() : doc;\n}\n\nexport function pickDocFields(doc, fields = []) {\n  if (isDocument(doc)) {\n    doc._doc = pick(doc._doc, fields);\n    return doc;\n  } else {\n    return pick(doc, fields);\n  }\n}\n\nexport async function populateDoc(doc: Document, target) {\n  let p = doc.populate(target);\n  if (isPromise(p)) return p;\n\n  // for backward compatibility, utilize the 'execPopulate' method to populate the target fields.\n  return 'execPopulate' in p && (p as any).execPopulate();\n}\n\nexport const genSubPopulate = (sub: string, popul: any) => {\n  if (!popul) return [];\n\n  let populate = isArray(popul) ? popul : [popul];\n  populate = populate.map((p: SubPopulate | string) => {\n    const ret: SubPopulate = isString(p)\n      ? { path: `${sub}.${p}` }\n      : {\n          path: `${sub}.${p.path}`,\n          select: normalizeSelect(p.select),\n        };\n\n    return ret;\n  });\n\n  return populate;\n};\n","import isNaN from 'lodash/isNaN';\nimport isPlainObject from 'lodash/isPlainObject';\nimport isString from 'lodash/isString';\nimport isNil from 'lodash/isNil';\nimport flattenDeep from 'lodash/flattenDeep';\nimport reduce from 'lodash/reduce';\nimport { Projection, KeyValueProjection } from '../interfaces';\n\nexport function genPagination(\n  {\n    skip,\n    limit,\n    page,\n    pageSize,\n  }: {\n    skip?: number | string;\n    limit?: number | string;\n    page?: number | string;\n    pageSize?: number | string;\n  },\n  hardLimit,\n) {\n  let _skip = 0;\n  let _limit = Number(limit ?? pageSize);\n  if (isNaN(_limit) || _limit > hardLimit) _limit = hardLimit;\n\n  if (!isNil(skip)) {\n    _skip = Number(skip);\n  } else if (!isNil(page)) {\n    const npage = Number(page);\n    if (npage > 1) _skip = (npage - 1) * _limit;\n  }\n\n  return { skip: _skip, limit: _limit };\n}\n\nexport function parseSortString(sortString): { sortKey: string; sortOrder: 'asc' | 'desc' } {\n  if (!sortString) return { sortKey: '', sortOrder: 'asc' };\n\n  if (sortString.startsWith('-')) {\n    return { sortKey: sortString.substring(1), sortOrder: 'desc' };\n  } else {\n    return { sortKey: sortString, sortOrder: 'asc' };\n  }\n}\n\nexport function normalizeSelect(select: Projection): string[] {\n  if (Array.isArray(select)) return flattenDeep(select.map(normalizeSelect));\n  if (isPlainObject(select)) {\n    return reduce(\n      select as KeyValueProjection,\n      (ret, val, key) => {\n        if (val === 1) ret.push(key);\n        else if (val === -1) ret.push(`-${key}`);\n        return ret;\n      },\n      [],\n    );\n  }\n  if (isString(select)) return select.split(' ').map((v) => v.trim());\n  return [];\n}\n\nexport function parseAccess(access: string) {\n  const parts = access.split('.');\n  if (parts.length === 1) {\n    return {\n      isSub: false,\n      sub: '',\n      access: parts[0],\n    };\n  }\n\n  if (parts.length === 3 && parts[0] === 'subs') {\n    return {\n      isSub: true,\n      sub: parts[1],\n      access: parts[2],\n    };\n  }\n\n  return {\n    isSub: false,\n    sub: '',\n    access,\n  };\n}\n","export enum StatusCodes {\n  OK = 200,\n  Created = 201,\n  BadRequest = 400,\n  Unauthorized = 401,\n  Forbidden = 403,\n  NotFound = 404,\n  UnprocessableContent = 422,\n}\n\nexport enum Codes {\n  Success = 'success',\n  Created = 'created',\n  BadRequest = 'bad_request',\n  Unauthorized = 'unauthorized',\n  Forbidden = 'forbidden',\n  NotFound = 'not_found',\n}\n\nexport enum CustomHeaders {\n  TotalCount = 'egose-total-count',\n}\n\nexport enum FilterOperator {\n  SubQuery,\n  Date,\n}\n","import { Codes, StatusCodes } from '../enums';\n\nexport class CustomError extends Error {\n  statusCode: number;\n  message: string;\n  errors: string[];\n  date: Date;\n\n  constructor({ statusCode = 422, message = 'Unprocessable Content', errors = [] } = {}) {\n    super(message);\n\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, CustomError);\n    }\n\n    this.statusCode = statusCode;\n    this.message = message;\n    this.errors = errors;\n    this.date = new Date();\n  }\n}\n\nexport function mapCodeToMessage(code: string) {\n  switch (code) {\n    case Codes.Success:\n      return 'OK';\n    case Codes.Created:\n      return 'Created';\n    case Codes.BadRequest:\n      return 'Bad Request';\n    case Codes.Forbidden:\n      return 'Forbidden';\n    case Codes.NotFound:\n      return 'Not Found';\n    default:\n      return;\n  }\n}\n\nexport function mapCodeToStatusCode(code: string) {\n  switch (code) {\n    case Codes.Success:\n      return StatusCodes.OK;\n    case Codes.Created:\n      return StatusCodes.Created;\n    case Codes.BadRequest:\n      return StatusCodes.BadRequest;\n    case Codes.Forbidden:\n      return StatusCodes.Forbidden;\n    case Codes.NotFound:\n      return StatusCodes.NotFound;\n    default:\n      return StatusCodes.UnprocessableContent;\n  }\n}\n\nexport function handleResultError({\n  success,\n  code,\n  errors = [],\n}: {\n  success: boolean;\n  code?: string;\n  errors?: string[];\n}) {\n  if (success) return;\n\n  switch (code) {\n    case Codes.BadRequest:\n      throw new CustomError({ statusCode: StatusCodes.BadRequest, message: 'Bad Request', errors });\n    case Codes.Forbidden:\n      throw new CustomError({ statusCode: StatusCodes.Forbidden, message: 'Forbidden', errors });\n    case Codes.NotFound:\n      throw new CustomError({ statusCode: StatusCodes.NotFound, message: 'Not Found', errors });\n    default:\n      throw new CustomError();\n  }\n}\n","// @ts-nocheck\nexport * from './collection';\nexport * from './document';\nexport * from './errors';\nexport * from './query';\n\nimport forEach from 'lodash/forEach';\nimport isArray from 'lodash/isArray';\nimport isEmpty from 'lodash/isEmpty';\nimport isObject from 'lodash/isObject';\nimport isPlainObject from 'lodash/isPlainObject';\nimport isString from 'lodash/isString';\nimport noop from 'lodash/noop';\nimport { isSchema, isReference, mapValuesAsync } from '../lib';\nimport { FilterOperator } from '../enums';\n\nfunction recurseObject(obj: any) {\n  if (isSchema(obj)) {\n    return buildRefs(obj.tree);\n  }\n\n  if (!isObject(obj)) return null;\n  if (isReference(obj)) {\n    return obj.ref;\n  }\n\n  let ret = null;\n  forEach(obj, (val, key) => {\n    ret = recurseObject(val);\n    if (!isEmpty(ret)) {\n      return false;\n    }\n  });\n\n  return ret;\n}\n\nexport function buildRefs(schema: any) {\n  const references = {};\n  const subPaths = [];\n\n  forEach(schema, (val, key) => {\n    const paths = recurseObject(val);\n    if (!isEmpty(paths)) {\n      references[key] = paths;\n    }\n\n    // collection subdocuments paths\n    // see https://mongoosejs.com/docs/subdocs.html#subdocuments\n    const target = val.type || val;\n    if (isArray(target) && target.length > 0) {\n      if (isSchema(target[0]) || isPlainObject(target[0])) {\n        subPaths.push(key);\n      }\n    }\n  });\n\n  return references;\n}\n\nexport function buildSubPaths(schema: any): string[] {\n  const subPaths = [];\n\n  forEach(schema, (val, key) => {\n    // collection subdocuments paths\n    // see https://mongoosejs.com/docs/subdocs.html#subdocuments\n    const target = val.type || val;\n    if (isArray(target) && target.length > 0) {\n      if (isSchema(target[0]) || (isPlainObject(target[0]) && !isReference(target[0]))) {\n        subPaths.push(key);\n      }\n    }\n  });\n\n  return subPaths;\n}\n\nexport async function iterateQuery(query: any, handler: Function) {\n  if (!isPlainObject(query)) return query;\n  if (!handler) return noop;\n\n  return mapValuesAsync(query, async (val, key) => {\n    if (isPlainObject(val)) {\n      if (val.$$sq) {\n        return handler(FilterOperator.SubQuery, val.$$sq, key);\n      } else if (val.$$date) {\n        return handler(FilterOperator.Date, val.$$date, key);\n      } else {\n        return iterateQuery(val, handler);\n      }\n    }\n\n    if (isArray(val)) {\n      return Promise.all(val.map((v) => iterateQuery(v, handler)));\n    }\n\n    return val;\n  });\n}\n\nexport const createValidator = (fn: (key: string) => boolean) => {\n  const stringHandler = (key: string) =>\n    key\n      .trim()\n      .split(' ')\n      .every((v) => fn(v));\n\n  const arrayHandler = (arr: string[] | string[][]) =>\n    arr.some((item) => {\n      if (isString(item)) return stringHandler(item);\n      else if (isArray(item)) return arrayHandler(item);\n      else return false;\n    });\n\n  return { stringHandler, arrayHandler };\n};\n","interface BooleanObject {\n  [key: string]: boolean;\n}\n\nclass Permission {\n  $_permissions: BooleanObject;\n  $_permissionKeys: string[];\n\n  constructor(permissions: BooleanObject) {\n    this.$_permissions = permissions;\n    this.$_permissionKeys = Object.keys(permissions);\n\n    for (let x = 0; x < this.$_permissionKeys.length; x++) {\n      const key = this.$_permissionKeys[x];\n      Object.defineProperty(this, key, {\n        enumerable: true,\n        get: function () {\n          return this.has(key);\n        },\n      });\n    }\n  }\n\n  prop(permission) {\n    return this.$_permissions.hasOwnProperty(permission);\n  }\n\n  has(permission) {\n    return this.$_permissions[permission] || false;\n  }\n\n  hasAny(permissions) {\n    return permissions.some((permission) => {\n      return this.has(permission);\n    });\n  }\n\n  hasAll(permissions) {\n    return permissions.every((permission) => {\n      return this.has(permission);\n    });\n  }\n\n  any(permissions) {\n    return this.hasAny(permissions);\n  }\n\n  all(permissions) {\n    return this.hasAll(permissions);\n  }\n}\n\nexport default Permission;\nexport interface Permissions extends Permission {\n  [key: string]: any;\n}\n","import castArray from 'lodash/castArray';\nimport forEach from 'lodash/forEach';\nimport compact from 'lodash/compact';\nimport flatten from 'lodash/flatten';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\nimport map from 'lodash/map';\nimport isArray from 'lodash/isArray';\nimport isBoolean from 'lodash/isBoolean';\nimport isFunction from 'lodash/isFunction';\nimport isNil from 'lodash/isNil';\nimport pick from 'lodash/pick';\nimport uniq from 'lodash/uniq';\nimport intersectionBy from 'lodash/intersectionBy';\nimport { getModelOption } from '../options';\nimport { iterateQuery, CustomError, setDocValue, genPagination, normalizeSelect, populateDoc } from '../helpers';\nimport {\n  Include,\n  MiddlewareContext,\n  Request,\n  Projection,\n  SelectAccess,\n  DocPermissionsAccess,\n  DecorateAccess,\n  DecorateAllAccess,\n  ValidateAccess,\n  PrepareAccess,\n  TransformAccess,\n  FinalizeAccess,\n  BaseFilterAccess,\n  ServiceResult,\n  SubQueryEntry,\n  Task,\n} from '../interfaces';\nimport { FilterOperator } from '../enums';\n\nexport class Base {\n  req: Request;\n  modelName: string;\n\n  constructor(req: Request, modelName: string) {\n    this.req = req;\n    this.modelName = modelName;\n  }\n\n  public decorate(doc: any, access: DecorateAccess, context: MiddlewareContext): Promise<any> {\n    return this.req.macl.decorate(this.modelName, doc, access, context);\n  }\n\n  public decorateAll(docs: any[], access: DecorateAllAccess, context: MiddlewareContext): Promise<any> {\n    return this.req.macl.decorateAll(this.modelName, docs, access, context);\n  }\n\n  public genAllowedFields(doc: any, access: SelectAccess, baseFields?: string[]): Promise<string[]> {\n    return this.req.macl.genAllowedFields(this.modelName, doc, access, baseFields);\n  }\n\n  public genDocPermissions(doc: any, access: DocPermissionsAccess, context: MiddlewareContext): Promise<{}> {\n    return this.req.macl.genDocPermissions(this.modelName, doc, access, context);\n  }\n\n  public genFilter(access?: BaseFilterAccess, filter?) {\n    return this.req.macl.genFilter(this.modelName, access, filter);\n  }\n\n  public getIdentifier(): string | null {\n    return this.req.macl.getIdentifier(this.modelName);\n  }\n\n  public genIDFilter(id: string): Promise<any> {\n    return this.req.macl.genIDFilter(this.modelName, id);\n  }\n\n  public genPopulate(access?: SelectAccess, populate?): Promise<any[]> {\n    return this.req.macl.genPopulate(this.modelName, access, populate);\n  }\n\n  public genSelect(\n    access: SelectAccess,\n    targetFields?: Projection,\n    skipChecks?: boolean,\n    subPaths?: string[],\n  ): Promise<any[]> {\n    return this.req.macl.genSelect(this.modelName, access, targetFields, skipChecks, subPaths);\n  }\n\n  public addEmptyPermissions(doc: any): any {\n    return this.req.macl.addEmptyPermissions(this.modelName, doc);\n  }\n\n  public addDocPermissions(doc: any, access: DocPermissionsAccess, context: MiddlewareContext): Promise<any> {\n    return this.req.macl.addDocPermissions(this.modelName, doc, access, context);\n  }\n\n  public addFieldPermissions(doc: any, access: DocPermissionsAccess, context: MiddlewareContext): Promise<any> {\n    return this.req.macl.addFieldPermissions(this.modelName, doc, access, context);\n  }\n\n  public pickAllowedFields(doc: any, access: SelectAccess, baseFields?: string[]): Promise<any> {\n    return this.req.macl.pickAllowedFields(this.modelName, doc, access, baseFields);\n  }\n\n  public prepare(allowedData: any, access: PrepareAccess, context: MiddlewareContext): Promise<any> {\n    return this.req.macl.prepare(this.modelName, allowedData, access, context);\n  }\n\n  public runTasks(docObject: any, tasks: Task | Task[]): any {\n    return this.req.macl.runTasks(this.modelName, docObject, tasks);\n  }\n\n  public transform(doc: any, access: TransformAccess, context: MiddlewareContext): Promise<any> {\n    return this.req.macl.transform(this.modelName, doc, access, context);\n  }\n\n  public finalize(doc: any, access: FinalizeAccess, context: MiddlewareContext): Promise<any> {\n    return this.req.macl.finalize(this.modelName, doc, access, context);\n  }\n\n  public changes(doc: any, context: MiddlewareContext): Promise<any> {\n    return this.req.macl.changes(this.modelName, doc, context);\n  }\n\n  public validate(allowedData: any, access: ValidateAccess, context: MiddlewareContext): Promise<boolean | any[]> {\n    return this.req.macl.validate(this.modelName, allowedData, access, context);\n  }\n\n  public checkIfModelPermissionExists(accesses: DocPermissionsAccess[]) {\n    const modelPermissionKeys = getModelOption(this.modelName, '_modelPermissionKeys');\n    return accesses.some((access) => modelPermissionKeys[access]?.length > 0);\n  }\n\n  protected processInclude(include: Include | Include[]) {\n    const includes = compact(castArray(include)).filter(({ model, op, path, localField, foreignField }) => {\n      return model && op && path && localField && foreignField;\n    });\n\n    // include Include local fields and paths\n    let includeLocalFields = [];\n    let includePaths = [];\n\n    forEach(includes, (inc) => {\n      includeLocalFields.push(inc.localField);\n      includePaths.push(inc.path);\n    });\n\n    includeLocalFields = uniq(compact(includeLocalFields));\n    includePaths = uniq(compact(includePaths));\n\n    return {\n      includes,\n      includeLocalFields,\n      includePaths,\n    };\n  }\n\n  protected async includeDocs(docs, include: Include | Include[]) {\n    if (!include) return docs;\n\n    const includes = compact(castArray(include));\n    if (includes.length === 0) return docs;\n\n    const isSingle = !isArray(docs);\n    if (isSingle) docs = [docs];\n\n    for (let x = 0; x < includes.length; x++) {\n      const include = includes[x];\n\n      if (include.op === 'count') {\n        docs = await this.includeDocsCount(docs, include);\n      } else {\n        docs = await this.includeDocsList(docs, include);\n      }\n    }\n\n    return isSingle ? docs[0] : docs;\n  }\n\n  private async includeDocsList(docs, include: Include) {\n    const { model, op, path, localField, foreignField, filter: _filters, args = {}, options = {} } = include;\n\n    const svc = this.req.macl.getPublicService(model);\n    if (!svc) return docs;\n\n    const includeLocalValues = [];\n    forEach(docs, (doc, i) => {\n      includeLocalValues.push(get(doc, localField));\n    });\n\n    const filter = { ...(_filters ?? {}), [foreignField]: { $in: flatten(includeLocalValues) } };\n    const result = await svc.find(filter, args, {\n      ...options,\n      lean: true,\n      includePermissions: false,\n      includeCount: false,\n    });\n\n    if (!result.success) return docs;\n\n    for (let y = 0; y < docs.length; y++) {\n      const doc = docs[y];\n      const localValue = get(doc, localField);\n      const filterFn = (row) =>\n        intersectionBy(castArray(localValue), castArray(get(row, foreignField)), String).length > 0;\n      const matches = result.data.filter(filterFn);\n      setDocValue(doc, path, op === 'list' ? matches : matches[0]);\n    }\n\n    return docs;\n  }\n\n  private async includeDocsCount(docs, include: Include) {\n    const { model, path, localField, foreignField, filter: _filters } = include;\n\n    const svc = this.req.macl.getPublicService(model);\n    if (!svc) return docs;\n\n    for (let y = 0; y < docs.length; y++) {\n      const doc = docs[y];\n      const localValue = get(doc, localField);\n      const filter = { ...(_filters ?? {}), [foreignField]: localValue };\n      const result = await svc.count(filter);\n      if (!result.success) continue;\n\n      setDocValue(doc, path, result.data);\n    }\n\n    return docs;\n  }\n\n  protected async parseClientData(filter) {\n    const result = await iterateQuery(filter, async (fo: FilterOperator, val: any, key: string) => {\n      switch (fo) {\n        case FilterOperator.SubQuery:\n          return this.handleSubQuery(val, key);\n        case FilterOperator.Date:\n          return this.handleDate(val, key);\n        default:\n          return null;\n      }\n    });\n\n    return result;\n  }\n\n  private async handleSubQuery(sq: SubQueryEntry, key: string) {\n    const { model, op, id, filter, args, options, sqOptions = {} } = sq;\n\n    const svc = this.req.macl.getPublicService(model);\n    if (!svc) return null;\n\n    let result!: ServiceResult;\n\n    if (op === 'list') {\n      result = await svc.find(filter, args, options);\n    } else if (op === 'read') {\n      if (id) {\n        result = await svc.findById(id, args, options);\n      } else if (filter) {\n        result = await svc.findOne(filter, args, options);\n      } else {\n        return null;\n      }\n    } else {\n      return null;\n    }\n\n    if (!result.success) return null;\n\n    let ret = result.data;\n    if (sqOptions.path) {\n      ret = isArray(ret) ? flatten(ret.map((v) => get(v, sqOptions.path))) : get(ret, sqOptions.path);\n    }\n\n    if (sqOptions.compact) {\n      ret = compact(ret);\n    }\n\n    return ret;\n  }\n\n  private async handleDate(val: any, key: string) {\n    return new Date();\n  }\n}\n","import mongoose from 'mongoose';\nimport castArray from 'lodash/castArray';\nimport forEach from 'lodash/forEach';\nimport compact from 'lodash/compact';\nimport flatten from 'lodash/flatten';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\nimport map from 'lodash/map';\nimport isArray from 'lodash/isArray';\nimport isBoolean from 'lodash/isBoolean';\nimport isFunction from 'lodash/isFunction';\nimport isNil from 'lodash/isNil';\nimport pick from 'lodash/pick';\nimport omit from 'lodash/omit';\nimport uniq from 'lodash/uniq';\nimport intersectionBy from 'lodash/intersectionBy';\nimport diff from 'deep-diff';\nimport Model from '../model';\nimport { getModelOption, getModelOptions } from '../options';\nimport {\n  getDocPermissions,\n  genPagination,\n  normalizeSelect,\n  populateDoc,\n  filterCollection,\n  findElement,\n  findElementById,\n  matchElement,\n  toObject,\n  genSubPopulate,\n} from '../helpers';\nimport {\n  Filter,\n  Include,\n  ModelRouterOptions,\n  MiddlewareContext,\n  SubPopulate,\n  DistinctArgs,\n  Defaults,\n  Populate,\n  Request,\n  FindArgs,\n  FindOptions,\n  FindOneArgs,\n  FindOneOptions,\n  FindByIdArgs,\n  FindByIdOptions,\n  CreateArgs,\n  CreateOptions,\n  UpdateOneArgs,\n  UpdateOneOptions,\n  UpdateByIdArgs,\n  UpsertArgs,\n  UpdateByIdOptions,\n  UpsertOptions,\n  BaseFilterAccess,\n  ExistsOptions,\n  ServiceResult,\n  SubQueryEntry,\n  FindAccess,\n} from '../interfaces';\nimport { Codes, StatusCodes } from '../enums';\nimport { Base } from './base';\nimport { logger } from '../logger';\n\nexport class Service extends Base {\n  model: Model;\n  options: ModelRouterOptions;\n  defaults: Defaults;\n  baseFields: string[];\n  baseFieldsExt: string[];\n\n  constructor(req: Request, modelName: string) {\n    super(req, modelName);\n\n    this.model = new Model(modelName);\n    this.options = getModelOptions(modelName);\n    this.defaults = this.options.defaults || {};\n    this.baseFields = ['_id'];\n    this.baseFieldsExt = this.baseFields.concat(this.options.permissionField);\n  }\n\n  public async findOne(filter: Filter, args?: FindOneArgs, options?: FindOneOptions): Promise<ServiceResult> {\n    const {\n      select = this.defaults.findOneArgs?.select,\n      sort = this.defaults.findOneArgs?.sort,\n      populate = this.defaults.findOneArgs?.populate,\n      include = this.defaults.findOneArgs?.include,\n      overrides = {},\n    } = args ?? {};\n\n    const {\n      skim = this.defaults.findOneOptions?.skim ?? false,\n      includePermissions = this.defaults.findOneOptions?.includePermissions ?? true,\n      access = this.defaults.findOneOptions?.access ?? 'read',\n      populateAccess = this.defaults.findOneOptions?.populateAccess,\n      lean = this.defaults.findOneOptions?.lean ?? false,\n    } = options ?? {};\n\n    const { filter: overrideFilter, select: overrideSelect, populate: overridePopulate } = overrides ?? {};\n\n    let [_filter, _select, _populate] = await Promise.all([\n      overrideFilter || this.genFilter(access, await this.parseClientData(filter)),\n      overrideSelect || this.genSelect(access, select),\n      overridePopulate || this.genPopulate(populateAccess || access, populate),\n    ]);\n\n    const { includes, includeLocalFields, includePaths } = this.processInclude(include);\n    const finalSelect = normalizeSelect(_select).concat(includeLocalFields);\n\n    const query = {\n      filter: _filter,\n      select: finalSelect,\n      sort,\n      populate: _populate,\n    };\n\n    logger.debug(JSON.stringify({ op: 'findOne', query }));\n\n    if (_filter === false) return { success: false, code: Codes.Forbidden, data: null, query };\n\n    let doc = await this.model.findOne({ ...query, lean });\n    if (!doc) return { success: false, code: Codes.NotFound, data: null, query };\n\n    const context: MiddlewareContext = {\n      model: this.model.model,\n      modelName: this.modelName,\n      originalDocObject: toObject(doc),\n    };\n\n    doc = await this.includeDocs(doc, includes);\n\n    let includeDocPermissions = includePermissions;\n    if (!includeDocPermissions && !skim) {\n      includeDocPermissions = this.checkIfModelPermissionExists([access, 'read', 'update']);\n    }\n    if (includeDocPermissions) doc = await this.addDocPermissions(doc, access, context);\n    if (includePermissions) doc = await this.addFieldPermissions(doc, access, context);\n    doc = await this.pickAllowedFields(\n      doc,\n      access,\n      this.baseFieldsExt.concat(includePaths, normalizeSelect(overrideSelect)),\n    );\n    if (!includePermissions) doc = this.addEmptyPermissions(doc);\n\n    return { success: true, code: Codes.Success, data: doc, query, context };\n  }\n\n  public async findById(id: string, args?: FindByIdArgs, options?: FindByIdOptions): Promise<ServiceResult> {\n    const {\n      select = this.defaults.findByIdArgs?.select,\n      populate = this.defaults.findByIdArgs?.populate,\n      include = this.defaults.findByIdArgs?.include,\n      overrides = {},\n    } = args ?? {};\n\n    const {\n      skim = this.defaults.findOneOptions?.skim ?? false,\n      includePermissions = this.defaults.findOneOptions?.includePermissions ?? true,\n      access = this.defaults.findOneOptions?.access ?? 'read',\n      populateAccess = this.defaults.findOneOptions?.populateAccess,\n      lean = this.defaults.findOneOptions?.lean ?? false,\n    } = options ?? {};\n\n    const { select: overrideSelect, populate: overridePopulate, idFilter: overrideIdFilter } = overrides ?? {};\n    const filter = overrideIdFilter || (await this.genIDFilter(id));\n\n    return this.findOne(\n      filter,\n      {\n        select,\n        populate,\n        include,\n        overrides: {\n          select: overrideSelect,\n          populate: overridePopulate,\n        },\n      },\n      { skim, includePermissions, access, populateAccess, lean },\n    );\n  }\n\n  public async find(\n    filter: Filter,\n    args?: FindArgs,\n    options?: FindOptions,\n    decorate?: Function,\n  ): Promise<ServiceResult> {\n    const {\n      select = this.defaults.findArgs?.select,\n      populate = this.defaults.findArgs?.populate,\n      include = this.defaults.findArgs?.include,\n      sort = this.defaults.findArgs?.sort,\n      skip = this.defaults.findArgs?.skip,\n      limit = this.defaults.findArgs?.limit,\n      page = this.defaults.findArgs?.page,\n      pageSize = this.defaults.findArgs?.pageSize,\n      overrides = {},\n    } = args ?? {};\n\n    const {\n      skim = this.defaults.findOptions?.skim ?? false,\n      includePermissions = this.defaults.findOptions?.includePermissions ?? true,\n      includeCount = this.defaults.findOptions?.includeCount ?? false,\n      populateAccess = this.defaults.findOptions?.populateAccess ?? 'read',\n      lean = this.defaults.findOptions?.lean ?? false,\n    } = options ?? {};\n\n    const { filter: overrideFilter, select: overrideSelect, populate: overridePopulate } = overrides ?? {};\n\n    const [_filter, _select, _populate, pagination] = await Promise.all([\n      overrideFilter || this.genFilter('list', await this.parseClientData(filter)),\n      overrideSelect || this.genSelect('list', select),\n      overridePopulate || this.genPopulate(populateAccess, populate),\n      genPagination({ skip, limit, page, pageSize }, this.options.listHardLimit),\n    ]);\n\n    const finalSelect = normalizeSelect(_select);\n\n    // filter populated fields based on select fields\n    const filteredPopulate =\n      isArray(finalSelect) && isArray(_populate)\n        ? _populate.filter((p) => finalSelect.includes(p.path.split('.')[0]))\n        : _populate;\n\n    const { includes, includeLocalFields, includePaths } = this.processInclude(include);\n\n    const query = {\n      filter: _filter,\n      select: finalSelect.concat(includeLocalFields),\n      populate: filteredPopulate,\n      sort,\n      ...pagination,\n    };\n\n    logger.debug(JSON.stringify({ op: 'find', query }));\n\n    if (_filter === false) return { success: false, code: 'forbidden', data: [], count: 0, totalCount: null, query };\n\n    let docs = await this.model.find({\n      ...query,\n      lean,\n    });\n\n    const contexts: MiddlewareContext[] = docs.map((doc) => ({\n      model: this.model.model,\n      modelName: this.modelName,\n      originalDocObject: toObject(doc),\n    }));\n\n    const _decorate = isFunction(decorate) ? decorate : (v) => v;\n\n    docs = await this.includeDocs(docs, includes);\n\n    docs = await Promise.all(\n      docs.map(async (doc, i) => {\n        let includeDocPermissions = includePermissions;\n        if (!includeDocPermissions && !skim) {\n          includeDocPermissions = this.checkIfModelPermissionExists(['list', 'read', 'update']);\n        }\n        if (includeDocPermissions) doc = await this.addDocPermissions(doc, 'list', contexts[i]);\n        if (includePermissions) doc = await this.addFieldPermissions(doc, 'list', contexts[i]);\n        doc = await this.pickAllowedFields(\n          doc,\n          'list',\n          this.baseFieldsExt.concat(includePaths, normalizeSelect(overrideSelect)),\n        );\n        doc = await _decorate(doc, contexts[i]);\n        if (!includePermissions) doc = this.addEmptyPermissions(doc);\n\n        return doc;\n      }),\n    );\n\n    return {\n      success: true,\n      code: Codes.Success,\n      data: docs,\n      count: docs.length,\n      totalCount: includeCount ? await this.model.countDocuments(_filter) : null,\n      query,\n      contexts,\n    };\n  }\n\n  public async create(data, args?: CreateArgs, options?: CreateOptions, decorate?: Function): Promise<ServiceResult> {\n    const { populate = this.defaults.createArgs?.populate } = args ?? {};\n    const {\n      skim = this.defaults.createOptions?.skim ?? false,\n      includePermissions = this.defaults.createOptions?.includePermissions ?? true,\n      populateAccess = this.defaults.createOptions?.populateAccess ?? 'read',\n    } = options ?? {};\n\n    const isArr = Array.isArray(data);\n    let dataArr = isArr ? data : [data];\n    dataArr = await Promise.all(dataArr.map((d) => this.parseClientData(d)));\n\n    const contexts: MiddlewareContext[] = [];\n\n    let validationError = null;\n    const items = await Promise.all(\n      dataArr.map(async (item, index) => {\n        const context: MiddlewareContext = { model: this.model.model, modelName: this.modelName, originalData: item };\n\n        const allowedFields = await this.genAllowedFields(item, 'create');\n        const allowedData = pick(item, allowedFields);\n\n        const validated = await this.validate(allowedData, 'create', context);\n        if (isBoolean(validated)) {\n          if (!validated) {\n            validationError = { success: false, code: Codes.BadRequest, data: null };\n            return;\n          }\n        } else if (isArray(validated)) {\n          if (validated.length > 0) {\n            validationError = { success: false, code: Codes.BadRequest, data: null, errors: validated };\n            return;\n          }\n        }\n\n        const preparedData = await this.prepare(allowedData, 'create', context);\n\n        context.preparedData = preparedData;\n        contexts.push(context);\n        return preparedData;\n      }),\n    );\n\n    if (validationError) return validationError;\n\n    const _decorate = isFunction(decorate) ? decorate : (v) => v;\n\n    let docs = await this.model.create(items);\n    docs = await Promise.all(\n      docs.map(async (doc, index) => {\n        doc = await this.finalize(doc, 'create', contexts[index]);\n        contexts[index].finalDocObject = doc.toObject({ virtuals: false });\n        let includeDocPermissions = includePermissions;\n        if (!includeDocPermissions && !skim) {\n          includeDocPermissions = this.checkIfModelPermissionExists(['create', 'read', 'update']);\n        }\n        if (includeDocPermissions) doc = await this.addDocPermissions(doc, 'create', contexts[index]);\n        if (includePermissions) doc = await this.addFieldPermissions(doc, 'read', contexts[index]);\n        if (populate) await populateDoc(doc, await this.genPopulate(populateAccess, populate));\n        doc = await this.pickAllowedFields(doc, 'read', this.baseFieldsExt);\n        doc = await _decorate(doc, contexts[index]);\n        if (!includePermissions) doc = this.addEmptyPermissions(doc);\n\n        return doc;\n      }),\n    );\n\n    return {\n      success: true,\n      code: Codes.Created,\n      data: docs,\n      input: items,\n      count: docs.length,\n    };\n  }\n\n  public async new(): Promise<ServiceResult> {\n    const data = await this.model.new();\n    return {\n      success: true,\n      code: Codes.Success,\n      data,\n    };\n  }\n\n  public async updateOne(\n    filter: Filter,\n    data,\n    args?: UpdateOneArgs,\n    options?: UpdateOneOptions,\n    decorate?: Function,\n  ): Promise<ServiceResult> {\n    const { populate = this.defaults.updateOneArgs?.populate, overrides = {} } = args ?? {};\n    const {\n      skim = this.defaults.updateOneOptions?.skim ?? false,\n      includePermissions = this.defaults.updateOneOptions?.includePermissions ?? true,\n      populateAccess = this.defaults.updateOneOptions?.populateAccess ?? 'read',\n    } = options ?? {};\n    const { filter: overrideFilter, populate: overridePopulate } = overrides ?? {};\n\n    const [_filter, _populate] = await Promise.all([\n      overrideFilter || this.genFilter('update', filter),\n      overridePopulate || this.genPopulate(populateAccess, populate),\n    ]);\n\n    const query = { filter: _filter, populate: _populate };\n\n    logger.debug(JSON.stringify({ op: 'updateOne', query }));\n\n    if (_filter === false) return { success: false, code: Codes.Forbidden, data: null, query };\n\n    let doc = await this.model.findOne({ filter: _filter });\n    if (!doc) return { success: false, code: Codes.NotFound, data: null, query };\n\n    const context: MiddlewareContext = { model: this.model.model, modelName: this.modelName };\n\n    data = await this.parseClientData(data);\n\n    // see https://mongoosejs.com/docs/api/document.html#Document.prototype.toObject()\n    context.originalDocObject = doc.toObject({ virtuals: false });\n    context.originalData = data;\n\n    doc = await this.addDocPermissions(doc, 'update', context);\n\n    context.docPermissions = this.getDocPermissions(doc);\n    context.currentDoc = doc;\n\n    const allowedFields = await this.genAllowedFields(doc, 'update');\n    const allowedData = pick(data, allowedFields);\n\n    const validated = await this.validate(allowedData, 'update', context);\n    if (isBoolean(validated)) {\n      if (!validated) return { success: false, code: Codes.BadRequest, data: null };\n    } else if (isArray(validated)) {\n      if (validated.length > 0) return { success: false, code: Codes.BadRequest, data: null, errors: validated };\n    }\n\n    const prepared = await this.prepare(allowedData, 'update', context);\n\n    context.preparedData = prepared;\n    Object.assign(doc, prepared);\n\n    context.modifiedPaths = doc.modifiedPaths();\n    doc = await this.transform(doc, 'update', context);\n    doc = await doc.save();\n\n    const diffExcludeFields = [this.options.permissionField, '__v'];\n    context.diff = (d) => {\n      context.changes =\n        diff(\n          omit(context.originalDocObject, diffExcludeFields),\n          omit(d.toObject({ virtuals: false }), diffExcludeFields),\n        ) || [];\n\n      context.modifiedPaths = uniq(context.changes.map((di) => (di.path.length > 0 ? di.path[0] : '')));\n    };\n\n    doc = await this.finalize(doc, 'update', context);\n    context.finalDocObject = doc.toObject({ virtuals: false });\n    context.diff(doc);\n\n    await this.changes(doc, context);\n\n    let includeDocPermissions = includePermissions;\n    if (!includeDocPermissions && !skim) {\n      includeDocPermissions = this.checkIfModelPermissionExists(['read', 'update']);\n    }\n    if (includeDocPermissions) doc = await this.addDocPermissions(doc, 'update', context);\n    if (includePermissions) doc = await this.addFieldPermissions(doc, 'update', context);\n    if (_populate) await populateDoc(doc, _populate);\n    doc = await this.pickAllowedFields(doc, 'read', this.baseFieldsExt);\n\n    if (isFunction(decorate)) doc = await decorate(doc, context);\n    if (!includePermissions) doc = this.addEmptyPermissions(doc);\n\n    return { success: true, code: Codes.Success, data: doc, input: prepared };\n  }\n\n  public async updateById(\n    id: string,\n    data,\n    { populate = this.defaults.updateByIdArgs?.populate, overrides = {} }: UpdateByIdArgs = {},\n    {\n      skim = this.defaults.updateByIdOptions?.skim ?? false,\n      includePermissions = this.defaults.updateByIdOptions?.includePermissions ?? true,\n      populateAccess = this.defaults.updateByIdOptions?.populateAccess ?? 'read',\n    }: UpdateByIdOptions = {},\n    decorate?: Function,\n  ): Promise<ServiceResult> {\n    const { populate: overridePopulate, idFilter: overrideIdFilter } = overrides;\n    const filter = overrideIdFilter || (await this.genIDFilter(id));\n\n    return this.updateOne(\n      filter,\n      data,\n      {\n        populate,\n        overrides: {\n          populate: overridePopulate,\n        },\n      },\n      { skim, includePermissions, populateAccess },\n      decorate,\n    );\n  }\n\n  public async upsert(\n    filter: Filter,\n    data,\n    args?: UpsertArgs,\n    options?: UpsertOptions,\n    decorate?: Function,\n  ): Promise<ServiceResult> {\n    const { populate = this.defaults.upsertArgs?.populate, overrides = {} } = args ?? {};\n    const {\n      skim = this.defaults.upsertOptions?.skim ?? false,\n      includePermissions = this.defaults.upsertOptions?.includePermissions ?? true,\n      populateAccess = this.defaults.upsertOptions?.populateAccess ?? 'read',\n    } = options ?? {};\n    const { filter: overrideFilter, populate: overridePopulate } = overrides ?? {};\n\n    const theone = await this.model.findOne({ filter });\n    if (theone) {\n      const _filter = await (overrideFilter || this.genFilter('update', filter));\n      const query = { filter: _filter };\n\n      logger.debug(JSON.stringify({ op: 'upsert', query }));\n      if (_filter === false) return { success: false, code: Codes.Forbidden, data: null, query };\n\n      const matched = matchElement(theone, _filter);\n      if (!matched) return { success: false, code: Codes.Forbidden, data: null, query };\n\n      return this.updateOne(\n        null,\n        data,\n        {\n          populate,\n          overrides: {\n            filter: _filter,\n            populate: overridePopulate,\n          },\n        },\n        { skim, includePermissions, populateAccess },\n        decorate,\n      );\n    } else {\n      return this.create(\n        data,\n        { populate },\n        {\n          skim,\n          includePermissions,\n          populateAccess,\n        },\n        decorate,\n      );\n    }\n  }\n\n  public async delete(id: string): Promise<ServiceResult> {\n    const filter = await this.genFilter('delete', await this.genIDFilter(id));\n\n    const query = { filter };\n\n    logger.debug(JSON.stringify({ op: 'delete', query }));\n\n    if (filter === false) return { success: false, code: Codes.Forbidden, data: null, query };\n    let doc = await this.model.findOne({ filter });\n    if (!doc) return { success: false, code: Codes.NotFound, data: null, query };\n\n    // this function utilizes the 'deleteOne' method to delete the document,\n    // triggering 'deleteOne' hooks, as opposed to using 'findOneAndDelete'.\n    // see https://mongoosejs.com/docs/api/model.html#Model.prototype.deleteOne()\n    await ('deleteOne' in doc ? doc.deleteOne() : doc.remove());\n    return { success: true, code: Codes.Success, data: doc._id, query };\n  }\n\n  public async exists(filter: Filter, options?: ExistsOptions): Promise<ServiceResult> {\n    const {\n      access = this.defaults.existsOptions?.access ?? 'read',\n      includeId = this.defaults.existsOptions?.includeId ?? false,\n    } = options ?? {};\n\n    filter = await this.genFilter(access, filter);\n    const result = await this.model.exists(filter);\n    return { success: true, code: Codes.Success, data: includeId ? result : !!result, query: { filter } };\n  }\n\n  public async distinct(field: string, args?: DistinctArgs): Promise<ServiceResult> {\n    let { filter } = args ?? {};\n    filter = await this.genFilter('read', filter);\n\n    const query = { filter };\n\n    if (filter === false) return { success: false, code: Codes.Forbidden, data: null, query };\n\n    const result = await this.model.distinct(field, filter);\n\n    return { success: true, code: Codes.Success, data: result, query };\n  }\n\n  public async count(filter, access: BaseFilterAccess = 'list'): Promise<ServiceResult> {\n    filter = await this.genFilter(access, filter);\n\n    const query = { filter };\n\n    if (filter === false) return { success: false, code: Codes.Forbidden, data: 0, query };\n\n    return { success: true, code: Codes.Success, data: await this.model.countDocuments(filter), query };\n  }\n\n  public getDocPermissions(doc) {\n    return getDocPermissions(this.modelName, doc);\n  }\n\n  async listSub(id, sub, options?: { filter: any; fields: string[] }): Promise<ServiceResult> {\n    let { filter: ft, fields } = options ?? {};\n\n    const parentDoc = await this.getParentDoc(id, sub, null, { access: 'read' });\n    if (!parentDoc) return { success: false, code: Codes.NotFound, data: [] };\n    let result = get(parentDoc, sub);\n\n    const [subFilter, subSelect] = await Promise.all([\n      this.genFilter(`subs.${sub}.list`, ft),\n      this.genSelect('list', fields, false, [sub, 'sub']),\n    ]);\n\n    if (subFilter === false) return { success: false, code: Codes.Forbidden, data: [] };\n\n    result = filterCollection(result, subFilter);\n    if (subSelect) result = result.map((v) => pick(toObject(v), subSelect.concat('_id')));\n\n    return { success: true, code: Codes.Success, data: result };\n  }\n\n  public async readSub(id, sub, subId, options?: { fields: string[]; populate: any }): Promise<ServiceResult> {\n    let { fields, populate } = options ?? {};\n\n    const parentDoc = await this.getParentDoc(id, sub, { populate }, { access: 'read' });\n    if (!parentDoc) return { success: false, code: Codes.NotFound, data: null };\n    let result = get(parentDoc, sub);\n\n    const [subFilter, subSelect] = await Promise.all([\n      this.genFilter(`subs.${sub}.read` as any, { _id: subId }),\n      this.genSelect('read', fields, false, [sub, 'sub']),\n    ]);\n\n    if (subFilter === false) return { success: false, code: Codes.Forbidden, data: null };\n\n    result = findElement(result, subFilter);\n    if (!result) return { success: false, code: Codes.NotFound, data: null };\n\n    if (subSelect) result = pick(toObject(result), subSelect.concat(['_id']));\n    return { success: true, code: Codes.Success, data: result };\n  }\n\n  public async updateSub(id, sub, subId, data): Promise<ServiceResult> {\n    const parentDoc = await this.getParentDoc(id, sub, null, { access: 'update' });\n    if (!parentDoc) return { success: false, code: Codes.NotFound, data: null };\n    let result = get(parentDoc, sub);\n\n    const [subFilter, subReadSelect, subUpdateSelect] = await Promise.all([\n      this.genFilter(`subs.${sub}.update`, { _id: subId }),\n      this.genSelect('read', null, false, [sub, 'sub']),\n      this.genSelect('update', null, false, [sub, 'sub']),\n    ]);\n\n    if (subFilter === false) return { success: false, code: Codes.Forbidden, data: null };\n\n    result = findElement(result, subFilter);\n    if (!result) return { success: false, code: Codes.NotFound, data: null };\n\n    const allowedData = pick(data, subUpdateSelect);\n    Object.assign(result, allowedData);\n\n    await parentDoc.save();\n    if (subReadSelect) result = pick(toObject(result), subReadSelect.concat(['_id']));\n    return { success: true, code: Codes.Success, data: result };\n  }\n\n  public async bulkUpdateSub(id, sub, data): Promise<ServiceResult> {\n    const parentDoc = await this.getParentDoc(id, sub, null, { access: 'update' });\n    if (!parentDoc) return { success: false, code: Codes.NotFound, data: null };\n    let result = get(parentDoc, sub);\n\n    data = castArray(data);\n\n    const [subFilter, subReadSelect, subUpdateSelect] = await Promise.all([\n      this.genFilter(`subs.${sub}.update`, { _id: { $in: data.map((v) => v._id) } }),\n      this.genSelect('read', null, false, [sub, 'sub']),\n      this.genSelect('update', null, false, [sub, 'sub']),\n    ]);\n\n    if (subFilter === false) return { success: false, code: Codes.Forbidden, data: null };\n\n    result = filterCollection(result, subFilter);\n    forEach(result, (subdoc) => {\n      const tdata = findElementById(data, subdoc._id);\n      if (!tdata) return;\n\n      const allowedData = pick(tdata, subUpdateSelect);\n      Object.assign(subdoc, allowedData);\n    });\n\n    await parentDoc.save();\n    if (subReadSelect) result = result.map((v) => pick(toObject(v), subReadSelect.concat(['_id'])));\n    return { success: true, code: Codes.Success, data: result };\n  }\n\n  public async createSub(id, sub, data, options?: { addFirst: boolean }): Promise<ServiceResult> {\n    const { addFirst } = options ?? {};\n\n    const parentDoc = await this.getParentDoc(id, sub, null, { access: 'update' });\n    if (!parentDoc) return { success: false, code: Codes.NotFound, data: null };\n    let result = get(parentDoc, sub);\n\n    const [subCreateSelect, subReadSelect] = await Promise.all([\n      this.genSelect('create', null, false, [sub, 'sub']),\n      this.genSelect('read', null, false, [sub, 'sub']),\n    ]);\n\n    const allowedData = pick(data, subCreateSelect);\n    addFirst === true ? result.unshift(allowedData) : result.push(allowedData);\n\n    await parentDoc.save();\n    if (subReadSelect) result = result.map((v) => pick(toObject(v), subReadSelect.concat(['_id'])));\n    return { success: true, code: Codes.Created, data: result };\n  }\n\n  public async deleteSub(id, sub, subId): Promise<ServiceResult> {\n    const parentDoc = await this.getParentDoc(id, sub, null, { access: 'update' });\n    if (!parentDoc) return { success: false, code: Codes.NotFound, data: null };\n    let result = get(parentDoc, sub);\n\n    const subFilter = await this.genFilter(`subs.${sub}.delete` as any, { _id: subId });\n    if (subFilter === false) return { success: false, code: Codes.Forbidden, data: null };\n\n    result = findElement(result, subFilter);\n    if (!result) return { success: false, code: Codes.NotFound, data: null };\n\n    // starting from version 7.x, the 'deleteOne' method replaces the 'remove' method for subdocuments.\n    // see https://mongoosejs.com/docs/subdocs.html#removing-subdocs\n    await ('deleteOne' in result ? result.deleteOne() : result.remove());\n    await parentDoc.save();\n    return { success: true, code: Codes.Success, data: result._id };\n  }\n\n  public async getParentDoc(\n    id,\n    sub,\n    args?: { populate?: SubPopulate | SubPopulate[] },\n    options?: { access?: any; lean?: boolean },\n  ) {\n    const { populate } = args ?? {};\n    const { access = 'read', lean = false } = options ?? {};\n\n    const parentFilter = await this.genFilter(access, await this.genIDFilter(id));\n\n    if (parentFilter === false) return null;\n    return this.model.findOne({ filter: parentFilter, select: sub, populate: genSubPopulate(sub, populate), lean });\n  }\n}\n","import mongoose, { FilterQuery } from 'mongoose';\nimport { getModelRef, getModelAtt } from './meta';\nimport { Sort, Filter } from './interfaces';\n\ninterface FindProps {\n  filter: Filter;\n  select?: any;\n  sort?: Sort;\n  populate?: any;\n  limit?: any;\n  skip?: any;\n  lean?: boolean;\n}\n\ninterface FindOneProps {\n  filter: Filter;\n  select?: any;\n  sort?: Sort;\n  populate?: any;\n  lean?: boolean;\n}\n\n// Reference\n// const indexMap = Object.create(null);\n// const reducer = (baseArr, index) => baseArr.concat(Object.keys(index.key));\n// const concatKeys = async (name) => {\n//   const indexes = await mongoose.model(name).collection.indexes()\n//   indexMap[name] = indexes.reduce(reducer, []);\n// };\n// await Promise.all(mongoose.modelNames().map(concatKeys));\n\nconst reducer1 = (baseArr, index) => baseArr.concat(Object.keys(index.key));\nconst reducer2 = (baseObj, key) => ({ ...baseObj, [key]: true });\n\ntype SortValue = 1 | -1 | 'asc' | 'desc';\ntype SortType =\n  | string\n  | [string, SortValue][]\n  | { [key: string]: SortValue }\n  | Map<string, SortValue>\n  | null\n  | undefined;\n\nclass Model {\n  modelName: string;\n  model: mongoose.Model<any>;\n  jsonSchema: Record<string, any>;\n  indexKeys: string[];\n  indexMap: any;\n  modelAttrs: string[];\n\n  constructor(modelName: string) {\n    this.modelName = modelName;\n    this.model = mongoose.model(modelName);\n    if (!this.model) return;\n\n    // Enable optimistic concurrency to ensure atomicity when\n    // updating the document using find(), findOne(), and save().\n    this.model.schema.set('optimisticConcurrency', true);\n    // In order to use optimistic concurrency, a version key must be set on the schema.\n    const currVersionKey = this.model.schema.get('versionKey');\n    if (!currVersionKey) this.model.schema.set('versionKey', '__v');\n\n    this.modelAttrs = getModelAtt(this.modelName);\n\n    // this.model.collection.indexes({}, (err, result = []) => {\n    //   this.indexKeys = result.reduce(reducer1, []);\n    //   this.indexMap = this.indexKeys.reduce(reducer2, {});\n    // });\n  }\n\n  new() {\n    const doc = new this.model();\n    return doc;\n  }\n\n  create(data) {\n    return this.model.create(data);\n  }\n\n  find({ filter, select, sort, populate, limit, skip, lean }: FindProps) {\n    // sort = this.pruneSort(sort);\n    if (!this.validateSort(sort as SortType)) {\n      sort = null;\n    }\n\n    let builder = this.model.find(filter as FilterQuery<any>);\n    if (select) builder = builder.select(select);\n    if (skip) builder = builder.skip(skip);\n    if (limit) builder = builder.limit(limit);\n    if (sort) builder = builder.sort(sort);\n    if (populate) builder = builder.populate(populate);\n    if (lean) builder = builder.lean();\n    // builder = builder.setOptions({ sanitizeFilter: true });\n\n    return builder;\n  }\n\n  // See https://github.com/Automattic/mongoose/blob/65b2d12a8f85f86136cfaf32947f338ba0c5f451/lib/query.js#L3011\n  validateSort(sort: SortType, logError: (msg: string, ...args: any[]) => void = console.error): boolean {\n    // Handle null/undefined (valid, no-op)\n    if (sort === null || sort === undefined) return true;\n\n    // Validate string\n    if (typeof sort === 'string') {\n      // Optional: Check for valid format (e.g., \"field -field2\")\n      if (!/^[a-zA-Z0-9\\s-]+/.test(sort)) {\n        logError('Invalid sort string:', sort);\n        return false;\n      }\n      return true;\n    }\n\n    // Validate array\n    if (Array.isArray(sort)) {\n      const isValid = sort.every((pair: any) => {\n        if (!Array.isArray(pair) || pair.length !== 2) {\n          logError('Invalid sort array element: must be [key, order]', pair);\n          return false;\n        }\n        const [key, order] = pair as [string, any];\n        if (typeof key !== 'string') {\n          logError('Invalid sort array key: must be string', key);\n          return false;\n        }\n        if (![1, -1, 'asc', 'desc'].includes(order)) {\n          logError('Invalid sort array order: must be 1, -1, \"asc\", or \"desc\"', order);\n          return false;\n        }\n        return true;\n      });\n\n      return isValid;\n    }\n\n    // Validate object\n    if (typeof sort === 'object' && !(sort instanceof Map)) {\n      const isValid = Object.values(sort).every((order: any) => {\n        if (![1, -1, 'asc', 'desc'].includes(order)) {\n          logError('Invalid sort object value: must be 1, -1, \"asc\", or \"desc\"', order);\n          return false;\n        }\n        return true;\n      });\n      return isValid;\n    }\n\n    // Validate Map\n    if (sort instanceof Map) {\n      const isValid = Array.from(sort.values()).every((order: any) => {\n        if (![1, -1, 'asc', 'desc'].includes(order)) {\n          logError('Invalid sort Map value: must be 1, -1, \"asc\", or \"desc\"', order);\n          return false;\n        }\n        return true;\n      });\n      return isValid;\n    }\n\n    // Invalid type\n    logError('Invalid sort type: must be string, array, object, or Map', sort);\n    return false;\n  }\n\n  pruneSort(sort = {}) {\n    const ret = {};\n    Object.keys(sort).forEach((key) => {\n      if (this.indexMap[key]) {\n        ret[key] = sort[key];\n      } else {\n        console.info(\n          `Please consider creating an index for field \"${key}\" in collection \"${this.modelName}\" for better sorting`,\n        );\n        ret[key] = sort[key];\n      }\n    });\n\n    return ret;\n  }\n\n  findOne({ filter, select, sort, populate, lean }: FindOneProps) {\n    if (!this.validateSort(sort as SortType)) {\n      sort = null;\n    }\n\n    let builder = this.model.findOne(filter as FilterQuery<any>);\n    if (select) builder = builder.select(select);\n    if (sort) builder = builder.sort(sort);\n    if (populate) builder = builder.populate(populate);\n    if (lean) builder = builder.lean();\n\n    return builder;\n  }\n\n  findOneAndDelete(filter) {\n    return this.model.findOneAndDelete(filter);\n  }\n\n  exists(filter) {\n    if (!filter) return null;\n    return this.findOne(filter).select('_id').lean();\n  }\n\n  // see https://mongoosejs.com/docs/api.html#query_Query-countDocuments\n  countDocuments(filter = {}) {\n    return this.model.countDocuments(filter);\n  }\n\n  // see https://mongoosejs.com/docs/api.html#model_Model.estimatedDocumentCount\n  estimatedDocumentCount() {\n    return this.model.estimatedDocumentCount();\n  }\n\n  // see https://mongoosejs.com/docs/api.html#model_Model.distinct\n  distinct(field: string, conditions = {}) {\n    return this.model.distinct(field, conditions);\n  }\n}\n\nexport default Model;\n","import { createLogger, format, transports } from 'winston';\n\nconst colorizer = format.colorize();\n\nexport const logger = createLogger({\n  level: process.env.EGOSE_LOG_LEVEL || 'info',\n  format: format.combine(\n    format.label({ label: '[EGOSE]' }),\n    format.timestamp({ format: 'YY-MM-DD HH:mm:ss' }),\n    format.printf((msg: { level: string; label: string; message: string; timestamp: string }) => {\n      const label = colorizer.colorize('notice', msg.label);\n      const timestamp = msg.timestamp;\n      const level = colorizer.colorize(msg.level, `[${msg.level.toUpperCase()}]`);\n      const message = colorizer.colorize(msg.level, msg.message);\n      return `${label} ${timestamp} ${level} ${message}`;\n    }),\n  ),\n  transports: [new transports.Console()],\n});\n","import compact from 'lodash/compact';\nimport filter from 'lodash/filter';\nimport flatten from 'lodash/flatten';\nimport get from 'lodash/get';\nimport isArray from 'lodash/isArray';\nimport isBoolean from 'lodash/isBoolean';\nimport isMatch from 'lodash/isMatch';\nimport isNil from 'lodash/isNil';\nimport isPlainObject from 'lodash/isPlainObject';\nimport isString from 'lodash/isString';\nimport pick from 'lodash/pick';\nimport { normalizeSelect, toObject } from '../helpers';\nimport { Service } from './service';\nimport {\n  Filter,\n  Sort,\n  MiddlewareContext,\n  FindAccess,\n  SubPopulate,\n  PublicListArgs,\n  PublicListOptions,\n  PublicReadArgs,\n  PublicReadOptions,\n  PublicCreateArgs,\n  PublicCreateOptions,\n  PublicUpdateArgs,\n  PublicUpdateOptions,\n  DistinctArgs,\n  Request,\n  BaseFilterAccess,\n  ServiceResult,\n  Task,\n} from '../interfaces';\n\nexport class PublicService extends Service {\n  // constructor(req: Request, modelName: string) {\n  //   super(req, modelName);\n  // }\n\n  async _list(filter: Filter, args?: PublicListArgs, options?: PublicListOptions): Promise<ServiceResult> {\n    const {\n      select = this.defaults.publicListArgs?.select,\n      populate = this.defaults.publicListArgs?.populate,\n      include = this.defaults.publicListArgs?.include,\n      sort = this.defaults.publicListArgs?.sort,\n      skip = this.defaults.publicListArgs?.skip,\n      limit = this.defaults.publicListArgs?.limit,\n      page = this.defaults.publicListArgs?.page,\n      pageSize = this.defaults.publicListArgs?.pageSize,\n      tasks = this.defaults.publicListArgs?.tasks ?? [],\n    } = args ?? {};\n\n    const {\n      skim = this.defaults.publicListOptions?.skim ?? true,\n      includePermissions = this.defaults.publicListOptions?.includePermissions ?? false,\n      includeCount = this.defaults.publicListOptions?.includeCount ?? false,\n      populateAccess = this.defaults.publicListOptions?.populateAccess ?? 'read',\n      lean = this.defaults.publicListOptions?.lean ?? true,\n    } = options ?? {};\n\n    const result = await this.find(\n      filter,\n      { select, populate, include, sort, skip, limit, page, pageSize },\n      { skim, includePermissions, includeCount, populateAccess, lean },\n      async (doc, context: MiddlewareContext) => {\n        doc = toObject(doc);\n        return this.decorate(doc, 'list', context);\n      },\n    );\n\n    if (!result.success) {\n      return result;\n    }\n\n    let docs = result.data;\n    docs = await this.decorateAll(docs, 'list', { model: this.model.model, modelName: this.modelName });\n    docs = docs.map((row) => this.runTasks(row, tasks));\n\n    result.data = docs;\n    return result;\n  }\n\n  async _create(data, args?: PublicCreateArgs, options?: PublicCreateOptions): Promise<ServiceResult> {\n    const {\n      select = this.defaults.publicCreateArgs?.select,\n      populate = this.defaults.publicCreateArgs?.populate,\n      tasks = this.defaults.publicCreateArgs?.tasks ?? [],\n    } = args ?? {};\n\n    const {\n      skim = this.defaults.publicCreateOptions?.skim ?? false,\n      includePermissions = this.defaults.publicCreateOptions?.includePermissions ?? true,\n      populateAccess = this.defaults.publicCreateOptions?.populateAccess ?? 'read',\n    } = options ?? {};\n\n    const result = await this.create(\n      data,\n      { populate },\n      { skim, includePermissions, populateAccess },\n      async (doc, context: MiddlewareContext) => {\n        doc = toObject(doc);\n        doc = await this.decorate(doc, 'create', context);\n        doc = this.runTasks(doc, tasks);\n\n        if (select) doc = pick(doc, [...normalizeSelect(select), ...this.baseFieldsExt]);\n        return doc;\n      },\n    );\n\n    return result;\n  }\n\n  async _new(): Promise<ServiceResult> {\n    return this.new();\n  }\n\n  async _read(id: string, args?: PublicReadArgs, options?: PublicReadOptions): Promise<ServiceResult> {\n    const {\n      select = this.defaults.publicReadArgs?.select,\n      populate = this.defaults.publicReadArgs?.populate,\n      include = this.defaults.publicReadArgs?.include,\n      tasks = this.defaults.publicReadArgs?.tasks ?? [],\n    } = args ?? {};\n\n    const {\n      skim = this.defaults.publicReadOptions?.skim ?? false,\n      includePermissions = this.defaults.publicReadOptions?.includePermissions ?? true,\n      tryList = this.defaults.publicReadOptions?.tryList ?? true,\n      populateAccess = this.defaults.publicReadOptions?.populateAccess,\n      lean = this.defaults.publicReadOptions?.lean ?? false,\n    } = options ?? {};\n\n    let access: FindAccess = 'read';\n    const idFilter = await this.genIDFilter(id);\n\n    let result = await this.findById(\n      id,\n      {\n        select,\n        populate,\n        include,\n        overrides: { idFilter },\n      },\n      { skim, includePermissions, access, populateAccess, lean },\n    );\n\n    // if not found, try to get the doc with 'list' access\n    if (!result.data && tryList) {\n      access = 'list';\n\n      result = await this.findById(\n        id,\n        {\n          select,\n          populate,\n          overrides: { idFilter },\n        },\n        { skim, includePermissions, access, populateAccess, lean },\n      );\n    }\n\n    if (!result.success) {\n      return result;\n    }\n\n    let doc = toObject(result.data);\n    doc = await this.decorate(doc, access, result.context);\n    doc = this.runTasks(doc, tasks);\n\n    result.data = doc;\n    return result;\n  }\n\n  async _readFilter(\n    filter: Filter,\n    args?: PublicReadArgs & { sort?: Sort },\n    options?: PublicReadOptions,\n  ): Promise<ServiceResult> {\n    const {\n      select = this.defaults.publicReadArgs?.select,\n      sort = this.defaults.publicListArgs?.sort,\n      populate = this.defaults.publicReadArgs?.populate,\n      include = this.defaults.publicReadArgs?.include,\n      tasks = this.defaults.publicReadArgs?.tasks ?? [],\n    } = args ?? {};\n\n    const {\n      skim = this.defaults.publicReadOptions?.skim ?? false,\n      includePermissions = this.defaults.publicReadOptions?.includePermissions ?? true,\n      tryList = this.defaults.publicReadOptions?.tryList ?? true,\n      populateAccess = this.defaults.publicReadOptions?.populateAccess,\n      lean = this.defaults.publicReadOptions?.lean ?? false,\n    } = options ?? {};\n\n    let access: FindAccess = 'read';\n\n    let result = await this.findOne(\n      filter,\n      {\n        select,\n        sort,\n        populate,\n        include,\n        overrides: {},\n      },\n      { skim, includePermissions, access, populateAccess, lean },\n    );\n\n    // if not found, try to get the doc with 'list' access\n    if (!result.data && tryList) {\n      access = 'list';\n\n      result = await this.findOne(\n        filter,\n        {\n          select,\n          sort,\n          populate,\n          overrides: {},\n        },\n        { skim, includePermissions, access, populateAccess, lean },\n      );\n    }\n\n    if (!result.success) {\n      return result;\n    }\n\n    let doc = toObject(result.data);\n    doc = await this.decorate(doc, access, result.context);\n    doc = this.runTasks(doc, tasks);\n\n    result.data = doc;\n    return result;\n  }\n\n  async _update(id: string, data, args?: PublicUpdateArgs, options?: PublicUpdateOptions): Promise<ServiceResult> {\n    const {\n      select = this.defaults.publicUpdateArgs?.select,\n      populate = this.defaults.publicUpdateArgs?.populate,\n      tasks = this.defaults.publicUpdateArgs?.tasks ?? [],\n    } = args ?? {};\n\n    const {\n      skim = this.defaults.publicUpdateOptions?.skim ?? false,\n      returningAll = this.defaults.publicUpdateOptions?.returningAll ?? true,\n      includePermissions = this.defaults.publicUpdateOptions?.includePermissions ?? true,\n      populateAccess = this.defaults.publicUpdateOptions?.populateAccess ?? 'read',\n    } = options ?? {};\n\n    const result = await this.updateById(\n      id,\n      data,\n      { populate },\n      { skim, includePermissions, populateAccess },\n      async (doc, context: MiddlewareContext) => {\n        doc = toObject(doc);\n        doc = await this.decorate(doc, 'update', context);\n        doc = this.runTasks(doc, tasks);\n\n        if (select) doc = pick(doc, [...normalizeSelect(select), ...this.baseFieldsExt]);\n        else if (!returningAll) doc = pick(doc, [...Object.keys(data), '_id']);\n\n        return doc;\n      },\n    );\n\n    return result;\n  }\n\n  async _delete(id: string): Promise<ServiceResult> {\n    const result = await this.delete(id);\n    return result;\n  }\n\n  async _distinct(field: string, options: DistinctArgs = {}): Promise<ServiceResult> {\n    const result = await this.distinct(field, options);\n    return result;\n  }\n\n  async _count(filter, access: BaseFilterAccess = 'list'): Promise<ServiceResult> {\n    const result = await this.count(filter, access);\n    return result;\n  }\n}\n","import { getDataOptions } from '../options';\nimport { findElement, filterCollection, genPagination, parseSortString } from '../helpers';\nimport {\n  MiddlewareContext,\n  DataMiddlewareContext,\n  Request,\n  Projection,\n  SelectAccess,\n  DecorateAccess,\n  DecorateAllAccess,\n  BaseFilterAccess,\n  DataRouterOptions,\n  DataFilter,\n  DataFindOneArgs,\n  DataFindOneOptions,\n  DataFindArgs,\n  DataFindOptions,\n  ServiceResult,\n} from '../interfaces';\nimport { Codes } from '../enums';\nimport { orderBy, pick } from 'lodash';\n\nexport class DataService<T> {\n  req: Request;\n  dataName: string;\n  options: DataRouterOptions;\n  data: T[];\n\n  constructor(req: Request, dataName: string) {\n    this.req = req;\n    this.dataName = dataName;\n    this.options = getDataOptions(dataName);\n    this.data = this.options.data ?? [];\n  }\n\n  public async findOne(\n    filter: DataFilter,\n    args?: DataFindOneArgs,\n    options?: DataFindOneOptions,\n  ): Promise<ServiceResult> {\n    const { select } = args ?? {};\n    const { access = 'read' } = options ?? {};\n\n    let [_filter, _select] = await Promise.all([this.genFilter(access, filter), this.genSelect(access, select)]);\n\n    const query = {\n      filter: _filter,\n      select: _select,\n    };\n\n    if (_filter === false) return { success: false, code: Codes.Forbidden, data: null, query };\n\n    let doc = await findElement(this.data, _filter);\n    if (!doc) return { success: false, code: Codes.NotFound, data: null, query };\n    doc = await this.pickAllowedFields(doc, access);\n    if (_select.length > 0) doc = pick(doc, _select);\n\n    return { success: true, code: Codes.Success, data: doc, query };\n  }\n\n  public async findById(id: string, args?: DataFindOneArgs, options?: DataFindOneOptions): Promise<ServiceResult> {\n    const { select } = args ?? {};\n    const { access = 'read' } = options ?? {};\n    const filter = await this.genIDFilter(id);\n\n    return this.findOne(\n      filter,\n      {\n        select,\n      },\n      { access },\n    );\n  }\n\n  public async find(filter: DataFilter, args?: DataFindArgs, options?: DataFindOptions): Promise<ServiceResult> {\n    const { select, sort, skip, limit, page, pageSize } = args ?? {};\n\n    const [_filter, _select, pagination] = await Promise.all([\n      this.genFilter('list', filter),\n      this.genSelect('list', select),\n      genPagination({ skip, limit, page, pageSize }, this.options.listHardLimit),\n    ]);\n\n    const query = {\n      filter: _filter,\n      select: _select,\n      sort,\n      ...pagination,\n    };\n\n    if (_filter === false) return { success: false, code: 'forbidden', data: [], count: 0, totalCount: null, query };\n\n    let docs = await filterCollection(this.data, _filter);\n\n    docs = await Promise.all(\n      docs.map(async (doc) => {\n        doc = await this.pickAllowedFields(doc, 'list');\n        if (_select.length > 0) doc = pick(doc, _select);\n        return doc;\n      }),\n    );\n\n    if (sort) {\n      const { sortKey, sortOrder } = parseSortString(sort);\n      docs = orderBy(docs, [sortKey], [sortOrder]);\n    }\n\n    docs = docs.slice(query.skip, query.limit && query.skip + query.limit);\n\n    return {\n      success: true,\n      code: Codes.Success,\n      data: docs,\n      count: docs.length,\n      totalCount: this.data.length,\n      query,\n    };\n  }\n\n  public decorate(doc: any, access: DecorateAccess, context?: DataMiddlewareContext): Promise<any> {\n    return this.req.dacl.decorate(this.dataName, doc, access, context);\n  }\n\n  public decorateAll(docs: any[], access: DecorateAllAccess): Promise<any> {\n    return this.req.dacl.decorateAll(this.dataName, docs, access);\n  }\n\n  public genAllowedFields(doc: any, access: SelectAccess, baseFields?: string[]): Promise<string[]> {\n    return this.req.dacl.genAllowedFields(this.dataName, doc, access, baseFields);\n  }\n\n  public genFilter(access?: BaseFilterAccess, filter?) {\n    return this.req.dacl.genFilter(this.dataName, access, filter);\n  }\n\n  public genIDFilter(id: string): Promise<any> {\n    return this.req.dacl.genIDFilter(this.dataName, id);\n  }\n\n  public genSelect(\n    access: SelectAccess,\n    targetFields?: Projection,\n    skipChecks?: boolean,\n    subPaths?: string[],\n  ): Promise<any[]> {\n    return this.req.dacl.genSelect(this.dataName, access, targetFields, skipChecks, subPaths);\n  }\n\n  public pickAllowedFields(doc: any, access: SelectAccess, baseFields?: string[]): Promise<any> {\n    return this.req.dacl.pickAllowedFields(this.dataName, doc, access, baseFields);\n  }\n}\n","import castArray from 'lodash/castArray';\nimport cloneDeep from 'lodash/cloneDeep';\nimport forEach from 'lodash/forEach';\nimport get from 'lodash/get';\nimport isArray from 'lodash/isArray';\nimport map from 'lodash/map';\nimport set from 'lodash/set';\n\ninterface ProcessCopy {\n  src: string;\n  dest: string;\n}\n\ninterface CopyAndDepopulateOptions {\n  mutable?: boolean;\n  idField?: string;\n}\n\nexport const copyAndDepopulate = (\n  docObject: any,\n  operations: ProcessCopy[],\n  options: CopyAndDepopulateOptions = { mutable: true, idField: '_id' },\n) => {\n  const obj = get(options, 'mutable', true) ? docObject : cloneDeep(docObject);\n  const idField = get(options, 'idField', '_id');\n\n  forEach(castArray<ProcessCopy>(operations), (op) => {\n    if (!op.src || !op.dest) return;\n\n    let targets = [obj];\n    const segs = op.src.split('.');\n    forEach<string>(segs, (seg, ind) => {\n      if (segs.length === ind + 1) {\n        forEach(targets, (target) => {\n          set(target, op.dest, get(target, seg));\n          set(target, seg, isArray(target[seg]) ? map(target[seg], idField) : get(target, `${seg}.${idField}`));\n        });\n      } else {\n        targets = targets.reduce((ret, target) => {\n          if (isArray(target[seg])) ret.push(...target[seg]);\n          else ret.push(target[seg]);\n\n          return ret;\n        }, []);\n      }\n    });\n  });\n\n  return obj;\n};\n","export const MIDDLEWARE = Symbol('middleware');\nexport const DATA_MIDDLEWARE = Symbol('data-middleware');\nexport const CORE = Symbol('core');\nexport const PERMISSIONS = Symbol('permissions');\nexport const PERMISSION_KEYS = Symbol('permission-keys');\n","export class Cache<K, V> {\n  private cache: Map<K, V>;\n\n  constructor() {\n    this.cache = new Map();\n  }\n\n  set(key: K, value: V): void {\n    this.cache.set(key, value);\n  }\n\n  get(key: K): V | undefined {\n    return this.cache.get(key);\n  }\n\n  delete(key: K): void {\n    this.cache.delete(key);\n  }\n\n  clear(): void {\n    this.cache.clear();\n  }\n\n  has(key: K): boolean {\n    return this.cache.has(key);\n  }\n\n  keys(): K[] {\n    return Array.from(this.cache.keys());\n  }\n\n  values(): V[] {\n    return Array.from(this.cache.values());\n  }\n\n  size(): number {\n    return this.cache.size;\n  }\n}\n","import JsonRouter from 'express-json-router';\nimport isString from 'lodash/isString';\nimport isPlainObject from 'lodash/isPlainObject';\nimport isUndefined from 'lodash/isUndefined';\nimport forEach from 'lodash/forEach';\nimport padEnd from 'lodash/padEnd';\nimport Model from '../model';\nimport { checkIfReady, listen, getModelSub } from '../meta';\nimport { setCore } from '../core';\nimport { setModelOptions, setModelOption, getModelOptions } from '../options';\nimport { processUrl } from '../lib';\nimport { handleResultError } from '../helpers';\nimport { ModelRouterOptions, ExtendedModelRouterOptions, Request, Task } from '../interfaces';\nimport { CustomHeaders } from '../enums';\nimport { logger } from '../logger';\n\nconst clientErrors = JsonRouter.clientErrors;\nconst success = JsonRouter.success;\n\ntype SetTargetOption = {\n  (option: any): ModelRouter;\n  (key: string, option: any): ModelRouter;\n};\n\nfunction setOption(parentKey: string, optionKey: any, option?: any) {\n  const key = isUndefined(option) ? parentKey : `${parentKey}.${optionKey}`;\n  const value = isUndefined(option) ? optionKey : option;\n\n  setModelOption(this.modelName, key as keyof ExtendedModelRouterOptions, value);\n  return this;\n}\n\nconst parseBooleanString = (str: string, defaultValue?: any) => (str ? str === 'true' : defaultValue);\n\nexport class ModelRouter {\n  readonly modelName: string;\n  readonly router: JsonRouter;\n  readonly model: Model;\n  readonly options: ModelRouterOptions;\n  readonly fullBasePath: string;\n\n  constructor(modelName: string, initialOptions: ModelRouterOptions) {\n    setModelOptions(modelName, initialOptions);\n    this.options = getModelOptions(modelName);\n    this.fullBasePath = processUrl(this.options.parentPath + this.options.basePath);\n    this.modelName = modelName;\n    this.router = new JsonRouter(this.options.basePath, setCore);\n    this.model = new Model(modelName);\n\n    this.setCollectionRoutes();\n    this.setDocumentRoutes();\n\n    const runAsyncTasks = () => {\n      this.setSubDocumentRoutes();\n      this.logEndpoints();\n    };\n\n    if (checkIfReady()) {\n      runAsyncTasks();\n    } else {\n      listen(runAsyncTasks);\n    }\n  }\n\n  ///////////////////////\n  // Collection Routes //\n  ///////////////////////\n  private setCollectionRoutes() {\n    //////////\n    // LIST //\n    //////////\n    this.router.get('', async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'list');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const { skip, limit, page, page_size, skim, include_permissions, include_count, include_extra_headers } =\n        req.query;\n\n      const svc = req.macl.getPublicService(this.modelName);\n\n      const includeCount = parseBooleanString(include_count);\n      const includeExtraHeaders = parseBooleanString(include_extra_headers);\n\n      const result = await svc._list(\n        {},\n        { skip, limit, page, pageSize: page_size },\n        {\n          skim: parseBooleanString(skim),\n          includePermissions: parseBooleanString(include_permissions),\n          includeCount,\n        },\n      );\n\n      handleResultError(result);\n\n      const { data, totalCount } = result;\n\n      if (includeCount) {\n        if (includeExtraHeaders) {\n          req.res.setHeader(CustomHeaders.TotalCount, totalCount);\n          return data;\n        }\n\n        return { count: totalCount, rows: data };\n      }\n\n      return data;\n    });\n\n    /////////////////////\n    // LIST - Advanced //\n    /////////////////////\n    this.router.post(`/${this.options.queryPath}`, async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'list');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      // @Deprecated option 'query'\n      let {\n        query,\n        filter,\n        select,\n        sort,\n        populate,\n        include,\n        tasks,\n        skip,\n        limit,\n        page,\n        pageSize,\n        options = {},\n      } = req.body ?? {};\n      const { skim, includePermissions, includeCount, includeExtraHeaders, populateAccess } = options;\n\n      const svc = req.macl.getPublicService(this.modelName);\n\n      const result = await svc._list(\n        filter ?? query,\n        { select, sort, populate, include, tasks, skip, limit, page, pageSize },\n        {\n          skim,\n          includePermissions,\n          includeCount,\n          populateAccess,\n        },\n      );\n\n      handleResultError(result);\n\n      const { data, totalCount } = result;\n\n      if (includeCount) {\n        if (includeExtraHeaders) {\n          req.res.setHeader(CustomHeaders.TotalCount, totalCount);\n          return data;\n        }\n\n        return { count: totalCount, rows: data };\n      }\n\n      return data;\n    });\n\n    ////////////\n    // CREATE //\n    ////////////\n    this.router.post('', async (req: Request, res) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'create');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const { include_permissions } = req.query;\n\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._create(\n        req.body ?? {},\n        {},\n        { includePermissions: parseBooleanString(include_permissions) },\n      );\n\n      handleResultError(result);\n\n      return new success.Created(result.count === 1 ? result.data[0] : result.data);\n    });\n\n    ///////////////////////\n    // CREATE - Advanced //\n    ///////////////////////\n    this.router.post(`/${this.options.mutationPath}`, async (req: Request, res) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'create');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const { include_permissions } = req.query;\n      const { data, select, populate, tasks, options = {} } = req.body ?? {};\n      const { includePermissions, populateAccess } = options;\n\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._create(\n        data,\n        { select, populate, tasks },\n        { includePermissions: includePermissions ?? parseBooleanString(include_permissions), populateAccess },\n      );\n\n      handleResultError(result);\n\n      return new success.Created(result.count === 1 ? result.data[0] : result.data);\n    });\n\n    /////////////////\n    // NEW - EMPTY //\n    /////////////////\n    this.router.get('/new', async (req: Request) => {\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._new();\n\n      handleResultError(result);\n\n      return result.data;\n    });\n  }\n\n  /////////////////////\n  // Document Routes //\n  /////////////////////\n  private setDocumentRoutes() {\n    ///////////\n    // COUNT //\n    ///////////\n    this.router.get('/count', async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'count');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._count({});\n\n      handleResultError(result);\n\n      return result.data;\n    });\n\n    this.router.post('/count', async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'count');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      // @Deprecated option 'query'\n      const { query, filter, access } = req.body ?? {};\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._count(filter ?? query, access);\n\n      handleResultError(result);\n\n      return result.data;\n    });\n\n    //////////\n    // READ //\n    //////////\n    this.router.get(`/:${this.options.idParam}`, async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'read');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const id = req.params[this.options.idParam];\n      const { include_permissions, try_list } = req.query;\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._read(\n        id,\n        {},\n        {\n          includePermissions: parseBooleanString(include_permissions),\n          tryList: parseBooleanString(try_list),\n        },\n      );\n\n      handleResultError(result);\n\n      return result.data;\n    });\n\n    //////////////////////////////\n    // READ - Advanced - Filter //\n    //////////////////////////////\n    this.router.post(`/${this.options.queryPath}/__filter`, async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'read');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      let { filter, select, sort, populate, include, tasks, options = {} } = req.body ?? {};\n      const { skim, includePermissions, tryList, populateAccess } = options;\n\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._readFilter(\n        filter,\n        {\n          select,\n          sort,\n          populate,\n          include,\n          tasks,\n        },\n        { skim, includePermissions, tryList, populateAccess },\n      );\n\n      handleResultError(result);\n\n      return result.data;\n    });\n\n    /////////////////////\n    // READ - Advanced //\n    /////////////////////\n    this.router.post(`/${this.options.queryPath}/:${this.options.idParam}`, async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'read');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const id = req.params[this.options.idParam];\n      let { select, populate, include, tasks, options = {} } = req.body ?? {};\n      const { skim, includePermissions, tryList, populateAccess } = options;\n\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._read(\n        id,\n        {\n          select,\n          populate,\n          include,\n          tasks,\n        },\n        { skim, includePermissions, tryList, populateAccess },\n      );\n\n      handleResultError(result);\n\n      return result.data;\n    });\n\n    ////////////\n    // UPDATE //\n    ////////////\n    this.router.patch(`/:${this.options.idParam}`, async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'update');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const id = req.params[this.options.idParam];\n      const { returning_all } = req.query;\n\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._update(id, req.body ?? {}, {}, { returningAll: parseBooleanString(returning_all) });\n\n      handleResultError(result);\n\n      return result.data;\n    });\n\n    ///////////////////////\n    // UPDATE - Advanced //\n    ///////////////////////\n    this.router.patch(`/${this.options.mutationPath}/:${this.options.idParam}`, async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'update');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const id = req.params[this.options.idParam];\n      const { returning_all } = req.query;\n      const { data, select, populate, tasks, options = {} } = req.body ?? {};\n      const { returningAll, includePermissions, populateAccess } = options;\n\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._update(\n        id,\n        data,\n        { select, populate, tasks },\n        { returningAll: returningAll ?? parseBooleanString(returning_all), includePermissions, populateAccess },\n      );\n\n      handleResultError(result);\n\n      return result.data;\n    });\n\n    ////////////\n    // UPSERT //\n    ////////////\n    this.router.put(`/`, async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'upsert');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const svc = req.macl.getPublicService(this.modelName);\n      const idKey = svc.getIdentifier();\n      if (idKey !== '_id') throw new clientErrors.BadRequest('not supported identifier');\n\n      const { returning_all, include_permissions } = req.query;\n      const { [idKey]: idVal, ...data } = req.body ?? {};\n\n      if (idVal) {\n        const existing = await svc.exists({ [idKey]: idVal }, { access: 'update' });\n        if (!existing.data) throw new clientErrors.UnauthorizedError();\n\n        const result = await svc._update(idVal, data, {}, { returningAll: parseBooleanString(returning_all) });\n\n        handleResultError(result);\n        return result.data;\n      } else {\n        const result = await svc._create(data, {}, { includePermissions: parseBooleanString(include_permissions) });\n\n        handleResultError(result);\n        return new success.Created(result.data.length > 0 ? result.data[0] : null);\n      }\n    });\n\n    ///////////////////////\n    // UPSERT - Advanced //\n    ///////////////////////\n    this.router.put(`/${this.options.mutationPath}`, async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'upsert');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const svc = req.macl.getPublicService(this.modelName);\n      const idKey = svc.getIdentifier();\n      if (idKey !== '_id') throw new clientErrors.BadRequest('not supported identifier');\n\n      const { returning_all, include_permissions } = req.query;\n      const { data, select, populate, tasks, options = {} } = req.body ?? {};\n      const { returningAll, includePermissions, populateAccess } = options;\n      const { [idKey]: idVal, ...otherData } = data;\n\n      if (idVal) {\n        const existing = await svc.exists({ [idKey]: idVal }, { access: 'update' });\n        if (!existing.data) throw new clientErrors.UnauthorizedError();\n\n        const result = await svc._update(\n          idVal,\n          otherData,\n          { select, populate, tasks },\n          {\n            returningAll: returningAll ?? parseBooleanString(returning_all),\n            includePermissions: includePermissions ?? parseBooleanString(include_permissions),\n            populateAccess,\n          },\n        );\n\n        handleResultError(result);\n        return result.data;\n      } else {\n        const result = await svc._create(\n          otherData,\n          { select, populate, tasks },\n          {\n            includePermissions: includePermissions ?? parseBooleanString(include_permissions),\n            populateAccess,\n          },\n        );\n\n        handleResultError(result);\n        return new success.Created(result.data.length > 0 ? result.data[0] : null);\n      }\n    });\n\n    ////////////\n    // DELETE //\n    ////////////\n    this.router.delete(`/:${this.options.idParam}`, async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'delete');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const id = req.params[this.options.idParam];\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._delete(id);\n\n      handleResultError(result);\n\n      return result.data;\n    });\n\n    //////////////\n    // DISTINCT //\n    //////////////\n    this.router.get('/distinct/:field', async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'distinct');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const { field } = req.params;\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._distinct(field);\n\n      handleResultError(result);\n\n      return result.data;\n    });\n\n    this.router.post('/distinct/:field', async (req: Request) => {\n      const allowed = await req.macl.isAllowed(this.modelName, 'distinct');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const { field } = req.params;\n      // @Deprecated option 'query'\n      const { query, filter } = req.body ?? {};\n\n      const svc = req.macl.getPublicService(this.modelName);\n      const result = await svc._distinct(field, { filter: filter ?? query });\n\n      handleResultError(result);\n\n      return result.data;\n    });\n  }\n\n  /////////////////////////\n  // Sub-Document Routes //\n  /////////////////////////\n  private setSubDocumentRoutes() {\n    const subs = getModelSub(this.modelName);\n\n    for (let x = 0; x < subs.length; x++) {\n      const sub = subs[x];\n\n      //////////\n      // LIST //\n      //////////\n      this.router.get(`/:${this.options.idParam}/${sub}`, async (req: Request) => {\n        const allowed = await req.macl.isAllowed(this.modelName, `subs.${sub}.list`);\n        if (!allowed) throw new clientErrors.UnauthorizedError();\n\n        const id = req.params[this.options.idParam];\n        const svc = req.macl.getPublicService(this.modelName);\n        const result = await svc.listSub(id, sub);\n\n        handleResultError(result);\n        return result.data;\n      });\n\n      /////////////////////\n      // LIST - Advanced //\n      /////////////////////\n      this.router.post(`/:${this.options.idParam}/${sub}/${this.options.queryPath}`, async (req: Request) => {\n        const allowed = await req.macl.isAllowed(this.modelName, `subs.${sub}.list`);\n        if (!allowed) throw new clientErrors.UnauthorizedError();\n\n        const id = req.params[this.options.idParam];\n        const svc = req.macl.getPublicService(this.modelName);\n        const result = await svc.listSub(id, sub, req.body ?? {});\n\n        handleResultError(result);\n        return result.data;\n      });\n\n      /////////////////\n      // BULK UPDATE //\n      /////////////////\n      this.router.patch(`/:${this.options.idParam}/${sub}`, async (req: Request) => {\n        const allowed = await req.macl.isAllowed(this.modelName, `subs.${sub}.update`);\n        if (!allowed) throw new clientErrors.UnauthorizedError();\n\n        const id = req.params[this.options.idParam];\n        const svc = req.macl.getPublicService(this.modelName);\n        const result = await svc.bulkUpdateSub(id, sub, req.body ?? {});\n\n        handleResultError(result);\n        return result.data;\n      });\n\n      //////////\n      // READ //\n      //////////\n      this.router.get(`/:${this.options.idParam}/${sub}/:subId`, async (req: Request) => {\n        const allowed = await req.macl.isAllowed(this.modelName, `subs.${sub}.read`);\n        if (!allowed) throw new clientErrors.UnauthorizedError();\n\n        const id = req.params[this.options.idParam];\n        const { subId } = req.params;\n        const svc = req.macl.getPublicService(this.modelName);\n        const result = await svc.readSub(id, sub, subId);\n\n        handleResultError(result);\n        return result.data;\n      });\n\n      /////////////////////\n      // READ - Advanced //\n      /////////////////////\n      this.router.post(`/:${this.options.idParam}/${sub}/:subId/${this.options.queryPath}`, async (req: Request) => {\n        const allowed = await req.macl.isAllowed(this.modelName, `subs.${sub}.read`);\n        if (!allowed) throw new clientErrors.UnauthorizedError();\n\n        const id = req.params[this.options.idParam];\n        const { subId } = req.params;\n        const svc = req.macl.getPublicService(this.modelName);\n        const result = await svc.readSub(id, sub, subId, req.body ?? {});\n\n        handleResultError(result);\n        return result.data;\n      });\n\n      ////////////\n      // UPDATE //\n      ////////////\n      this.router.patch(`/:${this.options.idParam}/${sub}/:subId`, async (req: Request) => {\n        const allowed = await req.macl.isAllowed(this.modelName, `subs.${sub}.update`);\n        if (!allowed) throw new clientErrors.UnauthorizedError();\n\n        const id = req.params[this.options.idParam];\n        const { subId } = req.params;\n        const svc = req.macl.getPublicService(this.modelName);\n        const result = await svc.updateSub(id, sub, subId, req.body ?? {});\n\n        handleResultError(result);\n        return result.data;\n      });\n\n      ////////////\n      // CREATE //\n      ////////////\n      this.router.post(`/:${this.options.idParam}/${sub}`, async (req: Request) => {\n        const allowed = await req.macl.isAllowed(this.modelName, `subs.${sub}.create`);\n        if (!allowed) throw new clientErrors.UnauthorizedError();\n\n        const id = req.params[this.options.idParam];\n        const svc = req.macl.getPublicService(this.modelName);\n        const result = await svc.createSub(id, sub, req.body ?? {});\n\n        handleResultError(result);\n\n        return new success.Created(result.data);\n      });\n\n      ////////////\n      // DELETE //\n      ////////////\n      this.router.delete(`/:${this.options.idParam}/${sub}/:subId`, async (req: Request) => {\n        const allowed = await req.macl.isAllowed(this.modelName, `subs.${sub}.delete`);\n        if (!allowed) throw new clientErrors.UnauthorizedError();\n\n        const id = req.params[this.options.idParam];\n        const { subId } = req.params;\n        const svc = req.macl.getPublicService(this.modelName);\n        const result = await svc.deleteSub(id, sub, subId);\n\n        handleResultError(result);\n        return result.data;\n      });\n    }\n  }\n\n  private logEndpoints() {\n    forEach(this.router.endpoints, ({ method, path }) => {\n      logger.info(`${padEnd(method, 6)} ${processUrl(this.options.parentPath + path)}`);\n    });\n  }\n\n  set<K extends keyof ExtendedModelRouterOptions>(keyOrOptions: K | ModelRouterOptions, value?: unknown) {\n    if (arguments.length === 2 && isString(keyOrOptions)) {\n      setModelOption(this.modelName, keyOrOptions as K, value as ExtendedModelRouterOptions[K]);\n    }\n\n    if (arguments.length === 1 && isPlainObject(keyOrOptions)) {\n      setModelOptions(this.modelName, keyOrOptions as ModelRouterOptions);\n    }\n\n    return this;\n  }\n\n  setOption<K extends keyof ExtendedModelRouterOptions>(key: K, option: ExtendedModelRouterOptions[K]) {\n    setModelOption(this.modelName, key, option);\n    return this;\n  }\n\n  setOptions(options: ModelRouterOptions) {\n    setModelOptions(this.modelName, options);\n    return this;\n  }\n\n  /**\n   * The maximum limit of the number of documents returned from the `list` operation.\n   */\n  public listHardLimit: SetTargetOption = setOption.bind(this, 'listHardLimit');\n\n  /**\n   * The object schema to define the access control policy for each model field.\n   */\n  public permissionSchema: SetTargetOption = setOption.bind(this, 'permissionSchema');\n\n  /**\n   * The object field to store the document permissions.\n   */\n  public permissionField: SetTargetOption = setOption.bind(this, 'permissionField');\n\n  /**\n   * The essential model fields involved in generating document permissions.\n   */\n  public mandatoryFields: SetTargetOption = setOption.bind(this, 'mandatoryFields');\n\n  /**\n   * The function called in the process of generating document permissions.\n   */\n  public docPermissions: SetTargetOption = setOption.bind(this, 'docPermissions');\n\n  /**\n   * The access control policy for CRUDL endpoints.\n   * @operation `create`, `list`, `read`, `update`, `delete`\n   */\n  public routeGuard: SetTargetOption = setOption.bind(this, 'routeGuard');\n\n  /**\n   * The base filter definitions applied in every query transaction.\n   * @operation `list`, `read`, `update`, `delete`\n   */\n  public baseFilter: SetTargetOption = setOption.bind(this, 'baseFilter');\n\n  /**\n   * The override filter definitions applied in every query transaction.\n   * @operation `list`, `read`, `update`, `delete`\n   */\n  public overrideFilter: SetTargetOption = setOption.bind(this, 'overrideFilter');\n\n  /**\n   * Middleware\n   *\n   * The function called before a new/update document data is processed in `prepare` hooks. This method is used to validate `write data` and throw an error if not valid.\n   * @operation `create`, `update`\n   */\n  public validate: SetTargetOption = setOption.bind(this, 'validate');\n\n  /**\n   * Middleware\n   *\n   * The function called before a new document is created or an existing document is updated. This method is used to process raw data passed into the API endpoints.\n   * @operation `create`, `update`\n   */\n  public prepare: SetTargetOption = setOption.bind(this, 'prepare');\n\n  /**\n   * Middleware\n   *\n   * The function called before an updated document is saved.\n   * @operation `update`\n   */\n  public transform: SetTargetOption = setOption.bind(this, 'transform');\n\n  /**\n   * Middleware\n   *\n   * The function called after a new document is created or an updated document is saved.\n   * @operation `create`, `update`\n   */\n  public finalize: SetTargetOption = setOption.bind(this, 'finalize');\n\n  /**\n   * Middleware\n   *\n   * The function called after a updated document finalized\n   * @operation `update`\n   */\n  public change: SetTargetOption = setOption.bind(this, 'change');\n\n  /**\n   * Middleware\n   *\n   * The function called before response data is sent. This method is used to process raw data to apply custom logic before sending the result.\n   * @operation `list`, `read`, `create`, `update`\n   */\n  public decorate: SetTargetOption = setOption.bind(this, 'decorate');\n\n  /**\n   * Middleware\n   *\n   * The function are called before response data is sent and after `decorate` middleware runs. This method is used to process and filter multiple document objects before sending the result.\n   * @operation `list`\n   */\n  public decorateAll: SetTargetOption = setOption.bind(this, 'decorateAll');\n\n  /**\n   * The document selector definition with the `id` param.\n   * @option `string` | `Function`\n   * @operation `read`, `update`, `delete`\n   */\n  public identifier: SetTargetOption = setOption.bind(this, 'identifier');\n\n  /**\n   * The default values used when missing in the operations.\n   */\n  public defaults: SetTargetOption = setOption.bind(this, 'defaults');\n\n  get routes() {\n    return this.router.original;\n  }\n}\n","import JsonRouter from 'express-json-router';\nimport castArray from 'lodash/castArray';\nimport _isNumber from 'lodash/isNumber';\nimport _orderBy from 'lodash/orderBy';\nimport { setCore } from '../core';\nimport { mapCodeToMessage, mapCodeToStatusCode } from '../helpers';\nimport { getGlobalOption, getModelOption } from '../options';\nimport {\n  RootRouterOptions,\n  ModelRouterOptions,\n  Validation,\n  RootQueryEntry,\n  Request,\n  ServiceResult,\n  RouteGuardAccess,\n} from '../interfaces';\nimport { MIDDLEWARE, PERMISSIONS, PERMISSION_KEYS } from '../symbols';\nimport { Codes, StatusCodes } from '../enums';\n\nconst clientErrors = JsonRouter.clientErrors;\n\nconst ALL_ROUTES = ['new', 'list', 'read', 'update', 'delete', 'create', 'distinct', 'count'];\n\nexport class RootRouter {\n  router: JsonRouter;\n  basename: string;\n  routeGuard: Validation;\n\n  constructor(options: RootRouterOptions = { basePath: '', routeGuard: true }) {\n    const { basePath, routeGuard } = options;\n\n    this.basename = basePath || '';\n    this.routeGuard = routeGuard;\n    this.router = new JsonRouter(this.basename, setCore);\n    this.setRoutes();\n  }\n\n  private processResult(op: string, { success, code, data, count, totalCount, errors }: ServiceResult) {\n    const message = mapCodeToMessage(code);\n    const statusCode = mapCodeToStatusCode(code);\n    return { success, code, data, count, totalCount, errors, message, statusCode, op };\n  }\n\n  private async processOp(req: Request, item: RootQueryEntry) {\n    const svc = req.macl.getPublicService(item.model);\n    if (!svc) return { success: false, code: Codes.BadRequest, data: null, message: `Model ${item.model} not found` };\n\n    if (!ALL_ROUTES.includes(item.op))\n      return { success: false, code: Codes.BadRequest, data: null, message: `Operation ${item.op} not found` };\n\n    const routeGuard = getModelOption(item.model, `routeGuard.${item.op as RouteGuardAccess}`);\n    const allowed = await req.macl.canActivate(routeGuard);\n    if (!allowed) return { success: false, code: Codes.Unauthorized, data: null, message: 'Unauthorized' };\n\n    if (item.op === 'list') {\n      return this.processResult(item.op, await svc._list(item.filter, item.args, item.options));\n    } else if (item.op === 'create') {\n      return this.processResult(item.op, await svc._create(item.data, item.args));\n    } else if (item.op === 'new') {\n      return this.processResult(item.op, await svc._new());\n    } else if (item.op === 'read') {\n      if (item.id) {\n        return this.processResult(item.op, await svc._read(item.id, item.args, item.options));\n      }\n      if (item.filter) {\n        return this.processResult(item.op, await svc._readFilter(item.filter, item.args, item.options));\n      }\n      return { success: false, code: Codes.BadRequest, data: null, message: `Operation ${item.op} invalid` };\n    } else if (item.op === 'update') {\n      return this.processResult(item.op, await svc._update(item.id, item.data, item.args, item.options));\n    } else if (item.op === 'delete') {\n      return this.processResult(item.op, await svc._delete(item.id));\n    } else if (item.op === 'distinct') {\n      return this.processResult(item.op, await svc._distinct(item.field, { filter: item.filter }));\n    } else if (item.op === 'count') {\n      return this.processResult(item.op, await svc._count(item.filter));\n    } else {\n      return { success: false, code: Codes.BadRequest, data: null, message: `operation ${item.op} not found` };\n    }\n  }\n\n  private groupItemsByOrder(items: RootQueryEntry[]) {\n    return items.reduce((acc: { item: RootQueryEntry; index: number }[][], item: RootQueryEntry, index: number) => {\n      let order = 0;\n\n      if (_isNumber(item.order)) {\n        order = item.order < 0 ? 0 : item.order;\n      }\n\n      if (!acc[order]) {\n        acc[order] = [];\n      }\n\n      acc[order].push({ index, item });\n      return acc;\n    }, []);\n  }\n\n  private setRoutes() {\n    this.router.post('', async (req: Request) => {\n      const allowed = await req.macl.canActivate(this.routeGuard);\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const items: RootQueryEntry[] = req.body ?? [];\n      const groupedItems = this.groupItemsByOrder(items);\n\n      const results = [];\n      for (let x = 0; x < groupedItems.length; x++) {\n        const arrResult = await Promise.all(\n          groupedItems[x].map(async ({ item, index }) => {\n            const ret = await this.processOp(req, item);\n            return { ret, index };\n          }),\n        );\n\n        results.push(...arrResult);\n      }\n\n      return _orderBy(results, ['index'], ['asc']).map(({ ret }) => ret);\n    });\n  }\n\n  get routes() {\n    return this.router.original;\n  }\n}\n","import JsonRouter from 'express-json-router';\nimport isString from 'lodash/isString';\nimport isPlainObject from 'lodash/isPlainObject';\nimport isUndefined from 'lodash/isUndefined';\nimport forEach from 'lodash/forEach';\nimport padEnd from 'lodash/padEnd';\nimport Model from '../model';\nimport { setDataCore } from '../core-data';\nimport { setDataOption, setDataOptions, getDataOption, getDataOptions, getDataNames } from '../options';\nimport { processUrl } from '../lib';\nimport { handleResultError } from '../helpers';\nimport { DataRouterOptions, Request } from '../interfaces';\nimport { CustomHeaders } from '../enums';\nimport { logger } from '../logger';\n\nconst clientErrors = JsonRouter.clientErrors;\nconst success = JsonRouter.success;\n\ntype SetTargetOption = {\n  (option: any): DataRouter;\n  (key: string, option: any): DataRouter;\n};\n\nfunction setOption(parentKey: string, optionKey: any, option?: any) {\n  const key = isUndefined(option) ? parentKey : `${parentKey}.${optionKey}`;\n  const value = isUndefined(option) ? optionKey : option;\n\n  setDataOption(this.dataName, key as keyof DataRouterOptions, value);\n  return this;\n}\n\nconst parseBooleanString = (str: string, defaultValue?: any) => (str ? str === 'true' : defaultValue);\n\nexport class DataRouter {\n  readonly dataName: string;\n  readonly router: JsonRouter;\n  readonly options: DataRouterOptions;\n  readonly fullBasePath: string;\n\n  constructor(dataName: string, initialOptions: DataRouterOptions) {\n    setDataOptions(dataName, initialOptions);\n    this.options = getDataOptions(dataName);\n    this.fullBasePath = processUrl(this.options.parentPath + this.options.basePath);\n    this.dataName = dataName;\n    this.router = new JsonRouter(this.options.basePath, setDataCore);\n\n    this.setCollectionRoutes();\n    this.setDocumentRoutes();\n  }\n\n  ///////////////////////\n  // Collection Routes //\n  ///////////////////////\n  private setCollectionRoutes() {\n    //////////\n    // LIST //\n    //////////\n    this.router.get('', async (req: Request) => {\n      const allowed = await req.dacl.isAllowed(this.dataName, 'list');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const { skip, limit, page, page_size, include_count, include_extra_headers } = req.query;\n\n      const svc = req.dacl.getService(this.dataName);\n\n      const includeCount = parseBooleanString(include_count);\n      const includeExtraHeaders = parseBooleanString(include_extra_headers);\n\n      const result = await svc.find(\n        {},\n        { skip, limit, page, pageSize: page_size },\n        {\n          includeCount,\n        },\n      );\n\n      handleResultError(result);\n\n      const { data, totalCount } = result;\n\n      if (includeCount) {\n        if (includeExtraHeaders) {\n          req.res.setHeader(CustomHeaders.TotalCount, totalCount);\n          return data;\n        }\n\n        return { count: totalCount, rows: data };\n      }\n\n      return data;\n    });\n\n    /////////////////////\n    // LIST - Advanced //\n    /////////////////////\n    this.router.post(`/${this.options.queryPath}`, async (req: Request) => {\n      const allowed = await req.dacl.isAllowed(this.dataName, 'list');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      let { filter, select, sort, skip, limit, page, pageSize, options = {} } = req.body ?? {};\n      const { includeCount, includeExtraHeaders } = options;\n\n      const svc = req.dacl.getService(this.dataName);\n\n      const result = await svc.find(filter, { select, sort, skip, limit, page, pageSize }, { includeCount });\n\n      handleResultError(result);\n\n      const { data, totalCount } = result;\n\n      if (includeCount) {\n        if (includeExtraHeaders) {\n          req.res.setHeader(CustomHeaders.TotalCount, totalCount);\n          return data;\n        }\n\n        return { count: totalCount, rows: data };\n      }\n\n      return data;\n    });\n  }\n\n  /////////////////////\n  // Document Routes //\n  /////////////////////\n  private setDocumentRoutes() {\n    //////////\n    // READ //\n    //////////\n    this.router.get(`/:${this.options.idParam}`, async (req: Request) => {\n      const allowed = await req.dacl.isAllowed(this.dataName, 'read');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const id = req.params[this.options.idParam];\n      const svc = req.dacl.getService(this.dataName);\n      const result = await svc.findById(id, {}, {});\n\n      handleResultError(result);\n\n      return result.data;\n    });\n\n    //////////////////////////////\n    // READ - Advanced - Filter //\n    //////////////////////////////\n    this.router.post(`/${this.options.queryPath}/__filter`, async (req: Request) => {\n      const allowed = await req.dacl.isAllowed(this.dataName, 'read');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      let { filter, select, options = {} } = req.body ?? {};\n\n      const svc = req.dacl.getService(this.dataName);\n      const result = await svc.findOne(filter, { select }, {});\n\n      handleResultError(result);\n\n      return result.data;\n    });\n\n    /////////////////////\n    // READ - Advanced //\n    /////////////////////\n    this.router.post(`/${this.options.queryPath}/:${this.options.idParam}`, async (req: Request) => {\n      const allowed = await req.dacl.isAllowed(this.dataName, 'read');\n      if (!allowed) throw new clientErrors.UnauthorizedError();\n\n      const id = req.params[this.options.idParam];\n      let { select, options = {} } = req.body ?? {};\n\n      const svc = req.dacl.getService(this.dataName);\n      const result = await svc.findById(id, { select }, {});\n\n      handleResultError(result);\n\n      return result.data;\n    });\n  }\n\n  set<K extends keyof DataRouterOptions>(keyOrOptions: K | DataRouterOptions, value?: unknown) {\n    if (arguments.length === 2 && isString(keyOrOptions)) {\n      setDataOption(this.dataName, keyOrOptions as K, value as DataRouterOptions[K]);\n    }\n\n    if (arguments.length === 1 && isPlainObject(keyOrOptions)) {\n      setDataOptions(this.dataName, keyOrOptions as DataRouterOptions);\n    }\n\n    return this;\n  }\n\n  setOption<K extends keyof DataRouterOptions>(key: K, option: DataRouterOptions[K]) {\n    setDataOption(this.dataName, key, option);\n    return this;\n  }\n\n  setOptions(options: DataRouterOptions) {\n    setDataOptions(this.dataName, options);\n    return this;\n  }\n\n  public data: SetTargetOption = setOption.bind(this, 'data');\n  public listHardLimit: SetTargetOption = setOption.bind(this, 'listHardLimit');\n  public permissionSchema: SetTargetOption = setOption.bind(this, 'permissionSchema');\n  public routeGuard: SetTargetOption = setOption.bind(this, 'routeGuard');\n  public baseFilter: SetTargetOption = setOption.bind(this, 'baseFilter');\n  public overrideFilter: SetTargetOption = setOption.bind(this, 'overrideFilter');\n  public decorate: SetTargetOption = setOption.bind(this, 'decorate');\n  public decorateAll: SetTargetOption = setOption.bind(this, 'decorateAll');\n  public identifier: SetTargetOption = setOption.bind(this, 'identifier');\n\n  get routes() {\n    return this.router.original;\n  }\n}\n","import { Response, NextFunction } from 'express';\nimport mongoose, { Model } from 'mongoose';\nimport assign from 'lodash/assign';\nimport castArray from 'lodash/castArray';\nimport compact from 'lodash/compact';\nimport difference from 'lodash/difference';\nimport forEach from 'lodash/forEach';\nimport get from 'lodash/get';\nimport intersection from 'lodash/intersection';\nimport isArray from 'lodash/isArray';\nimport isBoolean from 'lodash/isBoolean';\nimport isEmpty from 'lodash/isEmpty';\nimport isFunction from 'lodash/isFunction';\nimport isNaN from 'lodash/isNaN';\nimport isPlainObject from 'lodash/isPlainObject';\nimport isString from 'lodash/isString';\nimport isNil from 'lodash/isNil';\nimport noop from 'lodash/noop';\nimport pick from 'lodash/pick';\nimport set from 'lodash/set';\nimport reduce from 'lodash/reduce';\nimport { getGlobalOption, getDataOption } from './options';\nimport {\n  Populate,\n  Projection,\n  Filter,\n  MiddlewareContext,\n  DataMiddlewareContext,\n  Validation,\n  Request,\n  SelectAccess,\n  RouteGuardAccess,\n  DocPermissionsAccess,\n  BaseFilterAccess,\n  DecorateAccess,\n  DecorateAllAccess,\n  ValidateAccess,\n  PrepareAccess,\n  TransformAccess,\n  Task,\n} from './interfaces';\nimport Permission, { Permissions } from './permission';\nimport { DataService } from './services';\nimport { normalizeSelect, createValidator, setDocValue, toObject, pickDocFields, genPagination } from './helpers';\nimport { copyAndDepopulate } from './processors';\nimport { isDocument, arrToObj } from './lib';\nimport { DATA_MIDDLEWARE, PERMISSIONS, PERMISSION_KEYS } from './symbols';\nimport { Cache } from './cache';\n\nexport class DataCore {\n  private req: Request;\n  private caches: {\n    baseFilter: Cache<string, any>;\n  };\n\n  constructor(req: Request) {\n    this.req = req;\n    this.caches = {\n      baseFilter: new Cache<string, any>(),\n    };\n  }\n\n  async genIDFilter(dataName: string, id: string) {\n    const identifier = getDataOption(dataName, 'identifier');\n\n    if (isString(identifier)) {\n      return { [identifier]: id };\n    }\n\n    if (isFunction(identifier)) {\n      return identifier.call(this.req, id);\n    }\n\n    return { _id: id };\n  }\n\n  async genFilter(dataName: string, access: BaseFilterAccess = 'read', _filter: Filter = null): Promise<Filter> {\n    const permissions = this.getGlobalPermissions();\n\n    let overrideFilterFn = getDataOption(dataName, `overrideFilter.${access}`, null);\n    if (isFunction(overrideFilterFn)) {\n      _filter = await overrideFilterFn.call(this.req, _filter, permissions);\n    }\n\n    const baseFilterFn = getDataOption(dataName, `baseFilter.${access}`, null);\n    if (!isFunction(baseFilterFn)) return _filter || {};\n\n    let baseFilter = null;\n    const cacheKey = `${dataName}_baseFilter_${access}`;\n    if (this.caches.baseFilter.has(cacheKey)) {\n      baseFilter = this.caches.baseFilter.get(cacheKey);\n    } else {\n      baseFilter = await baseFilterFn.call(this.req, permissions);\n    }\n\n    if (baseFilter === false) return false;\n    if (baseFilter === true || isEmpty(baseFilter)) return _filter || {};\n    if (!_filter) return baseFilter;\n\n    const result = { $and: [baseFilter, _filter] };\n    this.caches.baseFilter.set(cacheKey, result);\n    return result;\n  }\n\n  async genAllowedFields(dataName: string, doc: any, access: SelectAccess, baseFields = []) {\n    let fields = [...(baseFields ?? [])];\n\n    const permissionSchema = getDataOption(dataName, 'permissionSchema');\n    if (!permissionSchema) return fields;\n\n    const permissions = this.getGlobalPermissions();\n\n    // get keys from permission schema as some fields might not be filled when created\n    const keys = Object.keys(permissionSchema);\n\n    const phas = (key) => permissions.has(key);\n    const { stringHandler, arrayHandler } = createValidator(phas);\n\n    for (let x = 0; x < keys.length; x++) {\n      const key = keys[x];\n      if (baseFields.includes(key)) continue;\n\n      const val = permissionSchema[key];\n      const value = (val && val[access]) || val;\n\n      if (isBoolean(value)) {\n        if (value) fields.push(key);\n      } else if (isString(value)) {\n        if (stringHandler(value)) fields.push(key);\n      } else if (isArray(value)) {\n        if (arrayHandler(value)) fields.push(key);\n      } else if (isFunction(value)) {\n        if (await value.call(this.req, permissions)) fields.push(key);\n      }\n    }\n\n    return fields;\n  }\n\n  async pickAllowedFields(dataName: string, doc: any, access: SelectAccess, baseFields = []) {\n    const allowed = await this.genAllowedFields(dataName, doc, access, baseFields);\n    return pickDocFields(doc, allowed);\n  }\n\n  async genSelect(\n    dataName: string,\n    access: SelectAccess,\n    targetFields: Projection = null,\n    skipChecks = true,\n    subPaths = [],\n  ) {\n    let normalizedSelect = normalizeSelect(targetFields);\n    let fields = [];\n\n    const permissionSchema = getDataOption(dataName, ['permissionSchema'].concat(subPaths).join('.'));\n    if (!permissionSchema) return fields;\n\n    const permissions = this.getGlobalPermissions();\n\n    const phas = (key) => {\n      if (permissions.prop(key)) {\n        if (permissions.has(key)) return true;\n      } else if (skipChecks) {\n        return true;\n      }\n\n      return false;\n    };\n\n    const { stringHandler, arrayHandler } = createValidator(phas);\n\n    const keys = Object.keys(permissionSchema);\n    for (let x = 0; x < keys.length; x++) {\n      const key = keys[x];\n      const val = permissionSchema[key];\n      const value = val[access] || val;\n\n      if (isBoolean(value)) {\n        if (value) fields.push(key);\n      } else if (isString(value)) {\n        if (stringHandler(value)) fields.push(key);\n      } else if (isArray(value)) {\n        if (arrayHandler(value)) fields.push(key);\n      } else if (isFunction(value)) {\n        if (await value.call(this.req, permissions)) fields.push(key);\n      }\n    }\n\n    fields = intersection(normalizedSelect, fields);\n    return fields;\n  }\n\n  async decorate(dataName: string, doc: any, access: DecorateAccess, context: DataMiddlewareContext = {}) {\n    const decorate = getDataOption(dataName, `decorate.${access}`, null);\n\n    const permissions = this.getGlobalPermissions();\n    return this.callMiddleware(decorate, doc, permissions, context);\n  }\n\n  async decorateAll(dataName: string, docs: any[], access: DecorateAllAccess) {\n    const decorateAll = getDataOption(dataName, `decorateAll.${access}`, null);\n    const permissions = this.getGlobalPermissions();\n\n    return this.callMiddleware(decorateAll, docs, permissions, {});\n  }\n\n  getPermissions() {\n    const permissionField = getGlobalOption('permissionField');\n    return new Permission(this.req[permissionField] || {});\n  }\n\n  async setPermissions() {\n    const permissionField = getGlobalOption('permissionField');\n    if (this.req[permissionField]) return;\n\n    const globalPermissions = getGlobalOption('globalPermissions');\n    if (isFunction(globalPermissions)) {\n      const gp = await globalPermissions.call(this.req, this.req);\n      if (isPlainObject(gp)) this.req[permissionField] = gp;\n      else if (isArray(gp)) this.req[permissionField] = arrToObj(gp);\n      else if (isString(gp)) this.req[permissionField] = { [gp]: true };\n    }\n  }\n\n  async canActivate(routeGuard: Validation) {\n    let allowed = false;\n\n    const permissions = this.getGlobalPermissions();\n    const phas = (key) => permissions.has(key);\n    const { stringHandler, arrayHandler } = createValidator(phas);\n\n    if (isBoolean(routeGuard)) {\n      allowed = routeGuard === true;\n    } else if (isString(routeGuard)) {\n      allowed = stringHandler(routeGuard);\n    } else if (isArray(routeGuard)) {\n      allowed = arrayHandler(routeGuard);\n    } else if (isFunction(routeGuard)) {\n      allowed = routeGuard.call(this.req, permissions);\n    }\n\n    return allowed;\n  }\n\n  async isAllowed(dataName: string, access: RouteGuardAccess | string) {\n    const routeGuard = getDataOption(dataName, `routeGuard.${access}`);\n    return this.canActivate(routeGuard);\n  }\n\n  getService(dataName: string) {\n    return new DataService(this.req, dataName);\n  }\n\n  service(dataName: string) {\n    return this.getService(dataName);\n  }\n\n  svc(dataName: string) {\n    return this.getService(dataName);\n  }\n\n  private getGlobalPermissions() {\n    return this.req[PERMISSIONS] as Permission;\n  }\n\n  private async callMiddleware(\n    middleware: Function | Function[],\n    doc: any,\n    permissions: Permissions,\n    context: DataMiddlewareContext,\n  ) {\n    middleware = castArray(middleware);\n    for (let x = 0; x < middleware.length; x++) {\n      if (isFunction(middleware[x])) {\n        doc = await middleware[x].call(this.req, doc, permissions, context);\n      }\n    }\n\n    return doc;\n  }\n}\n\nexport async function setDataCore(req: Request, res: Response, next: NextFunction) {\n  if (req[DATA_MIDDLEWARE]) return next();\n\n  const core = new DataCore(req);\n  await core.setPermissions();\n\n  req.dacl = core;\n  req[PERMISSIONS] = core.getPermissions();\n  req[PERMISSION_KEYS] = req[PERMISSIONS].$_permissionKeys;\n  req[DATA_MIDDLEWARE] = true;\n\n  next();\n}\n","import { getModelOption } from './options';\n\ninterface Options {\n  permissionField?: string;\n  modelName: string;\n}\n\nexport function permissionsPlugin(schema, options: Options) {\n  if (!options?.modelName) return;\n\n  schema.virtual(options?.permissionField || 'permissions').get(function () {\n    const docPermissionField = getModelOption(options.modelName, 'permissionField');\n    return this._doc[docPermissionField];\n  });\n}\n"],"mappings":"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","names":["isString","isPlainObject","isUndefined","JsonRouter","isString","isArray","isFunction","isPlainObject","castArray","compact","difference","forEach","intersection","isUndefined","isArray","isBoolean","isEmpty","isFunction","isPlainObject","isString","reduce","get","set","assign","OptionsManager","defaultOptions","currentOptions","listeners","constructor","_this","Proxy","set","target","key","value","keystr","String","oldvalue","call","build","assign","get","defaultValue","fetch","options","onchange","func","globalOptions","OptionsManager","permissionField","globalPermissions","build","setGlobalOptions","options","assign","setGlobalOption","key","value","set","getGlobalOptions","fetch","getGlobalOption","defaultValue","get","mongoose","mschema2Jsonschema","isNil","isBoolean","isFunction","isString","isArray","forEach","Document","Schema","isFunction","isPlainObject","isSchema","val","Schema","isObjectIdType","Types","ObjectId","isReference","isPlainObject","ref","type","isPromise","then","isFunction","isDocument","doc","Document","mapValuesAsync","object","asyncFn","Object","fromEntries","Promise","all","entries","map","key","value","arrToObj","arr","obj","x","length","addLeadingSlash","str","startsWith","removeConsecutiveSlashesFromUrl","url","replace","processUrl","DEFAULT_QUERY_PATH","DEFAULT_MUTATION_PATH","defaultModelOptions","OptionsManager","listHardLimit","permissionField","idParam","identifier","parentPath","queryPath","mutationPath","routeGuard","modelPermissionPrefix","build","setDefaultModelOptions","options","assign","setDefaultModelOption","key","value","set","getDefaultModelOptions","fetch","getDefaultModelOption","defaultValue","get","mschema2Jsonschema","mongoose","pluralize","defaultModelOptions","basePath","mandatoryFields","modelOptions","modelJsonSchemas","createModelOptions","modelName","model","manager","OptionsManager","onchange","newval","key","target","oldval","schemaKeys","Object","keys","globalPermissionKeys","modelPermissionKeys","stringHandler","str","trim","split","some","v","startsWith","modelPermissionPrefix","arrayHandler","arr","item","isString","isArray","forEach","skey","val","isBoolean","push","hasModelPermission","isFunction","_permissionSchemaKeys","_globalPermissionKeys","_modelPermissionKeys","isNil","addLeadingSlash","build","jsonSchema","getOrCreateModelOptions","setModelOptions","options","fetch","defaultOptions","getDefaultModelOptions","assign","setModelOption","value","set","getModelOptions","getModelOption","defaultValue","defaultModelValue","getDefaultModelOption","length","get","option","undefined","parentKey","slice","join","getExactModelOption","getModelNames","getModelJsonSchema","mongoose","isNil","isString","pluralize","mongoose","dataOptions","defaultDataOptions","basePath","queryPath","createDataOptions","dataName","manager","OptionsManager","onchange","newval","key","target","oldval","isNil","isString","addLeadingSlash","build","getOrCreateDataOptions","setDataOptions","options","fetch","assign","setDataOption","value","set","getDataOptions","getDataOption","defaultValue","keys","split","length","get","option","undefined","parentKey","slice","join","mongoose","get","keys","forEach","sift","filter","find","isMatch","filterCollection","collection","predicate","filter","sift","findElement","find","matchElement","element","isMatch","findElementById","id","_id","isPlainObject","get","set","pick","isArray","isString","isNaN","isPlainObject","isString","isNil","flattenDeep","reduce","genPagination","skip","limit","page","pageSize","hardLimit","_skip","_limit","Number","isNaN","isNil","npage","parseSortString","sortString","sortKey","sortOrder","startsWith","substring","normalizeSelect","select","Array","isArray","flattenDeep","map","isPlainObject","reduce","ret","val","key","push","isString","split","v","trim","getDocValue","doc","path","defalutValue","isDocument","get","_doc","isPlainObject","setDocValue","value","set","getDocPermissions","modelName","docPermissionField","getModelOption","toObject","doc","isDocument","pickDocFields","fields","_doc","pick","populateDoc","target","p","populate","isPromise","execPopulate","genSubPopulate","sub","popul","isArray","map","ret","isString","path","select","normalizeSelect","StatusCodes","Codes","CustomHeaders","FilterOperator","CustomError","Error","statusCode","message","errors","date","constructor","captureStackTrace","Date","mapCodeToMessage","code","Codes","Success","Created","BadRequest","Forbidden","NotFound","mapCodeToStatusCode","StatusCodes","OK","UnprocessableContent","handleResultError","success","forEach","isArray","isEmpty","isObject","isPlainObject","isString","noop","recurseObject","obj","isSchema","buildRefs","tree","isObject","isReference","ref","ret","forEach","val","key","isEmpty","schema","references","subPaths","paths","target","type","isArray","length","isPlainObject","push","buildSubPaths","iterateQuery","query","handler","noop","mapValuesAsync","$$sq","FilterOperator","SubQuery","$$date","Date","Promise","all","map","v","createValidator","fn","stringHandler","trim","split","every","arrayHandler","arr","some","item","isString","isReady","modelRefs","modelSubs","modelAtts","listeners","checkIfReady","listen","fn","push","_interval","setInterval","modelNames","Object","keys","mongoose","models","forEach","modelName","schema","references","buildRefs","tree","subPaths","buildSubPaths","obj","length","clearInterval","listener","getModelRef","refPath","get","getModelSub","getModelAtt","Permission","$_permissions","$_permissionKeys","constructor","permissions","Object","keys","x","length","key","defineProperty","enumerable","get","has","prop","permission","hasOwnProperty","hasAny","some","hasAll","every","any","all","castArray","forEach","compact","flatten","get","isArray","uniq","intersectionBy","Base","req","modelName","constructor","decorate","doc","access","context","macl","decorateAll","docs","genAllowedFields","baseFields","genDocPermissions","genFilter","filter","getIdentifier","genIDFilter","id","genPopulate","populate","genSelect","targetFields","skipChecks","subPaths","addEmptyPermissions","addDocPermissions","addFieldPermissions","pickAllowedFields","prepare","allowedData","runTasks","docObject","tasks","transform","finalize","changes","validate","checkIfModelPermissionExists","accesses","modelPermissionKeys","getModelOption","some","length","processInclude","include","includes","compact","castArray","model","op","path","localField","foreignField","includeLocalFields","includePaths","forEach","inc","push","uniq","includeDocs","isSingle","isArray","x","includeDocsCount","includeDocsList","_filters","args","options","svc","getPublicService","includeLocalValues","i","get","$in","flatten","result","find","lean","includePermissions","includeCount","success","y","localValue","filterFn","row","intersectionBy","String","matches","data","setDocValue","count","parseClientData","iterateQuery","fo","val","key","FilterOperator","SubQuery","handleSubQuery","Date","handleDate","sq","sqOptions","findById","findOne","ret","map","v","castArray","forEach","get","isArray","isBoolean","isFunction","pick","omit","uniq","diff","mongoose","Model","modelName","model","jsonSchema","indexKeys","indexMap","modelAttrs","constructor","mongoose","schema","set","currVersionKey","get","getModelAtt","new","doc","create","data","find","filter","select","sort","populate","limit","skip","lean","validateSort","builder","logError","console","error","undefined","test","Array","isArray","isValid","every","pair","length","key","order","includes","Map","Object","values","from","pruneSort","ret","keys","forEach","info","findOne","findOneAndDelete","exists","countDocuments","estimatedDocumentCount","distinct","field","conditions","createLogger","format","transports","colorizer","colorize","logger","level","process","env","EGOSE_LOG_LEVEL","combine","label","timestamp","printf","msg","toUpperCase","message","Console","Service","Base","model","options","defaults","baseFields","baseFieldsExt","constructor","req","modelName","Model","getModelOptions","concat","permissionField","findOne","filter","args","select","findOneArgs","sort","populate","include","overrides","skim","findOneOptions","includePermissions","access","populateAccess","lean","overrideFilter","overrideSelect","overridePopulate","_filter","_select","_populate","Promise","all","genFilter","parseClientData","genSelect","genPopulate","includes","includeLocalFields","includePaths","processInclude","finalSelect","normalizeSelect","query","logger","debug","JSON","stringify","op","success","code","Codes","Forbidden","data","doc","NotFound","context","originalDocObject","toObject","includeDocs","includeDocPermissions","checkIfModelPermissionExists","addDocPermissions","addFieldPermissions","pickAllowedFields","addEmptyPermissions","Success","findById","id","findByIdArgs","idFilter","overrideIdFilter","genIDFilter","find","decorate","findArgs","skip","limit","page","pageSize","findOptions","includeCount","pagination","genPagination","listHardLimit","filteredPopulate","isArray","p","path","split","count","totalCount","docs","contexts","map","_decorate","isFunction","v","i","length","countDocuments","create","createArgs","createOptions","isArr","Array","dataArr","d","validationError","items","item","index","originalData","allowedFields","genAllowedFields","allowedData","pick","validated","validate","isBoolean","BadRequest","errors","preparedData","prepare","push","finalize","finalDocObject","virtuals","populateDoc","Created","input","new","updateOne","updateOneArgs","updateOneOptions","docPermissions","getDocPermissions","currentDoc","prepared","Object","assign","modifiedPaths","transform","save","diffExcludeFields","diff","changes","omit","uniq","di","updateById","updateByIdArgs","updateByIdOptions","upsert","upsertArgs","upsertOptions","theone","matched","matchElement","delete","deleteOne","remove","_id","exists","existsOptions","includeId","result","distinct","field","listSub","sub","ft","fields","parentDoc","getParentDoc","get","subFilter","subSelect","filterCollection","readSub","subId","findElement","updateSub","subReadSelect","subUpdateSelect","bulkUpdateSub","castArray","$in","forEach","subdoc","tdata","findElementById","createSub","addFirst","subCreateSelect","unshift","deleteSub","parentFilter","genSubPopulate","pick","PublicService","Service","_list","filter","args","options","select","defaults","publicListArgs","populate","include","sort","skip","limit","page","pageSize","tasks","skim","publicListOptions","includePermissions","includeCount","populateAccess","lean","result","find","doc","context","toObject","decorate","success","docs","data","decorateAll","model","modelName","map","row","runTasks","_create","publicCreateArgs","publicCreateOptions","create","pick","normalizeSelect","baseFieldsExt","_new","new","_read","id","publicReadArgs","publicReadOptions","tryList","access","idFilter","genIDFilter","findById","overrides","_readFilter","findOne","_update","publicUpdateArgs","publicUpdateOptions","returningAll","updateById","Object","keys","_delete","delete","_distinct","field","distinct","_count","count","orderBy","pick","DataService","req","dataName","options","data","constructor","getDataOptions","findOne","filter","args","select","access","_filter","_select","Promise","all","genFilter","genSelect","query","success","code","Codes","Forbidden","doc","findElement","NotFound","pickAllowedFields","length","pick","Success","findById","id","genIDFilter","find","sort","skip","limit","page","pageSize","pagination","genPagination","listHardLimit","count","totalCount","docs","filterCollection","map","sortKey","sortOrder","parseSortString","orderBy","slice","decorate","context","dacl","decorateAll","genAllowedFields","baseFields","targetFields","skipChecks","subPaths","castArray","cloneDeep","forEach","get","isArray","map","set","copyAndDepopulate","docObject","operations","options","mutable","idField","obj","get","cloneDeep","forEach","castArray","op","src","dest","targets","segs","split","seg","ind","length","target","set","isArray","map","reduce","ret","push","MIDDLEWARE","Symbol","DATA_MIDDLEWARE","CORE","PERMISSIONS","PERMISSION_KEYS","Cache","cache","constructor","Map","set","key","value","get","delete","clear","has","keys","Array","from","values","size","Core","req","caches","constructor","baseFilter","Cache","getIdentifier","modelName","identifier","getModelOption","isFunction","isString","genIDFilter","id","call","_id","genFilter","access","_filter","permissions","getGlobalPermissions","overrideFilterFn","baseFilterFn","cacheKey","has","get","isEmpty","result","$and","set","removePrefix","str","prefix","startsWith","substring","length","genAllowedFields","doc","baseFields","fields","permissionSchema","modelPermissionPrefix","docPermissions","getDocPermissions","keys","Object","phas","key","stringHandler","arrayHandler","createValidator","x","includes","val","value","isBoolean","push","isArray","pickAllowedFields","allowed","pickDocFields","genSelect","targetFields","skipChecks","subPaths","normalizedSelect","normalizeSelect","concat","join","prop","excludeid","excludeall","every","v","map","difference","intersection","mandatoryFields","genPopulate","_populate","populate","Array","compact","Promise","all","p","ret","path","select","refModelName","getModelRef","filter","match","validate","allowedData","context","prepare","callMiddleware","transform","finalize","changes","changeOptions","modifiedPaths","mpath","originalDocObject","di","genDocPermissions","docPermissionsFn","addEmptyPermissions","docPermissionField","setDocValue","_view","$","_edit","addDocPermissions","addFieldPermissions","svc","macl","getService","readExists","updateExists","exists","data","views","edits","viewObj","reduce","view","editObj","decorate","decorateAll","docs","runTasks","docObject","task","tasks","castArray","forEach","type","args","options","copyAndDepopulate","getPermissions","permissionField","getGlobalOption","Permission","setPermissions","globalPermissions","gp","isPlainObject","arrToObj","canActivate","routeGuard","isAllowed","split","field","op","subOption","getExactModelOption","isUndefined","subFieldOption","opOption","Service","getPublicService","PublicService","service","PERMISSIONS","middleware","setCore","res","next","MIDDLEWARE","core","PERMISSION_KEYS","$_permissionKeys","macl","req","res","next","setCore","guard","condition","permissions","PERMISSIONS","cond","phas","key","has","isPlainObject","modelName","id","_cond","svc","getPublicService","select","getModelOption","undefined","_id","type","params","_qval","query","isArray","length","isString","JsonRouter","clientErrors","BadRequestError","result","_read","success","UnauthorizedError","docPermissions","getDocPermissions","data","stringHandler","arrayHandler","createValidator","isFunction","call","JsonRouter","isString","isPlainObject","isUndefined","forEach","padEnd","clientErrors","JsonRouter","success","setOption","parentKey","optionKey","option","key","isUndefined","value","setModelOption","modelName","parseBooleanString","str","defaultValue","ModelRouter","router","model","options","fullBasePath","constructor","initialOptions","setModelOptions","getModelOptions","processUrl","parentPath","basePath","setCore","Model","setCollectionRoutes","setDocumentRoutes","runAsyncTasks","setSubDocumentRoutes","logEndpoints","checkIfReady","listen","get","req","allowed","macl","isAllowed","UnauthorizedError","skip","limit","page","page_size","skim","include_permissions","include_count","include_extra_headers","query","svc","getPublicService","includeCount","includeExtraHeaders","result","_list","pageSize","includePermissions","handleResultError","data","totalCount","res","setHeader","CustomHeaders","TotalCount","count","rows","post","queryPath","filter","select","sort","populate","include","tasks","body","populateAccess","_create","Created","mutationPath","_new","_count","access","idParam","id","params","try_list","_read","tryList","_readFilter","patch","returning_all","_update","returningAll","put","idKey","getIdentifier","BadRequest","idVal","existing","exists","length","otherData","delete","_delete","field","_distinct","subs","getModelSub","x","sub","listSub","bulkUpdateSub","subId","readSub","updateSub","createSub","deleteSub","forEach","endpoints","method","path","logger","info","padEnd","set","keyOrOptions","arguments","isString","isPlainObject","setOptions","listHardLimit","bind","permissionSchema","permissionField","mandatoryFields","docPermissions","routeGuard","baseFilter","overrideFilter","validate","prepare","transform","finalize","change","decorate","decorateAll","identifier","defaults","routes","original","JsonRouter","_isNumber","_orderBy","clientErrors","JsonRouter","ALL_ROUTES","RootRouter","router","basename","routeGuard","constructor","options","basePath","setCore","setRoutes","processResult","op","success","code","data","count","totalCount","errors","message","mapCodeToMessage","statusCode","mapCodeToStatusCode","processOp","req","item","svc","macl","getPublicService","model","Codes","BadRequest","includes","getModelOption","allowed","canActivate","Unauthorized","_list","filter","args","_create","_new","id","_read","_readFilter","_update","_delete","_distinct","field","_count","groupItemsByOrder","items","reduce","acc","index","order","_isNumber","push","post","UnauthorizedError","body","groupedItems","results","x","length","arrResult","Promise","all","map","ret","_orderBy","routes","original","JsonRouter","isString","isPlainObject","isUndefined","castArray","intersection","isArray","isBoolean","isEmpty","isFunction","isPlainObject","isString","DataCore","req","caches","constructor","baseFilter","Cache","genIDFilter","dataName","id","identifier","getDataOption","isString","isFunction","call","_id","genFilter","access","_filter","permissions","getGlobalPermissions","overrideFilterFn","baseFilterFn","cacheKey","has","get","isEmpty","result","$and","set","genAllowedFields","doc","baseFields","fields","permissionSchema","keys","Object","phas","key","stringHandler","arrayHandler","createValidator","x","length","includes","val","value","isBoolean","push","isArray","pickAllowedFields","allowed","pickDocFields","genSelect","targetFields","skipChecks","subPaths","normalizedSelect","normalizeSelect","concat","join","prop","intersection","decorate","context","callMiddleware","decorateAll","docs","getPermissions","permissionField","getGlobalOption","Permission","setPermissions","globalPermissions","gp","isPlainObject","arrToObj","canActivate","routeGuard","isAllowed","getService","DataService","service","svc","PERMISSIONS","middleware","castArray","setDataCore","res","next","DATA_MIDDLEWARE","core","dacl","PERMISSION_KEYS","$_permissionKeys","clientErrors","JsonRouter","success","setOption","parentKey","optionKey","option","key","isUndefined","value","setDataOption","dataName","parseBooleanString","str","defaultValue","DataRouter","router","options","fullBasePath","constructor","initialOptions","setDataOptions","getDataOptions","processUrl","parentPath","basePath","setDataCore","setCollectionRoutes","setDocumentRoutes","get","req","allowed","dacl","isAllowed","UnauthorizedError","skip","limit","page","page_size","include_count","include_extra_headers","query","svc","getService","includeCount","includeExtraHeaders","result","find","pageSize","handleResultError","data","totalCount","res","setHeader","CustomHeaders","TotalCount","count","rows","post","queryPath","filter","select","sort","body","idParam","id","params","findById","findOne","set","keyOrOptions","arguments","length","isString","isPlainObject","setOptions","bind","listHardLimit","permissionSchema","routeGuard","baseFilter","overrideFilter","decorate","decorateAll","identifier","routes","original","permissionsPlugin","schema","options","modelName","virtual","permissionField","get","docPermissionField","getModelOption","_doc","egose","middleware","createRouter","modelName","options","isUndefined","RootRouter","ModelRouter","createDataRouter","dataName","DataRouter","set","keyOrOptions","value","arguments","length","isString","setGlobalOption","isPlainObject","setGlobalOptions","getGlobalOptions","getGlobalOption","setModelOptions","setModelOption","getModelOptions","getModelOption","setDefaultModelOptions","setDefaultModelOption","getDefaultModelOptions","getDefaultModelOption"]}