arkos 1.3.3-beta.1 → 1.3.3-canary.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/cjs/app.js +4 -39
  2. package/dist/cjs/app.js.map +1 -1
  3. package/dist/cjs/modules/auth/auth.controller.js +0 -18
  4. package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
  5. package/dist/cjs/modules/auth/auth.router.js +0 -2
  6. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  7. package/dist/cjs/modules/base/base.controller.js +11 -49
  8. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  9. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  10. package/dist/cjs/modules/base/base.service.js +0 -108
  11. package/dist/cjs/modules/base/base.service.js.map +1 -1
  12. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +14 -29
  13. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  14. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +2 -2
  15. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  16. package/dist/cjs/modules/base/utils/router-validator.js +4 -1
  17. package/dist/cjs/modules/base/utils/router-validator.js.map +1 -1
  18. package/dist/cjs/modules/base/utils/service-hooks-manager.js.map +1 -1
  19. package/dist/cjs/modules/file-upload/file-upload.controller.js +0 -4
  20. package/dist/cjs/modules/file-upload/file-upload.controller.js.map +1 -1
  21. package/dist/cjs/modules/file-upload/file-upload.router.js +1 -3
  22. package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
  23. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +1 -2
  24. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
  25. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +1 -0
  26. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
  27. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +3 -3
  28. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
  29. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +1 -2
  30. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
  31. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
  32. package/dist/cjs/server.js +0 -5
  33. package/dist/cjs/server.js.map +1 -1
  34. package/dist/cjs/types/arkos-config.js.map +1 -1
  35. package/dist/cjs/types/index.js.map +1 -1
  36. package/dist/cjs/utils/cli/prisma-generate.js +1 -1
  37. package/dist/cjs/utils/cli/prisma-generate.js.map +1 -1
  38. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
  39. package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js +4 -4
  40. package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -1
  41. package/dist/cjs/utils/cli/utils/template-generator/templates/controller-template.js +6 -2
  42. package/dist/cjs/utils/cli/utils/template-generator/templates/controller-template.js.map +1 -1
  43. package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js +1 -1
  44. package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -1
  45. package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js +2 -0
  46. package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
  47. package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js +1 -1
  48. package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -1
  49. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +10 -7
  50. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  51. package/dist/cjs/utils/dynamic-loader.js +2 -11
  52. package/dist/cjs/utils/dynamic-loader.js.map +1 -1
  53. package/dist/cjs/utils/features/api.features.js +6 -5
  54. package/dist/cjs/utils/features/api.features.js.map +1 -1
  55. package/dist/cjs/utils/helpers/deepmerge.helper.js.map +1 -1
  56. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  57. package/dist/cjs/utils/sheu.js +0 -11
  58. package/dist/cjs/utils/sheu.js.map +1 -1
  59. package/dist/esm/app.js +4 -6
  60. package/dist/esm/app.js.map +1 -1
  61. package/dist/esm/modules/auth/auth.controller.js +0 -18
  62. package/dist/esm/modules/auth/auth.controller.js.map +1 -1
  63. package/dist/esm/modules/auth/auth.router.js +1 -3
  64. package/dist/esm/modules/auth/auth.router.js.map +1 -1
  65. package/dist/esm/modules/base/base.controller.js +11 -49
  66. package/dist/esm/modules/base/base.controller.js.map +1 -1
  67. package/dist/esm/modules/base/base.middlewares.js.map +1 -1
  68. package/dist/esm/modules/base/base.service.js +0 -108
  69. package/dist/esm/modules/base/base.service.js.map +1 -1
  70. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +15 -29
  71. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  72. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +2 -2
  73. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  74. package/dist/esm/modules/base/utils/router-validator.js +4 -1
  75. package/dist/esm/modules/base/utils/router-validator.js.map +1 -1
  76. package/dist/esm/modules/base/utils/service-hooks-manager.js.map +1 -1
  77. package/dist/esm/modules/file-upload/file-upload.controller.js +0 -4
  78. package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
  79. package/dist/esm/modules/file-upload/file-upload.router.js +1 -3
  80. package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
  81. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +1 -2
  82. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
  83. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +1 -0
  84. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
  85. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +3 -3
  86. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
  87. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +1 -2
  88. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
  89. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
  90. package/dist/esm/server.js +0 -5
  91. package/dist/esm/server.js.map +1 -1
  92. package/dist/esm/types/arkos-config.js.map +1 -1
  93. package/dist/esm/types/index.js.map +1 -1
  94. package/dist/esm/utils/cli/prisma-generate.js +1 -1
  95. package/dist/esm/utils/cli/prisma-generate.js.map +1 -1
  96. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  97. package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js +4 -4
  98. package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -1
  99. package/dist/esm/utils/cli/utils/template-generator/templates/controller-template.js +6 -2
  100. package/dist/esm/utils/cli/utils/template-generator/templates/controller-template.js.map +1 -1
  101. package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js +1 -1
  102. package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -1
  103. package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js +2 -0
  104. package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
  105. package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js +1 -1
  106. package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -1
  107. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +7 -7
  108. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  109. package/dist/esm/utils/dynamic-loader.js +2 -11
  110. package/dist/esm/utils/dynamic-loader.js.map +1 -1
  111. package/dist/esm/utils/features/api.features.js +6 -5
  112. package/dist/esm/utils/features/api.features.js.map +1 -1
  113. package/dist/esm/utils/helpers/deepmerge.helper.js.map +1 -1
  114. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  115. package/dist/esm/utils/sheu.js +0 -11
  116. package/dist/esm/utils/sheu.js.map +1 -1
  117. package/dist/types/modules/base/base.controller.d.ts +0 -2
  118. package/dist/types/modules/base/base.service.d.ts +0 -5
  119. package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +1 -3
  120. package/dist/types/modules/base/utils/service-hooks-manager.d.ts +1 -1
  121. package/dist/types/types/arkos-config.d.ts +0 -14
  122. package/dist/types/types/index.d.ts +0 -3
  123. package/dist/types/utils/dynamic-loader.d.ts +13 -33
  124. package/dist/types/utils/features/api.features.d.ts +1 -1
  125. package/dist/types/utils/sheu.d.ts +0 -8
  126. package/package.json +1 -1
  127. package/dist/cjs/modules/debugger/debugger.service.js +0 -82
  128. package/dist/cjs/modules/debugger/debugger.service.js.map +0 -1
  129. package/dist/cjs/modules/debugger/utils/loaded-components-logger.js +0 -55
  130. package/dist/cjs/modules/debugger/utils/loaded-components-logger.js.map +0 -1
  131. package/dist/esm/modules/debugger/debugger.service.js +0 -77
  132. package/dist/esm/modules/debugger/debugger.service.js.map +0 -1
  133. package/dist/esm/modules/debugger/utils/loaded-components-logger.js +0 -50
  134. package/dist/esm/modules/debugger/utils/loaded-components-logger.js.map +0 -1
  135. package/dist/types/modules/debugger/debugger.service.d.ts +0 -15
  136. package/dist/types/modules/debugger/utils/loaded-components-logger.d.ts +0 -9
@@ -1 +1 @@
1
- {"version":3,"file":"base.controller.js","sourceRoot":"","sources":["../../../../src/modules/base/base.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport { BaseService } from \"./base.service\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { kebabCase, pascalCase } from \"../../utils/helpers/change-case.helpers\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport pluralize from \"pluralize\";\nimport sheu from \"../../utils/sheu\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\n\n/**\n * The `BaseController` class provides standardized RESTful API endpoints\n * for any Prisma model based on its name. It supports automatic integration\n * with Prisma services and dynamic middleware hooks for extending behaviors.\n *\n * This controller includes:\n * - `createOne` / `createMany`\n * - `findOne` / `findMany`\n * - `updateOne` / `updateMany`\n * - `deleteOne` / `deleteMany`\n *\n * It handles:\n * - Prisma query options\n * - APIFeatures: filtering, sorting, pagination, field limiting\n * - Middleware hooks: `afterCreateOne`, `afterUpdateMany`, etc.\n *\n * @class BaseController\n * @example\n *\n * **Extending the Controller**\n *\n * ```ts\n * // src/modules/product/product.controller.ts\n *\n * class ProductController extends BaseController {}\n *\n * const productController = new ProcutController(\"product\")\n *\n * export default productController\n *\n * ```\n *\n * @param {string} modelName - The Prisma model name this controller handles.\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-controller-class}\n *--\n *\n * **See about how Arkos handles routers**\n * @see {@link https://www.arkosjs.com/docs/guide/adding-custom-routers}\n */\nexport class BaseController {\n /**\n * Service instance to handle business logic operations\n * @private\n */\n private service: BaseService<any>;\n\n /**\n * Name of the model this controller handles\n * @private\n */\n private modelName: string;\n\n /**\n * Model-specific interceptors loaded from model modules\n * @private\n */\n private interceptors: any;\n\n /**\n * Creates a new BaseController instance\n * @param {string} modelName - The name of the model for which this controller will handle operations\n */\n constructor(modelName: string) {\n const components = getModuleComponents(modelName);\n\n this.modelName = modelName;\n this.service = new BaseService(modelName);\n this.interceptors = components?.interceptors || {};\n }\n\n /**\n * Creates a single resource\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n createOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.createOne(\n req.body,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (this.interceptors.afterCreateOne) {\n req.responseData = { data };\n res.locals.data = { data };\n req.responseStatus = 201;\n res.locals.status = 201;\n return next();\n }\n\n res.status(201).json({ data });\n }\n );\n\n /**\n * Creates multiple resources in a single operation\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n createMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.createMany(\n req.body,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (!data)\n return next(\n new AppError(\n \"Failed to create the resources. Please check your input.\",\n 400,\n { body: req.body }\n )\n );\n\n if (this.interceptors.afterCreateMany) {\n req.responseData = { data };\n res.locals.data = { data };\n req.responseStatus = 201;\n res.locals.status = 201;\n return next();\n }\n\n res.status(201).json({ data });\n }\n );\n\n /**\n * Retrieves multiple resources with filtering, sorting, pagination, and field selection\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n findMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const { where, ...queryOptions } = req.filters!;\n\n const [data, total] = (await Promise.all([\n this.service.findMany(where, queryOptions, {\n user: req?.user,\n accessToken: req?.accessToken,\n }),\n this.service.count(where, {\n user: req?.user,\n accessToken: req?.accessToken,\n }),\n ])) as [Record<string, any>[], number];\n\n if (this.interceptors.afterFindMany) {\n req.responseData = { total, results: data.length, data };\n res.locals.data = { total, results: data.length, data };\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json({ total, results: data.length, data });\n }\n );\n\n /**\n * Retrieves a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n findOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.findOne(\n req.params,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (!data) {\n if (\n Object.keys(req.params).length === 1 &&\n \"id\" in req.params &&\n req.params.id !== \"me\"\n ) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.interceptors.afterFindOne) {\n req.responseData = { data };\n res.locals.data = { data };\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json({ data });\n }\n );\n\n /**\n * Updates a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n updateOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.updateOne(\n req.params,\n req.body,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (!data) {\n if (Object.keys(req.params).length === 1 && \"id\" in req.params) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.interceptors.afterUpdateOne) {\n req.responseData = { data };\n res.locals.data = { data };\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json({ data });\n }\n );\n\n /**\n * Updates multiple resources that match specified criteria\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n updateMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (!Object.keys(req.query).some((key) => key !== \"prismaQueryOptions\")) {\n return next(\n new AppError(\n \"Filter criteria not provided for bulk update.\",\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n\n const { where, ...queryOptions } = req.filters!;\n delete queryOptions.include;\n\n const data = (await this.service.updateMany(\n where,\n req.body,\n queryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n )) as { count: number };\n\n if (!data || data.count === 0)\n return next(\n new AppError(\n `${pluralize(pascalCase(String(this.modelName)))} not found`,\n 404\n )\n );\n\n if (this.interceptors.afterUpdateMany) {\n req.responseData = { results: data.count, data };\n res.locals.data = { results: data.count, data };\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json({ results: data.count, data });\n }\n );\n\n /**\n * Updates multiple resources with different data in a single transaction\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n batchUpdate = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.batchUpdate(\n req.body,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (!data || data.length === 0)\n return next(\n new AppError(\n \"Failed to update the resources. Please check your input.\",\n 400,\n { body: req.body }\n )\n );\n\n if (this.interceptors.afterBatchUpdate) {\n req.responseData = { results: data.length, data };\n res.locals.data = { results: data.length, data };\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json({ results: data.length, data });\n }\n );\n\n /**\n * Deletes a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n deleteOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.deleteOne(req.params, {\n user: req?.user,\n accessToken: req?.accessToken,\n });\n\n if (!data) {\n if (Object.keys(req.params).length === 1 && \"id\" in req.params) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.interceptors.afterDeleteOne) {\n req.additionalData = { data };\n res.locals.additionalData = { data };\n req.responseStatus = 204;\n res.locals.status = 204;\n return next();\n }\n\n res.status(204).send();\n }\n );\n\n /**\n * Deletes multiple resources that match specified criteria\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n deleteMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (!Object.keys(req.query).some((key) => key !== \"prismaQueryOptions\")) {\n return next(\n new AppError(\n \"Filter criteria not provided for bulk deletion.\",\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n\n const { where } = req.filters!;\n\n const data = await this.service.deleteMany(where, {\n user: req?.user,\n accessToken: req?.accessToken,\n });\n\n if (!data || data.count === 0) {\n return next(\n new AppError(`No records found to delete`, 404, {}, \"NotFound\")\n );\n }\n\n if (this.interceptors.afterDeleteMany) {\n req.responseData = { results: data.count, data };\n res.locals.data = { results: data.count, data };\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json({ results: data.count, data });\n }\n );\n\n /**\n * Deletes multiple resources with different filters in a single transaction\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n batchDelete = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.batchDelete(req.body, {\n user: req?.user,\n accessToken: req?.accessToken,\n });\n\n if (!data || data.length === 0)\n return next(\n new AppError(\n \"Failed to delete the resources. Please check your input.\",\n 400,\n { body: req.body }\n )\n );\n\n if (this.interceptors.afterBatchDelete) {\n req.responseData = { results: data.length, data };\n res.locals.data = { results: data.length, data };\n req.responseStatus = 200;\n res.locals.status = 200;\n return next();\n }\n\n res.status(200).json({ results: data.length, data });\n }\n );\n}\n\n/**\n * Returns a list of all available resource endpoints based on the application's models\n *\n * Will soon be removed\n *\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\nexport const getAvailableResources = catchAsync(\n async (_: any, res: ArkosResponse) => {\n sheu.warn(\n \"This route `/api/available-routes` will be deprecated from 1.4.0-beta, consider using /api/auth-actions instead.\"\n );\n\n res.status(200).json({\n data: [\n ...prismaSchemaParser\n .getModelsAsArrayOfStrings()\n .map((model) => kebabCase(model)),\n \"file-upload\",\n ],\n });\n }\n);\n"]}
1
+ {"version":3,"file":"base.controller.js","sourceRoot":"","sources":["../../../../src/modules/base/base.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosRequest, ArkosResponse, ArkosNextFunction } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport APIFeatures from \"../../utils/features/api.features\";\nimport { BaseService } from \"./base.service\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { kebabCase, pascalCase } from \"../../utils/helpers/change-case.helpers\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport pluralize from \"pluralize\";\nimport sheu from \"../../utils/sheu\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\n\n/**\n * The `BaseController` class provides standardized RESTful API endpoints\n * for any Prisma model based on its name. It supports automatic integration\n * with Prisma services and dynamic middleware hooks for extending behaviors.\n *\n * This controller includes:\n * - `createOne` / `createMany`\n * - `findOne` / `findMany`\n * - `updateOne` / `updateMany`\n * - `deleteOne` / `deleteMany`\n *\n * It handles:\n * - Prisma query options\n * - APIFeatures: filtering, sorting, pagination, field limiting\n * - Middleware hooks: `afterCreateOne`, `afterUpdateMany`, etc.\n *\n * @class BaseController\n * @example\n *\n * **Extending the Controller**\n *\n * ```ts\n * // src/modules/product/product.controller.ts\n *\n * class ProductController extends BaseController {}\n *\n * const productController = new ProcutController(\"product\")\n *\n * export default productController\n *\n * ```\n *\n * @param {string} modelName - The Prisma model name this controller handles.\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-controller-class}\n *--\n *\n * **See about how Arkos handles routers**\n * @see {@link https://www.arkosjs.com/docs/guide/adding-custom-routers}\n */\nexport class BaseController {\n /**\n * Service instance to handle business logic operations\n * @private\n */\n private service: BaseService<any>;\n\n /**\n * Name of the model this controller handles\n * @private\n */\n private modelName: string;\n\n /**\n * Model-specific interceptors loaded from model modules\n * @private\n */\n private interceptors: any;\n\n /**\n * Creates a new BaseController instance\n * @param {string} modelName - The name of the model for which this controller will handle operations\n */\n constructor(modelName: string) {\n const components = getModuleComponents(modelName);\n\n this.modelName = modelName;\n this.service = new BaseService(modelName);\n this.interceptors = components?.interceptors || {};\n }\n\n /**\n * Creates a single resource\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n createOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.createOne(\n req.body,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (this.interceptors.afterCreateOne) {\n req.responseData = { data };\n req.responseStatus = 201;\n return next();\n }\n\n res.status(201).json({ data });\n }\n );\n\n /**\n * Creates multiple resources in a single operation\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n createMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.createMany(\n req.body,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (!data)\n return next(\n new AppError(\n \"Failed to create the resources. Please check your input.\",\n 400,\n {},\n \"MissingRequestBody\"\n )\n );\n\n if (this.interceptors.afterCreateMany) {\n req.responseData = { data };\n req.responseStatus = 201;\n return next();\n }\n\n res.status(201).json({ data });\n }\n );\n\n /**\n * Retrieves multiple resources with filtering, sorting, pagination, and field selection\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n findMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const {\n filters: { where, ...queryOptions },\n } = new APIFeatures(req, this.modelName)\n .filter()\n .sort()\n .limitFields()\n .paginate();\n\n const [data, total] = (await Promise.all([\n this.service.findMany(where, queryOptions, {\n user: req?.user,\n accessToken: req?.accessToken,\n }),\n this.service.count(where, {\n user: req?.user,\n accessToken: req?.accessToken,\n }),\n ])) as [Record<string, any>[], number];\n\n if (this.interceptors.afterFindMany) {\n req.responseData = { total, results: data.length, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ total, results: data.length, data });\n }\n );\n\n /**\n * Retrieves a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n findOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.findOne(\n req.params,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (!data) {\n if (\n Object.keys(req.params).length === 1 &&\n \"id\" in req.params &&\n req.params.id !== \"me\"\n ) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.interceptors.afterFindOne) {\n req.responseData = { data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data });\n }\n );\n\n /**\n * Updates a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n updateOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.updateOne(\n req.params,\n req.body,\n req.prismaQueryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n );\n\n if (!data) {\n if (Object.keys(req.params).length === 1 && \"id\" in req.params) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.interceptors.afterUpdateOne) {\n req.responseData = { data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ data });\n }\n );\n\n /**\n * Updates multiple resources that match specified criteria\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n updateMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (!Object.keys(req.query).some((key) => key !== \"prismaQueryOptions\")) {\n return next(\n new AppError(\n \"Filter criteria not provided for bulk update.\",\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n\n req.query.filterMode = req.query?.filterMode || \"AND\";\n const {\n filters: { where, ...queryOptions },\n } = new APIFeatures(req, this.modelName).filter().sort();\n delete queryOptions.include;\n\n const data = (await this.service.updateMany(\n where,\n req.body,\n queryOptions,\n { user: req?.user, accessToken: req?.accessToken }\n )) as { count: number };\n\n if (!data || data.count === 0)\n return next(\n new AppError(\n `${pluralize(pascalCase(String(this.modelName)))} not found`,\n 404\n )\n );\n\n if (this.interceptors.afterUpdateMany) {\n req.responseData = { results: data.count, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ results: data.count, data });\n }\n );\n\n /**\n * Deletes a single resource by its identifier\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n deleteOne = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const data = await this.service.deleteOne(req.params, {\n user: req?.user,\n accessToken: req?.accessToken,\n });\n\n if (!data) {\n if (Object.keys(req.params).length === 1 && \"id\" in req.params) {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} with ID ${\n req.params?.id\n } not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n } else {\n return next(\n new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n )\n );\n }\n }\n\n if (this.interceptors.afterDeleteOne) {\n req.additionalData = { data };\n req.responseStatus = 204;\n return next();\n }\n\n res.status(204).send();\n }\n );\n\n /**\n * Deletes multiple resources that match specified criteria\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\n deleteMany = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n if (!Object.keys(req.query).some((key) => key !== \"prismaQueryOptions\")) {\n return next(\n new AppError(\n \"Filter criteria not provided for bulk deletion.\",\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n\n req.query.filterMode = req.query?.filterMode || \"AND\";\n const {\n filters: { where },\n } = new APIFeatures(req, this.modelName).filter().sort();\n\n const data = await this.service.deleteMany(where, {\n user: req?.user,\n accessToken: req?.accessToken,\n });\n\n if (!data || data.count === 0) {\n return next(\n new AppError(`No records found to delete`, 404, {}, \"NotFound\")\n );\n }\n\n if (this.interceptors.afterDeleteMany) {\n req.responseData = { results: data.count, data };\n req.responseStatus = 200;\n return next();\n }\n\n res.status(200).json({ results: data.count, data });\n }\n );\n}\n\n/**\n * Returns a list of all available resource endpoints based on the application's models\n *\n * Will soon be removed\n *\n * @param {ArkosRequest} req - Express request object\n * @param {ArkosResponse} res - Express response object\n * @param {ArkosNextFunction} next - Express next function\n * @returns {Promise<void>}\n */\nexport const getAvailableResources = catchAsync(\n async (_: any, res: ArkosResponse) => {\n sheu.warn(\n \"This route `/api/available-routes` will be deprecated from 1.4.0-beta, consider using /api/auth-actions instead.\"\n );\n\n res.status(200).json({\n data: [\n ...prismaSchemaParser\n .getModelsAsArrayOfStrings()\n .map((model) => kebabCase(model)),\n \"file-upload\",\n ],\n });\n }\n);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n AuthPrismaQueryOptions,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\nimport { resolvePrismaQueryOptions } from \"./utils/helpers/base.middlewares.helpers\";\n\nexport function callNext(_: Request, _1: Response, next: NextFunction) {\n next();\n}\n\nexport function sendResponse(req: ArkosRequest, res: ArkosResponse) {\n if (Number(req?.responseStatus) === 204)\n res.status(Number(req?.responseStatus)).send();\n else if (req.responseData && req?.responseStatus)\n res.status(Number(req?.responseStatus)).json(req.responseData);\n else if (Number(req?.responseStatus) && !req.responseData)\n res.status(Number(req?.responseStatus)).send();\n else\n res\n .status(500)\n .json({ message: \"No status or data attached to the response\" });\n}\n\nexport function addRouteMiddlwaresAndConfigs() {}\n\n/**\n * Type representing all possible actions that can be performed on a controller\n * Combines both standard CRUD operations and auth-specific operations\n */\nexport type ControllerActions =\n | keyof PrismaQueryOptions<any>\n | keyof Omit<AuthPrismaQueryOptions<any>, keyof PrismaQueryOptions<any>>;\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>,\n action: ControllerActions\n) {\n return (req: ArkosRequest, _: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n const resolvedOptions = resolvePrismaQueryOptions(\n prismaQueryOptions,\n action\n );\n\n const requestQueryOptions = configs?.request?.parameters\n ?.allowDangerousPrismaQueryOptions\n ? JSON.parse((req.query?.prismaQueryOptions as string) || \"{}\")\n : {};\n\n req.prismaQueryOptions = deepmerge(resolvedOptions, requestQueryOptions);\n\n next();\n };\n}\n\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n const startTime = Date.now(); // Capture the start time\n\n // Define colors for each HTTP method\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n // Function to determine status code color\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\"; // Green\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\"; // Orange/Yellow\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\"; // Red\n if (statusCode >= 500) return \"\\x1b[31m\"; // White on Red background\n return \"\\x1b[0m\"; // Default (no color)\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime; // Calculate the time taken to process the request\n\n // Get the current date and time\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0]; // Format as HH:MM:SS\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\"; // Default to no color\n const statusColor = getStatusColor(res.statusCode); // Get the color for the status code\n\n console.info(\n `[\\x1b[36mInfo\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n });\n\n next(); // Pass control to the next middleware or route handler\n}\n\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as ZodSchema<T>, body);\n\n next();\n }\n );\n}\n"]}
1
+ {"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n AuthPrismaQueryOptions,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\nimport { resolvePrismaQueryOptions } from \"./utils/helpers/base.middlewares.helpers\";\n\nexport function callNext(_: Request, _1: Response, next: NextFunction) {\n next();\n}\n\nexport function sendResponse(req: ArkosRequest, res: ArkosResponse) {\n if (Number(req?.responseStatus) === 204)\n res.status(Number(req?.responseStatus)).send();\n else if (req.responseData && req?.responseStatus)\n res.status(Number(req?.responseStatus)).json(req.responseData);\n else if (Number(req?.responseStatus) && !req.responseData)\n res.status(Number(req?.responseStatus)).send();\n else\n res\n .status(500)\n .json({ message: \"No status or data attached to the response\" });\n}\n\nexport function addRouteMiddlwaresAndConfigs() {}\n\n/**\n * Type representing all possible actions that can be performed on a controller\n * Combines both standard CRUD operations and auth-specific operations\n */\nexport type ControllerActions =\n | keyof PrismaQueryOptions<any>\n | keyof Omit<AuthPrismaQueryOptions<any>, keyof PrismaQueryOptions<any>>;\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>,\n action: ControllerActions\n) {\n return (req: ArkosRequest, _: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n // Resolve and merge all applicable options using the helper\n const resolvedOptions = resolvePrismaQueryOptions(\n prismaQueryOptions,\n action\n );\n\n // Parse and merge any dangerous query options from request if allowed\n const requestQueryOptions = configs?.request?.parameters\n ?.allowDangerousPrismaQueryOptions\n ? JSON.parse((req.query?.prismaQueryOptions as string) || \"{}\")\n : {};\n\n // Final merge with request options having the highest priority\n req.prismaQueryOptions = deepmerge(resolvedOptions, requestQueryOptions);\n\n next();\n };\n}\n\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n const startTime = Date.now(); // Capture the start time\n\n // Define colors for each HTTP method\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n // Function to determine status code color\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\"; // Green\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\"; // Orange/Yellow\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\"; // Red\n if (statusCode >= 500) return \"\\x1b[31m\"; // White on Red background\n return \"\\x1b[0m\"; // Default (no color)\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime; // Calculate the time taken to process the request\n\n // Get the current date and time\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0]; // Format as HH:MM:SS\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\"; // Default to no color\n const statusColor = getStatusColor(res.statusCode); // Get the color for the status code\n\n console.info(\n `[\\x1b[36mInfo\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n });\n\n next(); // Pass control to the next middleware or route handler\n}\n\n// Overload for 'auth'\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\n\n// Overload for other models\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\n\n// Implementation\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as ZodSchema<T>, body);\n\n next();\n }\n );\n}\n"]}
@@ -414,65 +414,6 @@ export class BaseService {
414
414
  return undefined;
415
415
  }
416
416
  }
417
- async batchUpdate(batchData, queryOptions, context) {
418
- const serviceHooks = getModuleComponents(this.modelName)?.hooks;
419
- try {
420
- if (serviceHooks?.beforeBatchUpdate &&
421
- context?.skip !== "before" &&
422
- context?.skip !== "all" &&
423
- !context?.skip?.includes("before"))
424
- await serviceHooksManager.handleHook(serviceHooks.beforeBatchUpdate, {
425
- batchData,
426
- queryOptions,
427
- context,
428
- });
429
- const prisma = getPrismaInstance();
430
- const results = await prisma.$transaction(async (tx) => {
431
- const updatePromises = batchData.map(async ({ filters, data }) => {
432
- let processedData = data;
433
- if (kebabCase(this.modelName) === "user" &&
434
- processedData?.password) {
435
- if (!authService.isPasswordHashed(processedData.password))
436
- processedData.password = await authService.hashPassword(processedData?.password);
437
- }
438
- const dataWithRelationFieldsHandled = handleRelationFieldsInBody(processedData, {
439
- ...this.relationFields,
440
- });
441
- return await tx[this.modelName].update(deepmerge({
442
- where: filters,
443
- data: dataWithRelationFieldsHandled,
444
- }, queryOptions || {}));
445
- });
446
- return await Promise.all(updatePromises);
447
- });
448
- if (serviceHooks?.afterBatchUpdate &&
449
- context?.skip !== "after" &&
450
- context?.skip !== "all" &&
451
- !context?.skip?.includes("after"))
452
- await serviceHooksManager.handleHook(serviceHooks.afterBatchUpdate, {
453
- results,
454
- batchData,
455
- queryOptions,
456
- context,
457
- });
458
- return results;
459
- }
460
- catch (err) {
461
- if (serviceHooks?.onBatchUpdateError &&
462
- context?.skip !== "error" &&
463
- context?.skip !== "all" &&
464
- !context?.skip?.includes("error"))
465
- await serviceHooksManager.handleHook(serviceHooks.onBatchUpdateError, {
466
- error: err,
467
- batchData,
468
- queryOptions,
469
- context,
470
- });
471
- if (context?.throwOnError !== false)
472
- throw err;
473
- return undefined;
474
- }
475
- }
476
417
  async deleteOne(filters, context) {
477
418
  const serviceHooks = getModuleComponents(this.modelName)?.hooks;
478
419
  try {
@@ -555,54 +496,5 @@ export class BaseService {
555
496
  return undefined;
556
497
  }
557
498
  }
558
- async batchDelete(batchFilters, context) {
559
- const serviceHooks = getModuleComponents(this.modelName)?.hooks;
560
- try {
561
- if (serviceHooks?.beforeBatchDelete &&
562
- context?.skip !== "before" &&
563
- context?.skip !== "all" &&
564
- !context?.skip?.includes("before"))
565
- await serviceHooksManager.handleHook(serviceHooks.beforeBatchDelete, {
566
- batchFilters,
567
- context,
568
- });
569
- const prisma = getPrismaInstance();
570
- const results = await prisma.$transaction(async (tx) => {
571
- const deletePromises = batchFilters.map(async (filters) => {
572
- const filtersWithRelationFieldsHandled = handleRelationFieldsInBody(filters, {
573
- ...this.relationFields,
574
- });
575
- return await tx[this.modelName].delete({
576
- where: filtersWithRelationFieldsHandled,
577
- });
578
- });
579
- return await Promise.all(deletePromises);
580
- });
581
- if (serviceHooks?.afterBatchDelete &&
582
- context?.skip !== "after" &&
583
- context?.skip !== "all" &&
584
- !context?.skip?.includes("after"))
585
- await serviceHooksManager.handleHook(serviceHooks.afterBatchDelete, {
586
- results,
587
- batchFilters,
588
- context,
589
- });
590
- return results;
591
- }
592
- catch (err) {
593
- if (serviceHooks?.onBatchDeleteError &&
594
- context?.skip !== "error" &&
595
- context?.skip !== "all" &&
596
- !context?.skip?.includes("error"))
597
- await serviceHooksManager.handleHook(serviceHooks.onBatchDeleteError, {
598
- error: err,
599
- batchFilters,
600
- context,
601
- });
602
- if (context?.throwOnError !== false)
603
- throw err;
604
- return undefined;
605
- }
606
- }
607
499
  }
608
500
  //# sourceMappingURL=base.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../src/modules/base/base.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { camelCase, kebabCase } from \"../../utils/helpers/change-case.helpers\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport {\n handleRelationFieldsInBody,\n ModelGroupRelationFields,\n} from \"./utils/helpers/base.service.helpers\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport authService from \"../auth/auth.service\";\nimport {\n ModelDelegate,\n CreateOneData,\n CreateOneOptions,\n CreateOneResult,\n CreateManyData,\n CreateManyOptions,\n CreateManyResult,\n CountFilters,\n FindManyFilters,\n FindManyOptions,\n FindManyResult,\n FindByIdOptions,\n FindByIdResult,\n FindOneFilters,\n FindOneOptions,\n FindOneResult,\n UpdateOneFilters,\n UpdateOneData,\n UpdateOneOptions,\n UpdateOneResult,\n UpdateManyFilters,\n UpdateManyData,\n UpdateManyOptions,\n UpdateManyResult,\n DeleteOneFilters,\n DeleteOneResult,\n DeleteManyFilters,\n DeleteManyResult,\n ServiceBaseContext,\n} from \"./types/base.service.types\";\nimport serviceHooksManager from \"./utils/service-hooks-manager\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\n\n/**\n * Base service class for handling CRUD operations on a specific model.\n * This class provides standard implementation of data operations that can be extended\n *\n * by model-specific service classes.\n *\n * @class BaseService\n *\n * @usage\n *\n * **Example:** creating a simple service\n *\n * ```ts\n * import prisma from '../../utils/prisma'\n *\n * const userService = new BaseService<typeof prisma.user>(\"user\")\n * ```\n *\n * **Example:** accessing request context in hooks\n *\n * ```ts\n * class ProductService extends BaseService<Product> {\n * async beforeCreateOne(data: CreateOneData<Product>, queryOptions?: CreateOneOptions<Product>, context?: ServiceBaseContext) {\n * // Access current user from request context\n * const userId = context?.user?.id;\n * if (userId) {\n * data.createdBy = userId;\n * }\n * }\n * }\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-service-class}\n * @see {@link https://www.arkosjs.com/docs/guide/accessing-request-context-in-services}\n *\n */\nexport class BaseService<T extends ModelDelegate = any> {\n /**\n * The camelCase name of the model\n * @public\n */\n modelName: string;\n\n /**\n * Object containing singular and list relation fields for the model\n * @public\n */\n relationFields: ModelGroupRelationFields;\n\n /**\n * Instance of the Prisma client\n * @public\n */\n prisma: any;\n\n /**\n * Creates an instance of BaseService.\n * @param {string} modelName - The name of the model to perform operations on.\n */\n constructor(modelName: string) {\n this.modelName = camelCase(modelName);\n const modelFields = prismaSchemaParser.getModelRelations(modelName);\n\n this.relationFields = {\n singular:\n modelFields?.filter((field) => field.isRelation && !field.isArray) ||\n [],\n list:\n modelFields?.filter((field) => field.isRelation && field.isArray) || [],\n };\n }\n\n /**\n * Creates a single record in the database.\n *\n * @param {CreateOneData<T>} data - The data to create the record with.\n * @param {CreateOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<CreateOneResult<T>>} The created record.\n */\n async createOne<TOptions extends CreateOneOptions<T>>(\n data: CreateOneData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeCreateOne &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeCreateOne, {\n data,\n queryOptions,\n context,\n });\n\n if (kebabCase(this.modelName) === \"user\" && (data as any).password)\n if (!authService.isPasswordHashed((data as any).password))\n (data as any).password = await authService.hashPassword(\n (data as any).password\n );\n\n const prisma = getPrismaInstance();\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n },\n [\"delete\", \"disconnect\", \"update\"]\n );\n\n const result = await (prisma[this.modelName] as T).create(\n deepmerge(\n {\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { data: any }\n );\n\n if (\n serviceHooks?.afterCreateOne &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterCreateOne, {\n result,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onCreateOneError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onCreateOneError, {\n error: err,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Creates multiple records in the database.\n *\n * @param {CreateManyData<T>} data - An array of data to create records with.\n * @param {CreateManyOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<CreateManyResult<T>>} The result of the createMany operation.\n */\n async createMany<TOptions extends CreateManyOptions<T>>(\n data: CreateManyData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeCreateMany &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.beforeCreateMany, {\n data,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n const dataWithRelationFieldsHandled: any[] = [];\n\n if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n const curr = data[i];\n if (\"password\" in curr && this.modelName === \"user\") {\n if (!authService.isPasswordHashed(curr.password!)) {\n data[i].password = await authService.hashPassword(\n curr?.password!\n );\n }\n }\n dataWithRelationFieldsHandled[i] = handleRelationFieldsInBody(\n data[i] as Record<string, any>,\n { ...this.relationFields },\n [\"delete\", \"disconnect\", \"update\"]\n );\n }\n }\n\n const result = await (prisma[this.modelName] as T).createMany(\n deepmerge(\n { data: dataWithRelationFieldsHandled },\n (queryOptions as {}) || {}\n ) as {\n data: any;\n }\n );\n\n if (\n serviceHooks?.afterCreateMany &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterCreateMany, {\n result,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onCreateManyError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onCreateManyError, {\n error: err,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Counts records based on provided filters.\n *\n * @param {CountFilters<T>} filters - The filters to apply to the query.\n * @returns {Promise<number>} The count of records matching the filters.\n */\n async count(\n filters?: CountFilters<T>,\n context?: ServiceBaseContext\n ): Promise<number> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeCount &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.beforeCount, {\n filters,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).count({\n where: filters,\n });\n\n if (\n serviceHooks?.afterCount &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.afterCount, {\n result,\n filters,\n context,\n });\n }\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onCountError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onCountError, {\n error: err,\n filters,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return 0;\n }\n }\n\n /**\n * Finds multiple records based on provided filters.\n *\n * @param {FindManyFilters<T>} filters - The filters to apply to the query.\n * @param {FindManyOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<FindManyResult<T>>} The found data.\n */\n async findMany<TOptions extends FindManyOptions<T>>(\n filters?: FindManyFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindManyResult<T, TOptions>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeFindMany &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindMany, {\n filters,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).findMany(\n deepmerge({ where: filters }, (queryOptions as {}) || {}) as {\n where: any;\n } & TOptions\n );\n\n if (\n serviceHooks?.afterFindMany &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterFindMany, {\n result,\n filters,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onFindManyError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onFindManyError, {\n error: err,\n filters,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return [] as any;\n }\n }\n\n /**\n * Finds a single record by its ID.\n *\n * @param {string | number} id - The ID of the record to find.\n * @param {FindByIdOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<FindByIdResult<T>>} The found record or null if not found.\n */\n async findById<TOptions extends FindByIdOptions<T>>(\n id: string | number,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindByIdResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeFindById &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindById, {\n id,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).findUnique(\n deepmerge(\n {\n where: { id },\n },\n queryOptions || {}\n ) as { where: { id: string | number } }\n );\n\n if (\n serviceHooks?.afterFindById &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.afterFindById, {\n result,\n id,\n queryOptions,\n context,\n });\n }\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onFindByIdError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onFindByIdError, {\n error: err,\n id,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Finds a single record by its parameters.\n *\n * @param {FindOneFilters<T>} filters - The parameters to find the record by.\n * @param {FindOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<FindOneResult<T>>} The found record or null if not found.\n */\n async findOne<TOptions extends FindOneOptions<T>>(\n filters: FindOneFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeFindOne &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindOne, {\n filters,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n let result;\n if (\n Object.keys(filters as Record<string, any>).length === 1 &&\n \"id\" in (filters as Record<string, any>) &&\n (filters as any).id !== \"me\"\n )\n result = await (prisma[this.modelName] as T).findUnique(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n else\n result = await (prisma[this.modelName] as T).findFirst(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n\n if (\n serviceHooks?.afterFindOne &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterFindOne, {\n result,\n filters,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onFindOneError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onFindOneError, {\n error: err,\n filters,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Updates a single record by its ID.\n *\n * @param {UpdateOneFilters<T>} filters - The parameters to find the record by.\n * @param {UpdateOneData<T>} data - The data to update the record with.\n * @param {UpdateOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<UpdateOneResult<T>>} The updated record or null if not found.\n */\n async updateOne<TOptions extends UpdateOneOptions<T>>(\n filters: UpdateOneFilters<T>,\n data: UpdateOneData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<UpdateOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeUpdateOne &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeUpdateOne, {\n filters,\n data,\n queryOptions,\n context,\n });\n\n if (kebabCase(this.modelName) === \"user\" && (data as any)?.password) {\n if (!authService.isPasswordHashed((data as any).password!))\n (data as any).password = await authService.hashPassword(\n (data as any)?.password\n );\n }\n\n const prisma = getPrismaInstance();\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n }\n );\n\n const result = await (prisma[this.modelName] as T).update(\n deepmerge(\n {\n where: filters,\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { where: any; data: any }\n );\n\n if (\n serviceHooks?.afterUpdateOne &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterUpdateOne, {\n result,\n filters,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onUpdateOneError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onUpdateOneError, {\n error: err,\n filters,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Updates multiple records based on the provided filter and data.\n *\n * @param {UpdateManyFilters<T>} filters - The filters to identify records to update.\n * @param {UpdateManyData<T>} data - The data to update the records with.\n * @param {UpdateManyOptions<T>} [queryOptions] - Additional query options.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<UpdateManyResult<T>>} The result of the updateMany operation.\n */\n async updateMany<TOptions extends UpdateManyOptions<T>>(\n filters: UpdateManyFilters<T>,\n data: UpdateManyData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<UpdateManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeUpdateMany &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeUpdateMany, {\n filters,\n data,\n queryOptions,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n if (\n this.modelName === \"user\" &&\n \"password\" in (data as any) &&\n (data as any)?.password\n ) {\n if (!authService.isPasswordHashed((data as any).password)) {\n (data as any).password = await authService.hashPassword(\n (data as any)?.password\n );\n }\n }\n\n const firstMerge = deepmerge({ data }, (queryOptions as {}) || {});\n\n const result = await (prisma[this.modelName] as T).updateMany(\n deepmerge({ where: filters }, firstMerge) as {\n where: any;\n data: any;\n }\n );\n\n if (\n serviceHooks?.afterUpdateMany &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterUpdateMany, {\n result,\n filters,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onUpdateManyError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onUpdateManyError, {\n error: err,\n filters,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Updates multiple records with different data in a single transaction.\n *\n * @param {Array<{filters: UpdateOneFilters<T>, data: UpdateOneData<T>}>} batchData - Array of objects containing filters and data for each update.\n * @param {UpdateOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma queries.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<Array<UpdateOneResult<T>>>} Array of updated records.\n */\n async batchUpdate<TOptions extends UpdateOneOptions<T>>(\n batchData: Array<{\n filters: UpdateOneFilters<T>;\n data: UpdateOneData<T>;\n }>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<Array<UpdateOneResult<T>>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeBatchUpdate &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeBatchUpdate, {\n batchData,\n queryOptions,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n const results = await prisma.$transaction(async (tx: any) => {\n const updatePromises = batchData.map(async ({ filters, data }) => {\n let processedData = data;\n if (\n kebabCase(this.modelName) === \"user\" &&\n (processedData as any)?.password\n ) {\n if (!authService.isPasswordHashed((processedData as any).password!))\n (processedData as any).password = await authService.hashPassword(\n (processedData as any)?.password\n );\n }\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n processedData as Record<string, any>,\n {\n ...this.relationFields,\n }\n );\n\n return await (tx[this.modelName] as T).update(\n deepmerge(\n {\n where: filters,\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { where: any; data: any }\n );\n });\n\n return await Promise.all(updatePromises);\n });\n\n if (\n serviceHooks?.afterBatchUpdate &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterBatchUpdate, {\n results,\n batchData,\n queryOptions,\n context,\n });\n\n return results;\n } catch (err: any) {\n if (\n serviceHooks?.onBatchUpdateError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onBatchUpdateError, {\n error: err,\n batchData,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Deletes a single record by its ID.\n *\n * @param {DeleteOneFilters<T>} filters - The parameters to find the record by.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<DeleteOneResult<T>>} The deleted record or null if an error occurs.\n */\n async deleteOne(\n filters: DeleteOneFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeDeleteOne &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeDeleteOne, {\n filters,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).delete({\n where: filters,\n });\n\n if (\n serviceHooks?.afterDeleteOne &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterDeleteOne, {\n result,\n filters,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onDeleteOneError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onDeleteOneError, {\n error: err,\n filters,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Deletes multiple records based on the provided filter.\n *\n * @param {DeleteManyFilters<T>} filters - The filter to identify records to delete.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<DeleteManyResult<T>>} The result of the deleteMany operation.\n */\n async deleteMany(\n filters: DeleteManyFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeDeleteMany &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeDeleteMany, {\n filters,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).deleteMany({\n where: filters,\n });\n\n if (\n serviceHooks?.afterDeleteMany &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterDeleteMany, {\n result,\n filters,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onDeleteManyError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onDeleteManyError, {\n error: err,\n filters,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Deletes multiple records with different filters in a single transaction.\n *\n * @param {Array<DeleteOneFilters<T>>} batchFilters - Array of filter objects for each deletion.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<Array<DeleteOneResult<T>>>} Array of deleted records.\n */\n async batchDelete(\n batchFilters: Array<DeleteOneFilters<T>>,\n context?: ServiceBaseContext\n ): Promise<Array<DeleteOneResult<T>>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeBatchDelete &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeBatchDelete, {\n batchFilters,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n const results = await prisma.$transaction(async (tx: any) => {\n const deletePromises = batchFilters.map(async (filters) => {\n const filtersWithRelationFieldsHandled = handleRelationFieldsInBody(\n filters as Record<string, any>,\n {\n ...this.relationFields,\n }\n );\n\n return await (tx[this.modelName] as T).delete({\n where: filtersWithRelationFieldsHandled,\n });\n });\n\n return await Promise.all(deletePromises);\n });\n\n if (\n serviceHooks?.afterBatchDelete &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterBatchDelete, {\n results,\n batchFilters,\n context,\n });\n\n return results;\n } catch (err: any) {\n if (\n serviceHooks?.onBatchDeleteError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onBatchDeleteError, {\n error: err,\n batchFilters,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../src/modules/base/base.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { camelCase, kebabCase } from \"../../utils/helpers/change-case.helpers\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport {\n handleRelationFieldsInBody,\n ModelGroupRelationFields,\n} from \"./utils/helpers/base.service.helpers\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport authService from \"../auth/auth.service\";\nimport {\n ModelDelegate,\n CreateOneData,\n CreateOneOptions,\n CreateOneResult,\n CreateManyData,\n CreateManyOptions,\n CreateManyResult,\n CountFilters,\n FindManyFilters,\n FindManyOptions,\n FindManyResult,\n FindByIdOptions,\n FindByIdResult,\n FindOneFilters,\n FindOneOptions,\n FindOneResult,\n UpdateOneFilters,\n UpdateOneData,\n UpdateOneOptions,\n UpdateOneResult,\n UpdateManyFilters,\n UpdateManyData,\n UpdateManyOptions,\n UpdateManyResult,\n DeleteOneFilters,\n DeleteOneResult,\n DeleteManyFilters,\n DeleteManyResult,\n ServiceBaseContext,\n} from \"./types/base.service.types\";\nimport serviceHooksManager from \"./utils/service-hooks-manager\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\n\n/**\n * Base service class for handling CRUD operations on a specific model.\n * This class provides standard implementation of data operations that can be extended\n *\n * by model-specific service classes.\n *\n * @class BaseService\n *\n * @usage\n *\n * **Example:** creating a simple service\n *\n * ```ts\n * import prisma from '../../utils/prisma'\n *\n * const userService = new BaseService<typeof prisma.user>(\"user\")\n * ```\n *\n * **Example:** accessing request context in hooks\n *\n * ```ts\n * class ProductService extends BaseService<Product> {\n * async beforeCreateOne(data: CreateOneData<Product>, queryOptions?: CreateOneOptions<Product>, context?: ServiceBaseContext) {\n * // Access current user from request context\n * const userId = context?.user?.id;\n * if (userId) {\n * data.createdBy = userId;\n * }\n * }\n * }\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-service-class}\n * @see {@link https://www.arkosjs.com/docs/guide/accessing-request-context-in-services}\n *\n */\nexport class BaseService<T extends ModelDelegate = any> {\n /**\n * The camelCase name of the model\n * @public\n */\n modelName: string;\n\n /**\n * Object containing singular and list relation fields for the model\n * @public\n */\n relationFields: ModelGroupRelationFields;\n\n /**\n * Instance of the Prisma client\n * @public\n */\n prisma: any;\n\n /**\n * Creates an instance of BaseService.\n * @param {string} modelName - The name of the model to perform operations on.\n */\n constructor(modelName: string) {\n this.modelName = camelCase(modelName);\n const modelFields = prismaSchemaParser.getModelRelations(modelName);\n\n this.relationFields = {\n singular:\n modelFields?.filter((field) => field.isRelation && !field.isArray) ||\n [],\n list:\n modelFields?.filter((field) => field.isRelation && field.isArray) || [],\n };\n }\n\n /**\n * Creates a single record in the database.\n *\n * @param {CreateOneData<T>} data - The data to create the record with.\n * @param {CreateOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<CreateOneResult<T>>} The created record.\n */\n async createOne<TOptions extends CreateOneOptions<T>>(\n data: CreateOneData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeCreateOne &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeCreateOne, {\n data,\n queryOptions,\n context,\n });\n\n if (kebabCase(this.modelName) === \"user\" && (data as any).password)\n if (!authService.isPasswordHashed((data as any).password))\n (data as any).password = await authService.hashPassword(\n (data as any).password\n );\n\n const prisma = getPrismaInstance();\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n },\n [\"delete\", \"disconnect\", \"update\"]\n );\n\n const result = await (prisma[this.modelName] as T).create(\n deepmerge(\n {\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { data: any }\n );\n\n if (\n serviceHooks?.afterCreateOne &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterCreateOne, {\n result,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onCreateOneError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onCreateOneError, {\n error: err,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Creates multiple records in the database.\n *\n * @param {CreateManyData<T>} data - An array of data to create records with.\n * @param {CreateManyOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<CreateManyResult<T>>} The result of the createMany operation.\n */\n async createMany<TOptions extends CreateManyOptions<T>>(\n data: CreateManyData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeCreateMany &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.beforeCreateMany, {\n data,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n const dataWithRelationFieldsHandled: any[] = [];\n\n if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n const curr = data[i];\n if (\"password\" in curr && this.modelName === \"user\") {\n if (!authService.isPasswordHashed(curr.password!)) {\n data[i].password = await authService.hashPassword(\n curr?.password!\n );\n }\n }\n dataWithRelationFieldsHandled[i] = handleRelationFieldsInBody(\n data[i] as Record<string, any>,\n { ...this.relationFields },\n [\"delete\", \"disconnect\", \"update\"]\n );\n }\n }\n\n const result = await (prisma[this.modelName] as T).createMany(\n deepmerge(\n { data: dataWithRelationFieldsHandled },\n (queryOptions as {}) || {}\n ) as {\n data: any;\n }\n );\n\n if (\n serviceHooks?.afterCreateMany &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterCreateMany, {\n result,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onCreateManyError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onCreateManyError, {\n error: err,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Counts records based on provided filters.\n *\n * @param {CountFilters<T>} filters - The filters to apply to the query.\n * @returns {Promise<number>} The count of records matching the filters.\n */\n async count(\n filters?: CountFilters<T>,\n context?: ServiceBaseContext\n ): Promise<number> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeCount &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.beforeCount, {\n filters,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).count({\n where: filters,\n });\n\n if (\n serviceHooks?.afterCount &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.afterCount, {\n result,\n filters,\n context,\n });\n }\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onCountError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onCountError, {\n error: err,\n filters,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return 0;\n }\n }\n\n /**\n * Finds multiple records based on provided filters.\n *\n * @param {FindManyFilters<T>} filters - The filters to apply to the query.\n * @param {FindManyOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<FindManyResult<T>>} The found data.\n */\n async findMany<TOptions extends FindManyOptions<T>>(\n filters?: FindManyFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindManyResult<T, TOptions>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeFindMany &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindMany, {\n filters,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).findMany(\n deepmerge({ where: filters }, (queryOptions as {}) || {}) as {\n where: any;\n } & TOptions\n );\n\n if (\n serviceHooks?.afterFindMany &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterFindMany, {\n result,\n filters,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onFindManyError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onFindManyError, {\n error: err,\n filters,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return [] as any;\n }\n }\n\n /**\n * Finds a single record by its ID.\n *\n * @param {string | number} id - The ID of the record to find.\n * @param {FindByIdOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<FindByIdResult<T>>} The found record or null if not found.\n */\n async findById<TOptions extends FindByIdOptions<T>>(\n id: string | number,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindByIdResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeFindById &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindById, {\n id,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).findUnique(\n deepmerge(\n {\n where: { id },\n },\n queryOptions || {}\n ) as { where: { id: string | number } }\n );\n\n if (\n serviceHooks?.afterFindById &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.afterFindById, {\n result,\n id,\n queryOptions,\n context,\n });\n }\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onFindByIdError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onFindByIdError, {\n error: err,\n id,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Finds a single record by its parameters.\n *\n * @param {FindOneFilters<T>} filters - The parameters to find the record by.\n * @param {FindOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<FindOneResult<T>>} The found record or null if not found.\n */\n async findOne<TOptions extends FindOneOptions<T>>(\n filters: FindOneFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeFindOne &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n ) {\n await serviceHooksManager.handleHook(serviceHooks.beforeFindOne, {\n filters,\n queryOptions,\n context,\n });\n }\n\n const prisma = getPrismaInstance();\n\n let result;\n if (\n Object.keys(filters as Record<string, any>).length === 1 &&\n \"id\" in (filters as Record<string, any>) &&\n (filters as any).id !== \"me\"\n )\n result = await (prisma[this.modelName] as T).findUnique(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n else\n result = await (prisma[this.modelName] as T).findFirst(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n\n if (\n serviceHooks?.afterFindOne &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterFindOne, {\n result,\n filters,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onFindOneError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onFindOneError, {\n error: err,\n filters,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Updates a single record by its ID.\n *\n * @param {UpdateOneFilters<T>} filters - The parameters to find the record by.\n * @param {UpdateOneData<T>} data - The data to update the record with.\n * @param {UpdateOneOptions<T>} [queryOptions] - Additional query options to modify the Prisma query.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<UpdateOneResult<T>>} The updated record or null if not found.\n */\n async updateOne<TOptions extends UpdateOneOptions<T>>(\n filters: UpdateOneFilters<T>,\n data: UpdateOneData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<UpdateOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeUpdateOne &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeUpdateOne, {\n filters,\n data,\n queryOptions,\n context,\n });\n\n if (kebabCase(this.modelName) === \"user\" && (data as any)?.password) {\n if (!authService.isPasswordHashed((data as any).password!))\n (data as any).password = await authService.hashPassword(\n (data as any)?.password\n );\n }\n\n const prisma = getPrismaInstance();\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n }\n );\n\n const result = await (prisma[this.modelName] as T).update(\n deepmerge(\n {\n where: filters,\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { where: any; data: any }\n );\n\n if (\n serviceHooks?.afterUpdateOne &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterUpdateOne, {\n result,\n filters,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onUpdateOneError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onUpdateOneError, {\n error: err,\n filters,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Updates multiple records based on the provided filter and data.\n *\n * @param {UpdateManyFilters<T>} filters - The filters to identify records to update.\n * @param {UpdateManyData<T>} data - The data to update the records with.\n * @param {UpdateManyOptions<T>} [queryOptions] - Additional query options.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<UpdateManyResult<T>>} The result of the updateMany operation.\n */\n async updateMany<TOptions extends UpdateManyOptions<T>>(\n filters: UpdateManyFilters<T>,\n data: UpdateManyData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<UpdateManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeUpdateMany &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeUpdateMany, {\n filters,\n data,\n queryOptions,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n if (\n this.modelName === \"user\" &&\n \"password\" in (data as any) &&\n (data as any)?.password\n ) {\n if (!authService.isPasswordHashed((data as any).password)) {\n (data as any).password = await authService.hashPassword(\n (data as any)?.password\n );\n }\n }\n\n const firstMerge = deepmerge({ data }, (queryOptions as {}) || {});\n\n const result = await (prisma[this.modelName] as T).updateMany(\n deepmerge({ where: filters }, firstMerge) as {\n where: any;\n data: any;\n }\n );\n\n if (\n serviceHooks?.afterUpdateMany &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterUpdateMany, {\n result,\n filters,\n data,\n queryOptions,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onUpdateManyError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onUpdateManyError, {\n error: err,\n filters,\n data,\n queryOptions,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Deletes a single record by its ID.\n *\n * @param {DeleteOneFilters<T>} filters - The parameters to find the record by.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<DeleteOneResult<T>>} The deleted record or null if an error occurs.\n */\n async deleteOne(\n filters: DeleteOneFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteOneResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeDeleteOne &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeDeleteOne, {\n filters,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).delete({\n where: filters,\n });\n\n if (\n serviceHooks?.afterDeleteOne &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterDeleteOne, {\n result,\n filters,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onDeleteOneError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onDeleteOneError, {\n error: err,\n filters,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n\n /**\n * Deletes multiple records based on the provided filter.\n *\n * @param {DeleteManyFilters<T>} filters - The filter to identify records to delete.\n * @param {ServiceBaseContext} [context] - Request context containing user and accessToken for accessing HTTP-specific information.\n * @returns {Promise<DeleteManyResult<T>>} The result of the deleteMany operation.\n */\n async deleteMany(\n filters: DeleteManyFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteManyResult<T>> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n try {\n if (\n serviceHooks?.beforeDeleteMany &&\n context?.skip !== \"before\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"before\")\n )\n await serviceHooksManager.handleHook(serviceHooks.beforeDeleteMany, {\n filters,\n context,\n });\n\n const prisma = getPrismaInstance();\n\n const result = await (prisma[this.modelName] as T).deleteMany({\n where: filters,\n });\n\n if (\n serviceHooks?.afterDeleteMany &&\n context?.skip !== \"after\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"after\")\n )\n await serviceHooksManager.handleHook(serviceHooks.afterDeleteMany, {\n result,\n filters,\n context,\n });\n\n return result;\n } catch (err: any) {\n if (\n serviceHooks?.onDeleteManyError &&\n context?.skip !== \"error\" &&\n context?.skip !== \"all\" &&\n !context?.skip?.includes(\"error\")\n )\n await serviceHooksManager.handleHook(serviceHooks.onDeleteManyError, {\n error: err,\n filters,\n context,\n });\n\n if (context?.throwOnError !== false) throw err;\n return undefined as any;\n }\n }\n}\n"]}