arkos 1.3.7-canary.7 → 1.3.8-beta
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.
- package/dist/cjs/modules/base/base.controller.js +3 -4
- package/dist/cjs/modules/base/base.controller.js.map +1 -1
- package/dist/cjs/modules/base/base.service.js +68 -66
- package/dist/cjs/modules/base/base.service.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.controller.js +4 -4
- package/dist/cjs/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.service.js +3 -3
- package/dist/cjs/modules/file-upload/file-upload.service.js.map +1 -1
- package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +6 -2
- package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
- package/dist/cjs/utils/cli/dev.js +3 -2
- package/dist/cjs/utils/cli/dev.js.map +1 -1
- package/dist/cjs/utils/cli/start.js +8 -49
- package/dist/cjs/utils/cli/start.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/{controller-template.js → generate-controller-template.js} +10 -2
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js +6 -25
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generators.js +2 -2
- package/dist/cjs/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/cjs/utils/cli/utils/watermark-stamper.js +5 -3
- package/dist/cjs/utils/cli/utils/watermark-stamper.js.map +1 -1
- package/dist/cjs/utils/helpers/fs.helpers.js +1 -4
- package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/cjs/utils/sheu.js.map +1 -1
- package/dist/esm/modules/base/base.controller.js +3 -4
- package/dist/esm/modules/base/base.controller.js.map +1 -1
- package/dist/esm/modules/base/base.service.js +68 -66
- package/dist/esm/modules/base/base.service.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.controller.js +4 -4
- package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.service.js +3 -3
- package/dist/esm/modules/file-upload/file-upload.service.js.map +1 -1
- package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +6 -2
- package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
- package/dist/esm/utils/cli/dev.js +3 -2
- package/dist/esm/utils/cli/dev.js.map +1 -1
- package/dist/esm/utils/cli/start.js +8 -49
- package/dist/esm/utils/cli/start.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/{controller-template.js → generate-controller-template.js} +10 -2
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js +6 -25
- package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generators.js +1 -1
- package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/esm/utils/cli/utils/watermark-stamper.js +5 -3
- package/dist/esm/utils/cli/utils/watermark-stamper.js.map +1 -1
- package/dist/esm/utils/helpers/fs.helpers.js +1 -4
- package/dist/esm/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/esm/utils/sheu.js.map +1 -1
- package/dist/types/modules/base/base.service.d.ts +2 -1
- package/dist/types/modules/file-upload/file-upload.service.d.ts +2 -2
- package/dist/types/modules/file-upload/utils/helpers/file-upload.helpers.d.ts +1 -1
- package/package.json +2 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/controller-template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/controller-template.js.map +0 -1
- /package/dist/types/utils/cli/utils/template-generator/templates/{controller-template.d.ts → generate-controller-template.d.ts} +0 -0
|
@@ -18,9 +18,8 @@ class BaseController {
|
|
|
18
18
|
constructor(modelName) {
|
|
19
19
|
this.executeOperation = (config) => {
|
|
20
20
|
return (0, catch_async_1.default)(async (req, res, next) => {
|
|
21
|
-
if (config.hooks?.beforeQuery)
|
|
21
|
+
if (config.hooks?.beforeQuery)
|
|
22
22
|
await config.hooks.beforeQuery(req);
|
|
23
|
-
}
|
|
24
23
|
if (config.requiresQueryForBulk) {
|
|
25
24
|
if (Object.keys(req.query).every((key) => ["filterMode", "prismaQueryOptions"].includes(key))) {
|
|
26
25
|
return next(new app_error_1.default(`Filter criteria not provided for bulk ${config.operationType.replace(/Many$/, "")}.`, 400, {}, "MissingRequestQueryParameters"));
|
|
@@ -103,7 +102,7 @@ class BaseController {
|
|
|
103
102
|
operationType: "createMany",
|
|
104
103
|
serviceMethod: "createMany",
|
|
105
104
|
successStatus: 201,
|
|
106
|
-
queryFeatures: [
|
|
105
|
+
queryFeatures: [],
|
|
107
106
|
usesRequestBody: true,
|
|
108
107
|
});
|
|
109
108
|
this.findMany = this.executeOperation({
|
|
@@ -131,7 +130,7 @@ class BaseController {
|
|
|
131
130
|
operationType: "updateMany",
|
|
132
131
|
serviceMethod: "updateMany",
|
|
133
132
|
successStatus: 200,
|
|
134
|
-
queryFeatures: ["filter"
|
|
133
|
+
queryFeatures: ["filter"],
|
|
135
134
|
requiresQueryForBulk: true,
|
|
136
135
|
preventORFilter: true,
|
|
137
136
|
usesRequestBody: true,
|
|
@@ -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\";\nimport { APIFeatures } from \"../../exports/utils\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\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 *\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 * **See about how Arkos handles routers**\n * @see {@link https://www.arkosjs.com/docs/guide/adding-custom-routers}\n */\nexport interface OperationHooks {\n beforeQuery?: (req: ArkosRequest) => void | Promise<void>;\n afterQuery?: (\n queryData: { where: any; queryOptions: any },\n req: ArkosRequest\n ) => void | Promise<void>;\n beforeService?: (args: any[], req: ArkosRequest) => any[] | Promise<any[]>;\n afterService?: (data: any, req: ArkosRequest) => any | Promise<any>;\n beforeResponse?: (responseData: any, req: ArkosRequest) => any | Promise<any>;\n}\n\ninterface OperationConfig {\n operationType: string;\n serviceMethod: string;\n successStatus: number;\n queryFeatures: (\"filter\" | \"sort\" | \"limitFields\" | \"paginate\")[];\n requiresQueryForBulk?: boolean;\n preventORFilter?: boolean;\n responseBuilder?: (data: any, additionalData?: any) => any;\n errorHandler?: (\n data: any,\n req: ArkosRequest,\n modelName: string\n ) => AppError | null;\n usesRequestParams?: boolean;\n usesRequestBody?: boolean;\n hooks?: OperationHooks;\n}\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 private executeOperation = (config: OperationConfig) => {\n return catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n if (config.hooks?.beforeQuery) {\n await config.hooks.beforeQuery(req);\n }\n\n if (config.requiresQueryForBulk) {\n if (\n Object.keys(req.query).every((key) =>\n [\"filterMode\", \"prismaQueryOptions\"].includes(key)\n )\n ) {\n return next(\n new AppError(\n `Filter criteria not provided for bulk ${config.operationType.replace(/Many$/, \"\")}.`,\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n }\n\n if (config.preventORFilter && req.query.filterMode === \"OR\") {\n throw new AppError(\n `req.query.filterMode === OR is not valid for ${config.operationType} operation`,\n 400\n );\n }\n\n if (config.preventORFilter) req.query.filterMode = \"AND\";\n\n let apiFeatures = new APIFeatures(req, this.modelName);\n\n config.queryFeatures.forEach((feature) => {\n switch (feature) {\n case \"filter\":\n apiFeatures = apiFeatures.filter();\n break;\n case \"sort\":\n apiFeatures = apiFeatures.sort();\n break;\n case \"limitFields\":\n apiFeatures = apiFeatures.limitFields();\n break;\n case \"paginate\":\n apiFeatures = apiFeatures.paginate();\n break;\n }\n });\n\n const { where, ...queryOptions } = apiFeatures.filters;\n\n if (config.hooks?.afterQuery)\n await config.hooks.afterQuery({ where, queryOptions }, req);\n\n let serviceArgs = this.buildServiceArgs(\n config,\n req,\n where,\n queryOptions\n );\n\n if (config.hooks?.beforeService)\n serviceArgs = await config.hooks.beforeService(serviceArgs, req);\n\n const serviceMethod = this.service[\n config.serviceMethod as keyof BaseService<any>\n ] as Function;\n let result = await serviceMethod.apply(this.service, serviceArgs);\n\n if (config.hooks?.afterService)\n result = await config.hooks.afterService(result, req);\n\n let data = result;\n let additionalData: any = null;\n\n if (config.operationType === \"findMany\") {\n const [records, total] = await Promise.all([\n result,\n this.service.count(where, {\n user: req?.user,\n accessToken: req?.accessToken,\n }),\n ]);\n data = records;\n additionalData = { total, results: records.length };\n }\n\n const error = config.errorHandler\n ? config.errorHandler(data, req, this.modelName)\n : this.defaultErrorHandler(data, req, config.operationType);\n\n if (error) return next(error);\n\n let responseData = config.responseBuilder\n ? config.responseBuilder(data, additionalData)\n : this.defaultResponseBuilder(\n data,\n additionalData,\n config.operationType\n );\n\n if (config.hooks?.beforeResponse) {\n responseData = await config.hooks.beforeResponse(responseData, req);\n }\n\n const interceptorName = `after${config.operationType.charAt(0).toUpperCase()}${config.operationType.slice(1)}`;\n\n if (this.interceptors[interceptorName]) {\n this.setResponseData(req, res, responseData, config.successStatus);\n return next();\n }\n\n if (config.operationType === \"deleteOne\")\n return res.status(config.successStatus).send();\n\n res.status(config.successStatus).json(responseData);\n }\n );\n };\n\n /**\n * Sets response data for both legacy (req.responseData) and modern (res.locals) support\n */\n private setResponseData(\n req: ArkosRequest,\n res: ArkosResponse,\n data: any,\n status: number\n ): void {\n (res as any).originalData = data;\n req.responseData = data;\n res.locals.data = data;\n (res as any).originalStatus = status;\n req.responseStatus = status;\n res.locals.status = status;\n\n // Special handling for deleteOne\n if (status === 204) {\n req.additionalData = data;\n res.locals.additionalData = data;\n (res as any).originalAdditionalData = data;\n }\n }\n\n /**\n * Builds service method arguments based on operation configuration\n */\n private buildServiceArgs(\n config: OperationConfig,\n req: ArkosRequest,\n where: any,\n queryOptions: any\n ): any[] {\n const context = { user: req?.user, accessToken: req?.accessToken };\n const mergedOptions = deepmerge(req.prismaQueryOptions || {}, queryOptions);\n\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return [req.body, mergedOptions, context];\n\n case \"findMany\":\n return [where, queryOptions, context];\n\n case \"findOne\":\n return [req.params, mergedOptions, context];\n\n case \"updateOne\":\n return [req.params, req.body, mergedOptions, context];\n\n case \"updateMany\":\n // Remove include for bulk operations\n delete queryOptions.include;\n return [where, req.body, queryOptions, context];\n\n case \"batchUpdate\":\n return [req.body, mergedOptions, context];\n\n case \"deleteOne\":\n return [req.params, context];\n\n case \"deleteMany\":\n return [where, context];\n\n case \"batchDelete\":\n return [req.body, context];\n\n default:\n throw new Error(`Unknown operation type: ${config.operationType}`);\n }\n }\n\n /**\n * Default error handler for operations\n */\n private defaultErrorHandler(\n data: any,\n req: ArkosRequest,\n operationType: string\n ): AppError | null {\n if (!data || (Array.isArray(data) && data.length === 0)) {\n // Handle different error scenarios\n if (operationType.includes(\"create\") || operationType.includes(\"batch\")) {\n return new AppError(\n \"Failed to create the resources. Please check your input.\",\n 400,\n { body: req.body }\n );\n }\n\n if (\n operationType === \"findOne\" ||\n operationType === \"updateOne\" ||\n operationType === \"deleteOne\"\n ) {\n if (\n Object.keys(req.params).length === 1 &&\n \"id\" in req.params &&\n req.params.id !== \"me\"\n ) {\n return new AppError(\n `${pascalCase(String(this.modelName))} with ID ${req.params?.id} not found`,\n 404,\n {},\n \"NotFound\"\n );\n } else {\n return new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n );\n }\n }\n\n if (operationType === \"updateMany\" || operationType === \"deleteMany\") {\n const isUpdate = operationType === \"updateMany\";\n return new AppError(\n isUpdate\n ? `${pluralize(pascalCase(String(this.modelName)))} not found`\n : `No records found to delete`,\n 404,\n {},\n \"NotFound\"\n );\n }\n }\n\n // Special handling for operations that return count\n if (\n data &&\n typeof data === \"object\" &&\n \"count\" in data &&\n data.count === 0\n ) {\n return new AppError(\n operationType === \"updateMany\"\n ? `${pluralize(pascalCase(String(this.modelName)))} not found`\n : `No records found to delete`,\n 404,\n {},\n \"NotFound\"\n );\n }\n\n return null;\n }\n\n /**\n * Default response builder for operations\n */\n private defaultResponseBuilder(\n data: any,\n additionalData: any,\n operationType: string\n ): any {\n if (operationType === \"findMany\" && additionalData) {\n return {\n total: additionalData.total,\n results: additionalData.results,\n data,\n };\n }\n\n if (\n operationType.includes(\"Many\") &&\n data &&\n typeof data === \"object\" &&\n \"count\" in data\n ) {\n return { results: data.count, data };\n }\n\n if (operationType.includes(\"batch\") && Array.isArray(data)) {\n return { results: data.length, data };\n }\n\n return { data };\n }\n\n /**\n * Creates a single resource\n */\n createOne = this.executeOperation({\n operationType: \"createOne\",\n serviceMethod: \"createOne\",\n successStatus: 201,\n queryFeatures: [\"limitFields\"],\n usesRequestBody: true,\n });\n\n /**\n * Creates multiple resources in a single operation\n */\n createMany = this.executeOperation({\n operationType: \"createMany\",\n serviceMethod: \"createMany\",\n successStatus: 201,\n queryFeatures: [\"limitFields\"],\n usesRequestBody: true,\n });\n\n /**\n * Retrieves multiple resources with filtering, sorting, pagination, and field selection\n */\n findMany = this.executeOperation({\n operationType: \"findMany\",\n serviceMethod: \"findMany\",\n successStatus: 200,\n queryFeatures: [\"filter\", \"sort\", \"limitFields\", \"paginate\"],\n });\n\n /**\n * Retrieves a single resource by its identifier\n */\n findOne = this.executeOperation({\n operationType: \"findOne\",\n serviceMethod: \"findOne\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestParams: true,\n });\n\n /**\n * Updates a single resource by its identifier\n */\n updateOne = this.executeOperation({\n operationType: \"updateOne\",\n serviceMethod: \"updateOne\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestParams: true,\n usesRequestBody: true,\n });\n\n /**\n * Updates multiple resources that match specified criteria\n */\n updateMany = this.executeOperation({\n operationType: \"updateMany\",\n serviceMethod: \"updateMany\",\n successStatus: 200,\n queryFeatures: [\"filter\", \"sort\", \"limitFields\", \"paginate\"],\n requiresQueryForBulk: true,\n preventORFilter: true,\n usesRequestBody: true,\n });\n\n /**\n * Updates multiple resources with different data in a single transaction\n */\n batchUpdate = this.executeOperation({\n operationType: \"batchUpdate\",\n serviceMethod: \"batchUpdate\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestBody: true,\n });\n\n /**\n * Deletes a single resource by its identifier\n */\n deleteOne = this.executeOperation({\n operationType: \"deleteOne\",\n serviceMethod: \"deleteOne\",\n successStatus: 204,\n queryFeatures: [],\n usesRequestParams: true,\n });\n\n /**\n * Deletes multiple resources that match specified criteria\n */\n deleteMany = this.executeOperation({\n operationType: \"deleteMany\",\n serviceMethod: \"deleteMany\",\n successStatus: 200,\n queryFeatures: [\"filter\"],\n requiresQueryForBulk: true,\n preventORFilter: true,\n });\n\n /**\n * Deletes multiple resources with different filters in a single transaction\n */\n batchDelete = this.executeOperation({\n operationType: \"batchDelete\",\n serviceMethod: \"batchDelete\",\n successStatus: 200,\n queryFeatures: [],\n usesRequestBody: true,\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-resources` 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 { 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\";\nimport { APIFeatures } from \"../../exports/utils\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\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 *\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 * **See about how Arkos handles routers**\n * @see {@link https://www.arkosjs.com/docs/guide/adding-custom-routers}\n */\nexport interface OperationHooks {\n beforeQuery?: (req: ArkosRequest) => void | Promise<void>;\n afterQuery?: (\n queryData: { where: any; queryOptions: any },\n req: ArkosRequest\n ) => void | Promise<void>;\n beforeService?: (args: any[], req: ArkosRequest) => any[] | Promise<any[]>;\n afterService?: (data: any, req: ArkosRequest) => any | Promise<any>;\n beforeResponse?: (responseData: any, req: ArkosRequest) => any | Promise<any>;\n}\n\ninterface OperationConfig {\n operationType: string;\n serviceMethod: string;\n successStatus: number;\n queryFeatures: (\"filter\" | \"sort\" | \"limitFields\" | \"paginate\")[];\n requiresQueryForBulk?: boolean;\n preventORFilter?: boolean;\n responseBuilder?: (data: any, additionalData?: any) => any;\n errorHandler?: (\n data: any,\n req: ArkosRequest,\n modelName: string\n ) => AppError | null;\n usesRequestParams?: boolean;\n usesRequestBody?: boolean;\n hooks?: OperationHooks;\n}\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 private executeOperation = (config: OperationConfig) => {\n return catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n if (config.hooks?.beforeQuery) await config.hooks.beforeQuery(req);\n\n if (config.requiresQueryForBulk) {\n if (\n Object.keys(req.query).every((key) =>\n [\"filterMode\", \"prismaQueryOptions\"].includes(key)\n )\n ) {\n return next(\n new AppError(\n `Filter criteria not provided for bulk ${config.operationType.replace(/Many$/, \"\")}.`,\n 400,\n {},\n \"MissingRequestQueryParameters\"\n )\n );\n }\n }\n\n if (config.preventORFilter && req.query.filterMode === \"OR\") {\n throw new AppError(\n `req.query.filterMode === OR is not valid for ${config.operationType} operation`,\n 400\n );\n }\n\n if (config.preventORFilter) req.query.filterMode = \"AND\";\n\n let apiFeatures = new APIFeatures(req, this.modelName);\n\n config.queryFeatures.forEach((feature) => {\n switch (feature) {\n case \"filter\":\n apiFeatures = apiFeatures.filter();\n break;\n case \"sort\":\n apiFeatures = apiFeatures.sort();\n break;\n case \"limitFields\":\n apiFeatures = apiFeatures.limitFields();\n break;\n case \"paginate\":\n apiFeatures = apiFeatures.paginate();\n break;\n }\n });\n\n const { where, ...queryOptions } = apiFeatures.filters;\n\n if (config.hooks?.afterQuery)\n await config.hooks.afterQuery({ where, queryOptions }, req);\n\n let serviceArgs = this.buildServiceArgs(\n config,\n req,\n where,\n queryOptions\n );\n\n if (config.hooks?.beforeService)\n serviceArgs = await config.hooks.beforeService(serviceArgs, req);\n\n const serviceMethod = this.service[\n config.serviceMethod as keyof BaseService<any>\n ] as Function;\n let result = await serviceMethod.apply(this.service, serviceArgs);\n\n if (config.hooks?.afterService)\n result = await config.hooks.afterService(result, req);\n\n let data = result;\n let additionalData: any = null;\n\n if (config.operationType === \"findMany\") {\n const [records, total] = await Promise.all([\n result,\n this.service.count(where, {\n user: req?.user,\n accessToken: req?.accessToken,\n }),\n ]);\n data = records;\n additionalData = { total, results: records.length };\n }\n\n const error = config.errorHandler\n ? config.errorHandler(data, req, this.modelName)\n : this.defaultErrorHandler(data, req, config.operationType);\n\n if (error) return next(error);\n\n let responseData = config.responseBuilder\n ? config.responseBuilder(data, additionalData)\n : this.defaultResponseBuilder(\n data,\n additionalData,\n config.operationType\n );\n\n if (config.hooks?.beforeResponse) {\n responseData = await config.hooks.beforeResponse(responseData, req);\n }\n\n const interceptorName = `after${config.operationType.charAt(0).toUpperCase()}${config.operationType.slice(1)}`;\n\n if (this.interceptors[interceptorName]) {\n this.setResponseData(req, res, responseData, config.successStatus);\n return next();\n }\n\n if (config.operationType === \"deleteOne\")\n return res.status(config.successStatus).send();\n\n res.status(config.successStatus).json(responseData);\n }\n );\n };\n\n /**\n * Sets response data for both legacy (req.responseData) and modern (res.locals) support\n */\n private setResponseData(\n req: ArkosRequest,\n res: ArkosResponse,\n data: any,\n status: number\n ): void {\n (res as any).originalData = data;\n req.responseData = data;\n res.locals.data = data;\n (res as any).originalStatus = status;\n req.responseStatus = status;\n res.locals.status = status;\n\n // Special handling for deleteOne\n if (status === 204) {\n req.additionalData = data;\n res.locals.additionalData = data;\n (res as any).originalAdditionalData = data;\n }\n }\n\n /**\n * Builds service method arguments based on operation configuration\n */\n private buildServiceArgs(\n config: OperationConfig,\n req: ArkosRequest,\n where: any,\n queryOptions: any\n ): any[] {\n const context = { user: req?.user, accessToken: req?.accessToken };\n const mergedOptions = deepmerge(req.prismaQueryOptions || {}, queryOptions);\n\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return [req.body, mergedOptions, context];\n\n case \"findMany\":\n return [where, queryOptions, context];\n\n case \"findOne\":\n return [req.params, mergedOptions, context];\n\n case \"updateOne\":\n return [req.params, req.body, mergedOptions, context];\n\n case \"updateMany\":\n // Remove include for bulk operations\n delete queryOptions.include;\n return [where, req.body, queryOptions, context];\n\n case \"batchUpdate\":\n return [req.body, mergedOptions, context];\n\n case \"deleteOne\":\n return [req.params, context];\n\n case \"deleteMany\":\n return [where, context];\n\n case \"batchDelete\":\n return [req.body, context];\n\n default:\n throw new Error(`Unknown operation type: ${config.operationType}`);\n }\n }\n\n /**\n * Default error handler for operations\n */\n private defaultErrorHandler(\n data: any,\n req: ArkosRequest,\n operationType: string\n ): AppError | null {\n if (!data || (Array.isArray(data) && data.length === 0)) {\n // Handle different error scenarios\n if (operationType.includes(\"create\") || operationType.includes(\"batch\")) {\n return new AppError(\n \"Failed to create the resources. Please check your input.\",\n 400,\n { body: req.body }\n );\n }\n\n if (\n operationType === \"findOne\" ||\n operationType === \"updateOne\" ||\n operationType === \"deleteOne\"\n ) {\n if (\n Object.keys(req.params).length === 1 &&\n \"id\" in req.params &&\n req.params.id !== \"me\"\n ) {\n return new AppError(\n `${pascalCase(String(this.modelName))} with ID ${req.params?.id} not found`,\n 404,\n {},\n \"NotFound\"\n );\n } else {\n return new AppError(\n `${pascalCase(String(this.modelName))} not found`,\n 404,\n {},\n \"NotFound\"\n );\n }\n }\n\n if (operationType === \"updateMany\" || operationType === \"deleteMany\") {\n const isUpdate = operationType === \"updateMany\";\n return new AppError(\n isUpdate\n ? `${pluralize(pascalCase(String(this.modelName)))} not found`\n : `No records found to delete`,\n 404,\n {},\n \"NotFound\"\n );\n }\n }\n\n // Special handling for operations that return count\n if (\n data &&\n typeof data === \"object\" &&\n \"count\" in data &&\n data.count === 0\n ) {\n return new AppError(\n operationType === \"updateMany\"\n ? `${pluralize(pascalCase(String(this.modelName)))} not found`\n : `No records found to delete`,\n 404,\n {},\n \"NotFound\"\n );\n }\n\n return null;\n }\n\n /**\n * Default response builder for operations\n */\n private defaultResponseBuilder(\n data: any,\n additionalData: any,\n operationType: string\n ): any {\n if (operationType === \"findMany\" && additionalData) {\n return {\n total: additionalData.total,\n results: additionalData.results,\n data,\n };\n }\n\n if (\n operationType.includes(\"Many\") &&\n data &&\n typeof data === \"object\" &&\n \"count\" in data\n ) {\n return { results: data.count, data };\n }\n\n if (operationType.includes(\"batch\") && Array.isArray(data)) {\n return { results: data.length, data };\n }\n\n return { data };\n }\n\n /**\n * Creates a single resource\n */\n createOne = this.executeOperation({\n operationType: \"createOne\",\n serviceMethod: \"createOne\",\n successStatus: 201,\n queryFeatures: [\"limitFields\"],\n usesRequestBody: true,\n });\n\n /**\n * Creates multiple resources in a single operation\n */\n createMany = this.executeOperation({\n operationType: \"createMany\",\n serviceMethod: \"createMany\",\n successStatus: 201,\n queryFeatures: [],\n usesRequestBody: true,\n });\n\n /**\n * Retrieves multiple resources with filtering, sorting, pagination, and field selection\n */\n findMany = this.executeOperation({\n operationType: \"findMany\",\n serviceMethod: \"findMany\",\n successStatus: 200,\n queryFeatures: [\"filter\", \"sort\", \"limitFields\", \"paginate\"],\n });\n\n /**\n * Retrieves a single resource by its identifier\n */\n findOne = this.executeOperation({\n operationType: \"findOne\",\n serviceMethod: \"findOne\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestParams: true,\n });\n\n /**\n * Updates a single resource by its identifier\n */\n updateOne = this.executeOperation({\n operationType: \"updateOne\",\n serviceMethod: \"updateOne\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestParams: true,\n usesRequestBody: true,\n });\n\n /**\n * Updates multiple resources that match specified criteria\n */\n updateMany = this.executeOperation({\n operationType: \"updateMany\",\n serviceMethod: \"updateMany\",\n successStatus: 200,\n queryFeatures: [\"filter\"],\n requiresQueryForBulk: true,\n preventORFilter: true,\n usesRequestBody: true,\n });\n\n /**\n * Updates multiple resources with different data in a single transaction\n */\n batchUpdate = this.executeOperation({\n operationType: \"batchUpdate\",\n serviceMethod: \"batchUpdate\",\n successStatus: 200,\n queryFeatures: [\"limitFields\"],\n usesRequestBody: true,\n });\n\n /**\n * Deletes a single resource by its identifier\n */\n deleteOne = this.executeOperation({\n operationType: \"deleteOne\",\n serviceMethod: \"deleteOne\",\n successStatus: 204,\n queryFeatures: [],\n usesRequestParams: true,\n });\n\n /**\n * Deletes multiple resources that match specified criteria\n */\n deleteMany = this.executeOperation({\n operationType: \"deleteMany\",\n serviceMethod: \"deleteMany\",\n successStatus: 200,\n queryFeatures: [\"filter\"],\n requiresQueryForBulk: true,\n preventORFilter: true,\n });\n\n /**\n * Deletes multiple resources with different filters in a single transaction\n */\n batchDelete = this.executeOperation({\n operationType: \"batchDelete\",\n serviceMethod: \"batchDelete\",\n successStatus: 200,\n queryFeatures: [],\n usesRequestBody: true,\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-resources` 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"]}
|
|
@@ -18,28 +18,32 @@ class BaseService {
|
|
|
18
18
|
return async (...args) => {
|
|
19
19
|
const context = args[args.length - 1];
|
|
20
20
|
try {
|
|
21
|
-
|
|
21
|
+
let argsWithRelationFieldsHandled = await this.processRelationFieldsInBody(args, config);
|
|
22
|
+
let prismaFinalArgs = await this.handlePasswordHashing(argsWithRelationFieldsHandled, config);
|
|
23
|
+
await this.executeHooks("before", config.operationType, this.buildHookParams(argsWithRelationFieldsHandled, config), context);
|
|
22
24
|
if (config.hooks?.beforeOperation)
|
|
23
|
-
await config.hooks.beforeOperation(this.buildHookParams(
|
|
24
|
-
let processedArgs = await this.processArguments(args, config);
|
|
25
|
+
await config.hooks.beforeOperation(this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
25
26
|
if (config.hooks?.beforePrisma) {
|
|
26
|
-
|
|
27
|
+
argsWithRelationFieldsHandled = await config.hooks.beforePrisma(argsWithRelationFieldsHandled, this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
27
28
|
}
|
|
28
29
|
const prisma = (0, prisma_helpers_1.getPrismaInstance)();
|
|
29
30
|
let result;
|
|
30
31
|
if (config.customPrismaLogic) {
|
|
31
|
-
result = await config.customPrismaLogic(
|
|
32
|
+
result = await config.customPrismaLogic(argsWithRelationFieldsHandled, prisma, config, this);
|
|
32
33
|
}
|
|
33
34
|
else {
|
|
34
|
-
const prismaArgs = this.buildPrismaArgs(
|
|
35
|
+
const prismaArgs = this.buildPrismaArgs(prismaFinalArgs, config);
|
|
35
36
|
result = await prisma[this.modelName][config.prismaMethod](prismaArgs);
|
|
36
37
|
}
|
|
37
38
|
if (config.hooks?.afterPrisma) {
|
|
38
|
-
result = await config.hooks.afterPrisma(result, this.buildHookParams(
|
|
39
|
+
result = await config.hooks.afterPrisma(result, this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
39
40
|
}
|
|
40
|
-
await this.executeHooks("after", config.operationType, {
|
|
41
|
+
await this.executeHooks("after", config.operationType, {
|
|
42
|
+
...this.buildHookParams(argsWithRelationFieldsHandled, config),
|
|
43
|
+
result,
|
|
44
|
+
}, context);
|
|
41
45
|
if (config.hooks?.afterOperation) {
|
|
42
|
-
await config.hooks.afterOperation(result, this.buildHookParams(
|
|
46
|
+
await config.hooks.afterOperation(result, this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
43
47
|
}
|
|
44
48
|
return result;
|
|
45
49
|
}
|
|
@@ -55,10 +59,15 @@ class BaseService {
|
|
|
55
59
|
return async (...args) => {
|
|
56
60
|
const context = args[args.length - 1];
|
|
57
61
|
try {
|
|
58
|
-
|
|
62
|
+
let argsWithRelationFieldsHandled = await this.processRelationFieldsInBody(args, config);
|
|
63
|
+
let prismaFinalArgs = await this.handlePasswordHashing(argsWithRelationFieldsHandled, config);
|
|
64
|
+
await this.executeHooks("before", config.operationType, this.buildTransactionHookParams(argsWithRelationFieldsHandled, config), context);
|
|
59
65
|
const prisma = (0, prisma_helpers_1.getPrismaInstance)();
|
|
60
|
-
const results = await this.executeTransactionLogic(
|
|
61
|
-
await this.executeHooks("after", config.operationType, {
|
|
66
|
+
const results = await this.executeTransactionLogic(prismaFinalArgs, config, prisma);
|
|
67
|
+
await this.executeHooks("after", config.operationType, {
|
|
68
|
+
...this.buildTransactionHookParams(argsWithRelationFieldsHandled, config),
|
|
69
|
+
results,
|
|
70
|
+
}, context);
|
|
62
71
|
return results;
|
|
63
72
|
}
|
|
64
73
|
catch (err) {
|
|
@@ -88,9 +97,8 @@ class BaseService {
|
|
|
88
97
|
return;
|
|
89
98
|
const hookName = `${hookType === "error" ? "on" : hookType}${operationType.charAt(0).toUpperCase()}${operationType.slice(1)}${hookType === "error" ? "Error" : ""}`;
|
|
90
99
|
const hook = serviceHooks[hookName];
|
|
91
|
-
if (hook
|
|
100
|
+
if (hook)
|
|
92
101
|
await service_hooks_manager_1.default.handleHook(hook, params);
|
|
93
|
-
}
|
|
94
102
|
}
|
|
95
103
|
buildHookParams(args, config) {
|
|
96
104
|
const context = args[args.length - 1];
|
|
@@ -139,28 +147,59 @@ class BaseService {
|
|
|
139
147
|
return { context };
|
|
140
148
|
}
|
|
141
149
|
}
|
|
142
|
-
async
|
|
150
|
+
async handlePasswordHashing(args, config) {
|
|
143
151
|
let processedArgs = [...args];
|
|
144
152
|
if (config.requiresPasswordHashing) {
|
|
145
|
-
const dataIndex = config.operationType.includes("update")
|
|
146
|
-
config.operationType !== "updateMany"
|
|
147
|
-
? 1
|
|
148
|
-
: 0;
|
|
153
|
+
const dataIndex = config.operationType.includes("update") ? 1 : 0;
|
|
149
154
|
const data = processedArgs[dataIndex];
|
|
150
|
-
if (
|
|
155
|
+
if (Array.isArray(data)) {
|
|
156
|
+
for (const i in data) {
|
|
157
|
+
if (this.shouldHashPassword(data[i]))
|
|
158
|
+
processedArgs[dataIndex][i] = await this.processPasswordHashing(data[i]);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else if (this.shouldHashPassword(data)) {
|
|
151
162
|
processedArgs[dataIndex] = await this.processPasswordHashing(data);
|
|
152
163
|
}
|
|
153
164
|
}
|
|
154
165
|
return processedArgs;
|
|
155
166
|
}
|
|
167
|
+
async processRelationFieldsInBody(args, config) {
|
|
168
|
+
let processedArgs = [...args];
|
|
169
|
+
if (config.relationFieldsHandling) {
|
|
170
|
+
const dataIndex = config.operationType.includes("update") ? 1 : 0;
|
|
171
|
+
if (config.operationType === "batchUpdate") {
|
|
172
|
+
const dataArray = processedArgs[0];
|
|
173
|
+
if (Array.isArray(dataArray)) {
|
|
174
|
+
processedArgs[0] = dataArray.map((data) => (0, base_service_helpers_1.handleRelationFieldsInBody)(data, this.relationFields, config.relationFieldsHandling));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else if (config.operationType === "batchDelete") {
|
|
178
|
+
const batchFilters = processedArgs[0];
|
|
179
|
+
if (Array.isArray(batchFilters)) {
|
|
180
|
+
processedArgs[0] = batchFilters.map((filters) => (0, base_service_helpers_1.handleRelationFieldsInBody)(filters, this.relationFields));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else if (config.operationType === "createMany") {
|
|
184
|
+
const data = processedArgs[dataIndex];
|
|
185
|
+
if (Array.isArray(data)) {
|
|
186
|
+
processedArgs[dataIndex] = data.map((item) => (0, base_service_helpers_1.handleRelationFieldsInBody)(item, this.relationFields, config.relationFieldsHandling));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const data = processedArgs[dataIndex];
|
|
191
|
+
if (data) {
|
|
192
|
+
processedArgs[dataIndex] = (0, base_service_helpers_1.handleRelationFieldsInBody)(data, this.relationFields, config.relationFieldsHandling);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return processedArgs;
|
|
197
|
+
}
|
|
156
198
|
buildPrismaArgs(args, config) {
|
|
157
199
|
switch (config.operationType) {
|
|
158
200
|
case "createOne":
|
|
159
201
|
case "createMany":
|
|
160
|
-
|
|
161
|
-
? (0, base_service_helpers_1.handleRelationFieldsInBody)(args[0], this.relationFields, config.relationFieldsHandling)
|
|
162
|
-
: args[0];
|
|
163
|
-
return (0, deepmerge_helper_1.default)({ data }, args[1] || {});
|
|
202
|
+
return (0, deepmerge_helper_1.default)({ data: args[0] }, args[1] || {});
|
|
164
203
|
case "findMany":
|
|
165
204
|
return (0, deepmerge_helper_1.default)({ where: args[0] }, args[1] || {});
|
|
166
205
|
case "findById":
|
|
@@ -168,10 +207,7 @@ class BaseService {
|
|
|
168
207
|
case "findOne":
|
|
169
208
|
return (0, deepmerge_helper_1.default)({ where: args[0] }, args[1] || {});
|
|
170
209
|
case "updateOne":
|
|
171
|
-
|
|
172
|
-
? (0, base_service_helpers_1.handleRelationFieldsInBody)(args[1], this.relationFields)
|
|
173
|
-
: args[1];
|
|
174
|
-
return (0, deepmerge_helper_1.default)({ where: args[0], data: updateData }, args[2] || {});
|
|
210
|
+
return (0, deepmerge_helper_1.default)({ where: args[0], data: args[1] }, args[2] || {});
|
|
175
211
|
case "updateMany":
|
|
176
212
|
const firstMerge = (0, deepmerge_helper_1.default)({ data: args[1] }, args[2] || {});
|
|
177
213
|
return (0, deepmerge_helper_1.default)({ where: args[0] }, firstMerge);
|
|
@@ -219,9 +255,8 @@ class BaseService {
|
|
|
219
255
|
const batchFilters = args[0];
|
|
220
256
|
return await prisma.$transaction(async (tx) => {
|
|
221
257
|
const deletePromises = batchFilters.map(async (filters) => {
|
|
222
|
-
const filtersWithRelationFieldsHandled = (0, base_service_helpers_1.handleRelationFieldsInBody)(filters, this.relationFields);
|
|
223
258
|
return await tx[this.modelName].delete({
|
|
224
|
-
where:
|
|
259
|
+
where: filters,
|
|
225
260
|
});
|
|
226
261
|
});
|
|
227
262
|
return await Promise.all(deletePromises);
|
|
@@ -276,26 +311,6 @@ class BaseService {
|
|
|
276
311
|
requiresPasswordHashing: true,
|
|
277
312
|
relationFieldsHandling: ["delete", "disconnect", "update"],
|
|
278
313
|
returnsFallback: undefined,
|
|
279
|
-
customPrismaLogic: async (args, prisma, _, serviceContext) => {
|
|
280
|
-
const data = args[0];
|
|
281
|
-
const queryOptions = args[1];
|
|
282
|
-
const dataWithRelationFieldsHandled = [];
|
|
283
|
-
if (Array.isArray(data)) {
|
|
284
|
-
for (let i = 0; i < data.length; i++) {
|
|
285
|
-
let curr = data[i];
|
|
286
|
-
if ("password" in curr && serviceContext.modelName === "user") {
|
|
287
|
-
if (!auth_service_1.default.isPasswordHashed(curr.password)) {
|
|
288
|
-
curr = {
|
|
289
|
-
...curr,
|
|
290
|
-
password: await auth_service_1.default.hashPassword(curr.password),
|
|
291
|
-
};
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
dataWithRelationFieldsHandled[i] = (0, base_service_helpers_1.handleRelationFieldsInBody)(curr, serviceContext.relationFields, ["delete", "disconnect", "update"]);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
return await prisma[serviceContext.modelName].createMany((0, deepmerge_helper_1.default)({ data: dataWithRelationFieldsHandled }, queryOptions || {}));
|
|
298
|
-
},
|
|
299
314
|
})(data, queryOptions, context);
|
|
300
315
|
}
|
|
301
316
|
async count(filters, context) {
|
|
@@ -352,23 +367,8 @@ class BaseService {
|
|
|
352
367
|
operationType: "updateMany",
|
|
353
368
|
prismaMethod: "updateMany",
|
|
354
369
|
requiresPasswordHashing: true,
|
|
370
|
+
relationFieldsHandling: [],
|
|
355
371
|
returnsFallback: undefined,
|
|
356
|
-
customPrismaLogic: async (args, prisma, _, serviceContext) => {
|
|
357
|
-
const filters = args[0];
|
|
358
|
-
const data = args[1];
|
|
359
|
-
const queryOptions = args[2];
|
|
360
|
-
let processedData = data;
|
|
361
|
-
if (serviceContext.modelName === "user" && data?.password) {
|
|
362
|
-
if (!auth_service_1.default.isPasswordHashed(data.password)) {
|
|
363
|
-
processedData = {
|
|
364
|
-
...data,
|
|
365
|
-
password: await auth_service_1.default.hashPassword(data.password),
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
const firstMerge = (0, deepmerge_helper_1.default)({ data: processedData }, queryOptions || {});
|
|
370
|
-
return await prisma[serviceContext.modelName].updateMany((0, deepmerge_helper_1.default)({ where: filters }, firstMerge));
|
|
371
|
-
},
|
|
372
372
|
})(filters, data, queryOptions, context);
|
|
373
373
|
}
|
|
374
374
|
async deleteOne(filters, context) {
|
|
@@ -390,6 +390,7 @@ class BaseService {
|
|
|
390
390
|
operationType: "batchUpdate",
|
|
391
391
|
prismaMethod: "update",
|
|
392
392
|
requiresPasswordHashing: true,
|
|
393
|
+
relationFieldsHandling: [],
|
|
393
394
|
returnsFallback: undefined,
|
|
394
395
|
})(dataArray, queryOptions, context);
|
|
395
396
|
}
|
|
@@ -397,6 +398,7 @@ class BaseService {
|
|
|
397
398
|
return this.executeTransactionOperation({
|
|
398
399
|
operationType: "batchDelete",
|
|
399
400
|
prismaMethod: "delete",
|
|
401
|
+
relationFieldsHandling: [],
|
|
400
402
|
returnsFallback: undefined,
|
|
401
403
|
})(batchFilters, context);
|
|
402
404
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../src/modules/base/base.service.ts"],"names":[],"mappings":";;;;;;AAAA,iFAIiD;AACjD,+DAAiE;AACjE,4FAA6D;AAC7D,+EAG8C;AAC9C,uEAAuE;AACvE,wEAA+C;AAgC/C,0FAAgE;AAChE,mGAAyE;AA4DzE,MAAa,WAAW;IAKtB,YAAY,SAAiB;QAarB,qBAAgB,GAAG,CAAC,MAA8B,EAAE,EAAE;YAC5D,OAAO,KAAK,EAAE,GAAG,IAAW,EAAgB,EAAE;gBAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAuB,CAAC;gBAE5D,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,YAAY,CACrB,QAAQ,EACR,MAAM,CAAC,aAAa,EACpB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,EAClC,OAAO,CACR,CAAC;oBAEF,IAAI,MAAM,CAAC,KAAK,EAAE,eAAe;wBAC/B,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,CAChC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CACnC,CAAC;oBAEJ,IAAI,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBAE9D,IAAI,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;wBAC/B,aAAa,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAC7C,aAAa,EACb,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CACnC,CAAC;oBACJ,CAAC;oBAED,MAAM,MAAM,GAAG,IAAA,kCAAiB,GAAE,CAAC;oBACnC,IAAI,MAAW,CAAC;oBAEhB,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;wBAC7B,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CACrC,aAAa,EACb,MAAM,EACN,MAAM,EACN,IAAI,CACL,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;wBAC/D,MAAM,GAAG,MAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAO,CAC1C,MAAM,CAAC,YAAuB,CAC/B,CAAC,UAAU,CAAC,CAAC;oBAChB,CAAC;oBAED,IAAI,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;wBAC9B,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CACrC,MAAM,EACN,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CACnC,CAAC;oBACJ,CAAC;oBAED,MAAM,IAAI,CAAC,YAAY,CACrB,OAAO,EACP,MAAM,CAAC,aAAa,EACpB,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EACjD,OAAO,CACR,CAAC;oBAEF,IAAI,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;wBACjC,MAAM,MAAM,CAAC,KAAK,CAAC,cAAc,CAC/B,MAAM,EACN,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CACnC,CAAC;oBACJ,CAAC;oBAED,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,MAAM,IAAI,CAAC,YAAY,CACrB,OAAO,EACP,MAAM,CAAC,aAAa,EACpB,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EACrD,OAAO,CACR,CAAC;oBACF,IAAI,OAAO,EAAE,YAAY,KAAK,KAAK;wBAAE,MAAM,GAAG,CAAC;oBAC/C,OAAO,MAAM,CAAC,eAAe,CAAC;gBAChC,CAAC;YACH,CAAC,CAAC;QACJ,CAAC,CAAC;QAEM,gCAA2B,GAAG,CAAC,MAA8B,EAAE,EAAE;YACvE,OAAO,KAAK,EAAE,GAAG,IAAW,EAAgB,EAAE;gBAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAuB,CAAC;gBAE5D,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,YAAY,CACrB,QAAQ,EACR,MAAM,CAAC,aAAa,EACpB,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,MAAM,CAAC,EAC7C,OAAO,CACR,CAAC;oBAEF,MAAM,MAAM,GAAG,IAAA,kCAAiB,GAAE,CAAC;oBACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAChD,IAAI,EACJ,MAAM,EACN,MAAM,CACP,CAAC;oBAEF,MAAM,IAAI,CAAC,YAAY,CACrB,OAAO,EACP,MAAM,CAAC,aAAa,EACpB,EAAE,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,EAC7D,OAAO,CACR,CAAC;oBACF,OAAO,OAAO,CAAC;gBACjB,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,MAAM,IAAI,CAAC,YAAY,CACrB,OAAO,EACP,MAAM,CAAC,aAAa,EACpB,EAAE,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAChE,OAAO,CACR,CAAC;oBACF,IAAI,OAAO,EAAE,YAAY,KAAK,KAAK;wBAAE,MAAM,GAAG,CAAC;oBAC/C,OAAO,MAAM,CAAC,eAAe,CAAC;gBAChC,CAAC;YACH,CAAC,CAAC;QACJ,CAAC,CAAC;QA/HA,IAAI,CAAC,SAAS,GAAG,IAAA,+BAAS,EAAC,SAAS,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,8BAAkB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAEpE,IAAI,CAAC,cAAc,GAAG;YACpB,QAAQ,EACN,WAAW,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBAClE,EAAE;YACJ,IAAI,EACF,WAAW,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;SAC1E,CAAC;IACJ,CAAC;IAuHO,KAAK,CAAC,YAAY,CACxB,QAAsC,EACtC,aAAqB,EACrB,MAAW,EACX,OAA4B;QAE5B,MAAM,YAAY,GAAG,IAAA,oCAAmB,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;QAEhE,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,MAAM,aAAa,GACjB,OAAO,EAAE,IAAI,KAAK,QAAQ;YAC1B,OAAO,EAAE,IAAI,KAAK,KAAK;YACvB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEpE,IAAI,aAAa;YAAE,OAAO;QAE1B,MAAM,QAAQ,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACpK,MAAM,IAAI,GAAG,YAAY,CAAC,QAAqC,CAAC,CAAC;QAEjE,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,+BAAmB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,IAAW,EAAE,MAA8B;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEtC,QAAQ,MAAM,CAAC,aAAa,EAAE,CAAC;YAC7B,KAAK,WAAW,CAAC;YACjB,KAAK,YAAY;gBACf,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC3D,KAAK,UAAU;gBACb,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC9D,KAAK,UAAU;gBACb,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YACzD,KAAK,SAAS;gBACZ,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC9D,KAAK,WAAW;gBACd,OAAO;oBACL,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;oBAChB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;oBACb,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;oBACrB,OAAO;iBACR,CAAC;YACJ,KAAK,YAAY;gBACf,OAAO;oBACL,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;oBAChB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;oBACb,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;oBACrB,OAAO;iBACR,CAAC;YACJ,KAAK,WAAW;gBACd,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YACvC,KAAK,YAAY;gBACf,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YACvC,KAAK,OAAO;gBACV,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YACvC;gBACE,OAAO,EAAE,OAAO,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,0BAA0B,CAChC,IAAW,EACX,MAA8B;QAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEtC,QAAQ,MAAM,CAAC,aAAa,EAAE,CAAC;YAC7B,KAAK,aAAa;gBAChB,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC3D,KAAK,aAAa;gBAChB,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC5C;gBACE,OAAO,EAAE,OAAO,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,IAAW,EACX,MAA8B;QAE9B,IAAI,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAE9B,IAAI,MAAM,CAAC,uBAAuB,EAAE,CAAC;YACnC,MAAM,SAAS,GACb,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACvC,MAAM,CAAC,aAAa,KAAK,YAAY;gBACnC,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,CAAC,CAAC;YACR,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;YAEtC,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,aAAa,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,eAAe,CAAC,IAAW,EAAE,MAA8B;QACjE,QAAQ,MAAM,CAAC,aAAa,EAAE,CAAC;YAC7B,KAAK,WAAW,CAAC;YACjB,KAAK,YAAY;gBACf,MAAM,IAAI,GAAG,MAAM,CAAC,sBAAsB;oBACxC,CAAC,CAAC,IAAA,iDAA0B,EACxB,IAAI,CAAC,CAAC,CAAwB,EAC9B,IAAI,CAAC,cAAc,EACnB,MAAM,CAAC,sBAAsB,CAC9B;oBACH,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACZ,OAAO,IAAA,0BAAS,EAAC,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAE5C,KAAK,UAAU;gBACb,OAAO,IAAA,0BAAS,EAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAEtD,KAAK,UAAU;gBACb,OAAO,IAAA,0BAAS,EAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAE9D,KAAK,SAAS;gBACZ,OAAO,IAAA,0BAAS,EAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAEtD,KAAK,WAAW;gBACd,MAAM,UAAU,GAAG,MAAM,CAAC,sBAAsB;oBAC9C,CAAC,CAAC,IAAA,iDAA0B,EACxB,IAAI,CAAC,CAAC,CAAwB,EAC9B,IAAI,CAAC,cAAc,CACpB;oBACH,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACZ,OAAO,IAAA,0BAAS,EAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAExE,KAAK,YAAY;gBACf,MAAM,UAAU,GAAG,IAAA,0BAAS,EAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC/D,OAAO,IAAA,0BAAS,EAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAEnD,KAAK,WAAW,CAAC;YACjB,KAAK,YAAY;gBACf,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAE5B,KAAK,OAAO;gBACV,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAE5B;gBACE,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,uBAAuB,CACnC,IAAW,EACX,MAA8B,EAC9B,MAAW;QAEX,IAAI,MAAM,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAE7B,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;gBACjD,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAS,EAAE,EAAE;oBACvD,IAAI,aAAa,GAAG,IAAI,CAAC;oBACzB,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;wBAClC,aAAa,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;oBAC1D,CAAC;oBAED,MAAM,sBAAsB,GAAG,IAAA,iDAA0B,EACvD;wBACE,WAAW,EAAE;4BACX,GAAG,aAAa;4BAChB,SAAS,EAAE,QAAQ;yBACpB;qBACqB,EACxB;wBACE,QAAQ,EAAE;4BACR;gCACE,GAAG,8BAAkB,CAAC,QAAQ,CAAC;oCAC7B,IAAI,EAAE,IAAA,gCAAU,EAAC,IAAI,CAAC,SAAS,CAAC;iCACjC,CAAE;gCACH,IAAI,EAAE,aAAa;6BACpB;yBACF;wBACD,IAAI,EAAE,EAAE;qBACT,CACF,CAAC;oBAEF,OAAO,MAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAO,CAAC,MAAM,CAC3C,IAAA,0BAAS,EACP,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAC1C,YAAY,IAAI,EAAE,CACU,CAC/B,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;YAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAE7B,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;gBACjD,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAY,EAAE,EAAE;oBAC7D,MAAM,gCAAgC,GAAG,IAAA,iDAA0B,EACjE,OAA8B,EAC9B,IAAI,CAAC,cAAc,CACpB,CAAC;oBAEF,OAAO,MAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAO,CAAC,MAAM,CAAC;wBAC5C,KAAK,EAAE,gCAAgC;qBACxC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEH,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAC5E,CAAC;IAEO,kBAAkB,CAAC,IAAS;QAClC,OAAO,IAAA,+BAAS,EAAC,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,QAAQ,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,IAAS;QAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,cAAc,GAAG,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACrB,IACE,UAAU,IAAI,IAAI;oBAClB,CAAC,sBAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAS,CAAC,EAC7C,CAAC;oBACD,cAAc,CAAC,CAAC,CAAC,GAAG;wBAClB,GAAG,IAAI;wBACP,QAAQ,EAAE,MAAM,sBAAW,CAAC,YAAY,CAAC,IAAI,CAAC,QAAS,CAAC;qBACzD,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;gBAC3B,CAAC;YACH,CAAC;YACD,OAAO,cAAc,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,sBAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClE,OAAO;oBACL,GAAG,IAAI;oBACP,QAAQ,EAAE,MAAM,sBAAW,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CACb,IAAsB,EACtB,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,WAAW;YAC1B,YAAY,EAAE,QAAQ;YACtB,uBAAuB,EAAE,IAAI;YAC7B,sBAAsB,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC;YAC1D,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,UAAU,CACd,IAAuB,EACvB,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,YAAY;YAC3B,YAAY,EAAE,YAAY;YAC1B,uBAAuB,EAAE,IAAI;YAC7B,sBAAsB,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC;YAC1D,eAAe,EAAE,SAAS;YAC1B,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE;gBAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACrB,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,6BAA6B,GAAU,EAAE,CAAC;gBAEhD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACrC,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;wBACnB,IAAI,UAAU,IAAI,IAAI,IAAI,cAAc,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;4BAC9D,IAAI,CAAC,sBAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAS,CAAC,EAAE,CAAC;gCAClD,IAAI,GAAG;oCACL,GAAG,IAAI;oCACP,QAAQ,EAAE,MAAM,sBAAW,CAAC,YAAY,CAAC,IAAI,CAAC,QAAS,CAAC;iCACzD,CAAC;4BACJ,CAAC;wBACH,CAAC;wBACD,6BAA6B,CAAC,CAAC,CAAC,GAAG,IAAA,iDAA0B,EAC3D,IAA2B,EAC3B,cAAc,CAAC,cAAc,EAC7B,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CACnC,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,OAAO,MAAO,MAAM,CAAC,cAAc,CAAC,SAAS,CAAO,CAAC,UAAU,CAC7D,IAAA,0BAAS,EACP,EAAE,IAAI,EAAE,6BAA6B,EAAE,EACvC,YAAY,IAAI,EAAE,CACF,CACnB,CAAC;YACJ,CAAC;SACF,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,KAAK,CACT,OAAyB,EACzB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,OAAO;YACtB,YAAY,EAAE,OAAO;YACrB,eAAe,EAAE,CAAC;SACnB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,OAA4B,EAC5B,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,UAAU;YACzB,YAAY,EAAE,UAAU;YACxB,eAAe,EAAE,EAAE;SACpB,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,EAAmB,EACnB,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,UAAU;YACzB,YAAY,EAAE,YAAY;YAC1B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAA0B,EAC1B,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,SAAS;YACxB,YAAY,EAAE,WAAW;YACzB,eAAe,EAAE,SAAS;YAC1B,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE;gBAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAE7B,IACE,MAAM,CAAC,IAAI,CAAC,OAA8B,CAAC,CAAC,MAAM,KAAK,CAAC;oBACxD,IAAI,IAAK,OAA+B;oBACvC,OAAe,CAAC,EAAE,KAAK,IAAI,EAC5B,CAAC;oBACD,OAAO,MAAO,MAAM,CAAC,cAAc,CAAC,SAAS,CAAO,CAAC,UAAU,CAC7D,IAAA,0BAAS,EAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,YAAY,IAAI,EAAE,CAAC,CAClD,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,MAAO,MAAM,CAAC,cAAc,CAAC,SAAS,CAAO,CAAC,SAAS,CAC5D,IAAA,0BAAS,EAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,YAAY,IAAI,EAAE,CAAC,CAClD,CAAC;gBACJ,CAAC;YACH,CAAC;SACF,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAA4B,EAC5B,IAAsB,EACtB,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,WAAW;YAC1B,YAAY,EAAE,QAAQ;YACtB,uBAAuB,EAAE,IAAI;YAC7B,sBAAsB,EAAE,EAAE;YAC1B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,UAAU,CACd,OAA6B,EAC7B,IAAuB,EACvB,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,YAAY;YAC3B,YAAY,EAAE,YAAY;YAC1B,uBAAuB,EAAE,IAAI;YAC7B,eAAe,EAAE,SAAS;YAC1B,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE;gBAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACrB,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAE7B,IAAI,aAAa,GAAG,IAAI,CAAC;gBACzB,IAAI,cAAc,CAAC,SAAS,KAAK,MAAM,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;oBAC1D,IAAI,CAAC,sBAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACjD,aAAa,GAAG;4BACd,GAAG,IAAI;4BACP,QAAQ,EAAE,MAAM,sBAAW,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;yBACxD,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,MAAM,UAAU,GAAG,IAAA,0BAAS,EAC1B,EAAE,IAAI,EAAE,aAAa,EAAE,EACvB,YAAY,IAAI,EAAE,CACnB,CAAC;gBACF,OAAO,MAAO,MAAM,CAAC,cAAc,CAAC,SAAS,CAAO,CAAC,UAAU,CAC7D,IAAA,0BAAS,EAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,UAAU,CAGvC,CACF,CAAC;YACJ,CAAC;SACF,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAA4B,EAC5B,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,WAAW;YAC1B,YAAY,EAAE,QAAQ;YACtB,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU,CACd,OAA6B,EAC7B,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,YAAY;YAC3B,YAAY,EAAE,YAAY;YAC1B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,WAAW,CACf,SAA6B,EAC7B,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,2BAA2B,CAAC;YACtC,aAAa,EAAE,aAAa;YAC5B,YAAY,EAAE,QAAQ;YACtB,uBAAuB,EAAE,IAAI;YAC7B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,WAAW,CACf,YAAwC,EACxC,OAA4B;QAE5B,OAAO,IAAI,CAAC,2BAA2B,CAAC;YACtC,aAAa,EAAE,aAAa;YAC5B,YAAY,EAAE,QAAQ;YACtB,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;CACF;AAlmBD,kCAkmBC","sourcesContent":["import {\n camelCase,\n kebabCase,\n pascalCase,\n} 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 interface ServiceOperationHooks {\n beforeOperation?: (params: any) => void | Promise<void>;\n afterOperation?: (result: any, params: any) => void | Promise<void>;\n beforePrisma?: (prismaArgs: any, params: any) => any | Promise<any>;\n afterPrisma?: (result: any, params: any) => any | Promise<any>;\n}\n\ninterface ServiceOperationConfig {\n operationType: string;\n prismaMethod: string;\n requiresPasswordHashing?: boolean;\n relationFieldsHandling?: string[];\n returnsFallback?: any;\n customPrismaLogic?: (\n args: any[],\n prisma: any,\n config: ServiceOperationConfig,\n context: BaseService<any>\n ) => Promise<any>;\n hooks?: ServiceOperationHooks;\n}\n\nexport class BaseService<T extends ModelDelegate = any> {\n modelName: string;\n relationFields: ModelGroupRelationFields;\n prisma: any;\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 private executeOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n const context = args[args.length - 1] as ServiceBaseContext;\n\n try {\n await this.executeHooks(\n \"before\",\n config.operationType,\n this.buildHookParams(args, config),\n context\n );\n\n if (config.hooks?.beforeOperation)\n await config.hooks.beforeOperation(\n this.buildHookParams(args, config)\n );\n\n let processedArgs = await this.processArguments(args, config);\n\n if (config.hooks?.beforePrisma) {\n processedArgs = await config.hooks.beforePrisma(\n processedArgs,\n this.buildHookParams(args, config)\n );\n }\n\n const prisma = getPrismaInstance();\n let result: any;\n\n if (config.customPrismaLogic) {\n result = await config.customPrismaLogic(\n processedArgs,\n prisma,\n config,\n this\n );\n } else {\n const prismaArgs = this.buildPrismaArgs(processedArgs, config);\n result = await (prisma[this.modelName] as T)[\n config.prismaMethod as keyof T\n ](prismaArgs);\n }\n\n if (config.hooks?.afterPrisma) {\n result = await config.hooks.afterPrisma(\n result,\n this.buildHookParams(args, config)\n );\n }\n\n await this.executeHooks(\n \"after\",\n config.operationType,\n { ...this.buildHookParams(args, config), result },\n context\n );\n\n if (config.hooks?.afterOperation) {\n await config.hooks.afterOperation(\n result,\n this.buildHookParams(args, config)\n );\n }\n\n return result;\n } catch (err: any) {\n await this.executeHooks(\n \"error\",\n config.operationType,\n { ...this.buildHookParams(args, config), error: err },\n context\n );\n if (context?.throwOnError !== false) throw err;\n return config.returnsFallback;\n }\n };\n };\n\n private executeTransactionOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n const context = args[args.length - 1] as ServiceBaseContext;\n\n try {\n await this.executeHooks(\n \"before\",\n config.operationType,\n this.buildTransactionHookParams(args, config),\n context\n );\n\n const prisma = getPrismaInstance();\n const results = await this.executeTransactionLogic(\n args,\n config,\n prisma\n );\n\n await this.executeHooks(\n \"after\",\n config.operationType,\n { ...this.buildTransactionHookParams(args, config), results },\n context\n );\n return results;\n } catch (err: any) {\n await this.executeHooks(\n \"error\",\n config.operationType,\n { ...this.buildTransactionHookParams(args, config), error: err },\n context\n );\n if (context?.throwOnError !== false) throw err;\n return config.returnsFallback;\n }\n };\n };\n\n private async executeHooks(\n hookType: \"before\" | \"after\" | \"error\",\n operationType: string,\n params: any,\n context?: ServiceBaseContext\n ): Promise<void> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n\n if (!serviceHooks) return;\n\n const skipCondition =\n context?.skip === hookType ||\n context?.skip === \"all\" ||\n (Array.isArray(context?.skip) && context.skip.includes(hookType));\n\n if (skipCondition) return;\n\n const hookName = `${hookType === \"error\" ? \"on\" : hookType}${operationType.charAt(0).toUpperCase()}${operationType.slice(1)}${hookType === \"error\" ? \"Error\" : \"\"}`;\n const hook = serviceHooks[hookName as keyof typeof serviceHooks];\n\n if (hook && typeof hook === \"function\") {\n await serviceHooksManager.handleHook(hook, params);\n }\n }\n\n private buildHookParams(args: any[], config: ServiceOperationConfig): any {\n const context = args[args.length - 1];\n\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return { data: args[0], queryOptions: args[1], context };\n case \"findMany\":\n return { filters: args[0], queryOptions: args[1], context };\n case \"findById\":\n return { id: args[0], queryOptions: args[1], context };\n case \"findOne\":\n return { filters: args[0], queryOptions: args[1], context };\n case \"updateOne\":\n return {\n filters: args[0],\n data: args[1],\n queryOptions: args[2],\n context,\n };\n case \"updateMany\":\n return {\n filters: args[0],\n data: args[1],\n queryOptions: args[2],\n context,\n };\n case \"deleteOne\":\n return { filters: args[0], context };\n case \"deleteMany\":\n return { filters: args[0], context };\n case \"count\":\n return { filters: args[0], context };\n default:\n return { context };\n }\n }\n\n private buildTransactionHookParams(\n args: any[],\n config: ServiceOperationConfig\n ): any {\n const context = args[args.length - 1];\n\n switch (config.operationType) {\n case \"batchUpdate\":\n return { data: args[0], queryOptions: args[1], context };\n case \"batchDelete\":\n return { batchFilters: args[0], context };\n default:\n return { context };\n }\n }\n\n private async processArguments(\n args: any[],\n config: ServiceOperationConfig\n ): Promise<any[]> {\n let processedArgs = [...args];\n\n if (config.requiresPasswordHashing) {\n const dataIndex =\n config.operationType.includes(\"update\") &&\n config.operationType !== \"updateMany\"\n ? 1\n : 0;\n const data = processedArgs[dataIndex];\n\n if (this.shouldHashPassword(data)) {\n processedArgs[dataIndex] = await this.processPasswordHashing(data);\n }\n }\n\n return processedArgs;\n }\n\n private buildPrismaArgs(args: any[], config: ServiceOperationConfig): any {\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n const data = config.relationFieldsHandling\n ? handleRelationFieldsInBody(\n args[0] as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n )\n : args[0];\n return deepmerge({ data }, args[1] || {});\n\n case \"findMany\":\n return deepmerge({ where: args[0] }, args[1] || {});\n\n case \"findById\":\n return deepmerge({ where: { id: args[0] } }, args[1] || {});\n\n case \"findOne\":\n return deepmerge({ where: args[0] }, args[1] || {});\n\n case \"updateOne\":\n const updateData = config.relationFieldsHandling\n ? handleRelationFieldsInBody(\n args[1] as Record<string, any>,\n this.relationFields\n )\n : args[1];\n return deepmerge({ where: args[0], data: updateData }, args[2] || {});\n\n case \"updateMany\":\n const firstMerge = deepmerge({ data: args[1] }, args[2] || {});\n return deepmerge({ where: args[0] }, firstMerge);\n\n case \"deleteOne\":\n case \"deleteMany\":\n return { where: args[0] };\n\n case \"count\":\n return { where: args[0] };\n\n default:\n return {};\n }\n }\n\n private async executeTransactionLogic(\n args: any[],\n config: ServiceOperationConfig,\n prisma: any\n ): Promise<any> {\n if (config.operationType === \"batchUpdate\") {\n const dataArray = args[0];\n const queryOptions = args[1];\n\n return await prisma.$transaction(async (tx: any) => {\n const updatePromises = dataArray.map(async (data: any) => {\n let processedData = data;\n if (this.shouldHashPassword(data)) {\n processedData = await this.processPasswordHashing(data);\n }\n\n const finalPrismaQueryParams = handleRelationFieldsInBody(\n {\n batchedData: {\n ...processedData,\n apiAction: \"update\",\n },\n } as Record<string, any>,\n {\n singular: [\n {\n ...prismaSchemaParser.getField({\n type: pascalCase(this.modelName),\n })!,\n name: \"batchedData\",\n },\n ],\n list: [],\n }\n );\n\n return await (tx[this.modelName] as T).update(\n deepmerge(\n finalPrismaQueryParams.batchedData?.update,\n queryOptions || {}\n ) as { where: any; data: any }\n );\n });\n\n return await Promise.all(updatePromises);\n });\n }\n\n if (config.operationType === \"batchDelete\") {\n const batchFilters = args[0];\n\n return await prisma.$transaction(async (tx: any) => {\n const deletePromises = batchFilters.map(async (filters: any) => {\n const filtersWithRelationFieldsHandled = handleRelationFieldsInBody(\n filters as Record<string, any>,\n this.relationFields\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\n throw new Error(`Unknown transaction operation: ${config.operationType}`);\n }\n\n private shouldHashPassword(data: any): boolean {\n return kebabCase(this.modelName) === \"user\" && data?.password;\n }\n\n private async processPasswordHashing(data: any): Promise<any> {\n if (Array.isArray(data)) {\n const processedArray = [];\n for (let i = 0; i < data.length; i++) {\n const curr = data[i];\n if (\n \"password\" in curr &&\n !authService.isPasswordHashed(curr.password!)\n ) {\n processedArray[i] = {\n ...curr,\n password: await authService.hashPassword(curr.password!),\n };\n } else {\n processedArray[i] = curr;\n }\n }\n return processedArray;\n } else {\n if (data.password && !authService.isPasswordHashed(data.password)) {\n return {\n ...data,\n password: await authService.hashPassword(data.password),\n };\n }\n }\n return data;\n }\n\n async createOne<TOptions extends CreateOneOptions<T>>(\n data: CreateOneData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateOneResult<T>> {\n return this.executeOperation({\n operationType: \"createOne\",\n prismaMethod: \"create\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n })(data, queryOptions, context);\n }\n\n async createMany<TOptions extends CreateManyOptions<T>>(\n data: CreateManyData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateManyResult<T>> {\n return this.executeOperation({\n operationType: \"createMany\",\n prismaMethod: \"createMany\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n customPrismaLogic: async (args, prisma, _, serviceContext) => {\n const data = args[0];\n const queryOptions = args[1];\n const dataWithRelationFieldsHandled: any[] = [];\n\n if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n let curr = data[i];\n if (\"password\" in curr && serviceContext.modelName === \"user\") {\n if (!authService.isPasswordHashed(curr.password!)) {\n curr = {\n ...curr,\n password: await authService.hashPassword(curr.password!),\n };\n }\n }\n dataWithRelationFieldsHandled[i] = handleRelationFieldsInBody(\n curr as Record<string, any>,\n serviceContext.relationFields,\n [\"delete\", \"disconnect\", \"update\"]\n );\n }\n }\n\n return await (prisma[serviceContext.modelName] as T).createMany(\n deepmerge(\n { data: dataWithRelationFieldsHandled },\n queryOptions || {}\n ) as { data: any }\n );\n },\n })(data, queryOptions, context);\n }\n\n async count(\n filters?: CountFilters<T>,\n context?: ServiceBaseContext\n ): Promise<number> {\n return this.executeOperation({\n operationType: \"count\",\n prismaMethod: \"count\",\n returnsFallback: 0,\n })(filters, context);\n }\n\n async findMany<TOptions extends FindManyOptions<T>>(\n filters?: FindManyFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindManyResult<T, TOptions>> {\n return this.executeOperation({\n operationType: \"findMany\",\n prismaMethod: \"findMany\",\n returnsFallback: [],\n })(filters, queryOptions, context);\n }\n\n async findById<TOptions extends FindByIdOptions<T>>(\n id: string | number,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindByIdResult<T>> {\n return this.executeOperation({\n operationType: \"findById\",\n prismaMethod: \"findUnique\",\n returnsFallback: undefined,\n })(id, queryOptions, context);\n }\n\n async findOne<TOptions extends FindOneOptions<T>>(\n filters: FindOneFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindOneResult<T>> {\n return this.executeOperation({\n operationType: \"findOne\",\n prismaMethod: \"findFirst\",\n returnsFallback: undefined,\n customPrismaLogic: async (args, prisma, _, serviceContext) => {\n const filters = args[0];\n const queryOptions = args[1];\n\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 return await (prisma[serviceContext.modelName] as T).findUnique(\n deepmerge({ where: filters }, queryOptions || {})\n );\n } else {\n return await (prisma[serviceContext.modelName] as T).findFirst(\n deepmerge({ where: filters }, queryOptions || {})\n );\n }\n },\n })(filters, queryOptions, context);\n }\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 return this.executeOperation({\n operationType: \"updateOne\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(filters, data, queryOptions, context);\n }\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 return this.executeOperation({\n operationType: \"updateMany\",\n prismaMethod: \"updateMany\",\n requiresPasswordHashing: true,\n returnsFallback: undefined,\n customPrismaLogic: async (args, prisma, _, serviceContext) => {\n const filters = args[0];\n const data = args[1];\n const queryOptions = args[2];\n\n let processedData = data;\n if (serviceContext.modelName === \"user\" && data?.password) {\n if (!authService.isPasswordHashed(data.password)) {\n processedData = {\n ...data,\n password: await authService.hashPassword(data.password),\n };\n }\n }\n\n const firstMerge = deepmerge(\n { data: processedData },\n queryOptions || {}\n );\n return await (prisma[serviceContext.modelName] as T).updateMany(\n deepmerge({ where: filters }, firstMerge) as {\n where: any;\n data: any;\n }\n );\n },\n })(filters, data, queryOptions, context);\n }\n\n async deleteOne(\n filters: DeleteOneFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteOneResult<T>> {\n return this.executeOperation({\n operationType: \"deleteOne\",\n prismaMethod: \"delete\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n async deleteMany(\n filters: DeleteManyFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteManyResult<T>> {\n return this.executeOperation({\n operationType: \"deleteMany\",\n prismaMethod: \"deleteMany\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n async batchUpdate<TOptions extends UpdateOneOptions<T>>(\n dataArray: UpdateOneData<T>[],\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<Array<UpdateOneResult<T>>> {\n return this.executeTransactionOperation({\n operationType: \"batchUpdate\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n returnsFallback: undefined,\n })(dataArray, queryOptions, context);\n }\n\n async batchDelete(\n batchFilters: Array<DeleteOneFilters<T>>,\n context?: ServiceBaseContext\n ): Promise<Array<DeleteOneResult<T>>> {\n return this.executeTransactionOperation({\n operationType: \"batchDelete\",\n prismaMethod: \"delete\",\n returnsFallback: undefined,\n })(batchFilters, context);\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 {\n camelCase,\n kebabCase,\n pascalCase,\n} 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\nexport interface ServiceOperationHooks {\n beforeOperation?: (params: any) => void | Promise<void>;\n afterOperation?: (result: any, params: any) => void | Promise<void>;\n beforePrisma?: (prismaArgs: any, params: any) => any | Promise<any>;\n afterPrisma?: (result: any, params: any) => any | Promise<any>;\n}\n\ninterface ServiceOperationConfig {\n operationType: string;\n prismaMethod: string;\n requiresPasswordHashing?: boolean;\n relationFieldsHandling?: string[];\n returnsFallback?: any;\n customPrismaLogic?: (\n args: any[],\n prisma: any,\n config: ServiceOperationConfig,\n context: BaseService<any>\n ) => Promise<any>;\n hooks?: ServiceOperationHooks;\n}\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 modelName: string;\n relationFields: ModelGroupRelationFields;\n prisma: any;\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 private executeOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n const context = args[args.length - 1] as ServiceBaseContext;\n\n try {\n let argsWithRelationFieldsHandled =\n await this.processRelationFieldsInBody(args, config);\n let prismaFinalArgs = await this.handlePasswordHashing(\n argsWithRelationFieldsHandled,\n config\n );\n\n await this.executeHooks(\n \"before\",\n config.operationType,\n this.buildHookParams(argsWithRelationFieldsHandled, config),\n context\n );\n\n if (config.hooks?.beforeOperation)\n await config.hooks.beforeOperation(\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n\n if (config.hooks?.beforePrisma) {\n argsWithRelationFieldsHandled = await config.hooks.beforePrisma(\n argsWithRelationFieldsHandled,\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n }\n\n const prisma = getPrismaInstance();\n let result: any;\n\n if (config.customPrismaLogic) {\n result = await config.customPrismaLogic(\n argsWithRelationFieldsHandled,\n prisma,\n config,\n this\n );\n } else {\n const prismaArgs = this.buildPrismaArgs(prismaFinalArgs, config);\n result = await (prisma[this.modelName] as T)[\n config.prismaMethod as keyof T\n ](prismaArgs);\n }\n\n if (config.hooks?.afterPrisma) {\n result = await config.hooks.afterPrisma(\n result,\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n }\n\n await this.executeHooks(\n \"after\",\n config.operationType,\n {\n ...this.buildHookParams(argsWithRelationFieldsHandled, config),\n result,\n },\n context\n );\n\n if (config.hooks?.afterOperation) {\n await config.hooks.afterOperation(\n result,\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n }\n\n return result;\n } catch (err: any) {\n await this.executeHooks(\n \"error\",\n config.operationType,\n { ...this.buildHookParams(args, config), error: err },\n context\n );\n if (context?.throwOnError !== false) throw err;\n return config.returnsFallback;\n }\n };\n };\n\n private executeTransactionOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n const context = args[args.length - 1] as ServiceBaseContext;\n\n try {\n let argsWithRelationFieldsHandled =\n await this.processRelationFieldsInBody(args, config);\n let prismaFinalArgs = await this.handlePasswordHashing(\n argsWithRelationFieldsHandled,\n config\n );\n\n await this.executeHooks(\n \"before\",\n config.operationType,\n this.buildTransactionHookParams(\n argsWithRelationFieldsHandled,\n config\n ),\n context\n );\n\n const prisma = getPrismaInstance();\n const results = await this.executeTransactionLogic(\n prismaFinalArgs,\n config,\n prisma\n );\n\n await this.executeHooks(\n \"after\",\n config.operationType,\n {\n ...this.buildTransactionHookParams(\n argsWithRelationFieldsHandled,\n config\n ),\n results,\n },\n context\n );\n return results;\n } catch (err: any) {\n await this.executeHooks(\n \"error\",\n config.operationType,\n { ...this.buildTransactionHookParams(args, config), error: err },\n context\n );\n if (context?.throwOnError !== false) throw err;\n return config.returnsFallback;\n }\n };\n };\n\n private async executeHooks(\n hookType: \"before\" | \"after\" | \"error\",\n operationType: string,\n params: any,\n context?: ServiceBaseContext\n ): Promise<void> {\n const serviceHooks = getModuleComponents(this.modelName)?.hooks;\n if (!serviceHooks) return;\n\n const skipCondition =\n context?.skip === hookType ||\n context?.skip === \"all\" ||\n (Array.isArray(context?.skip) && context.skip.includes(hookType));\n\n if (skipCondition) return;\n\n const hookName = `${hookType === \"error\" ? \"on\" : hookType}${operationType.charAt(0).toUpperCase()}${operationType.slice(1)}${hookType === \"error\" ? \"Error\" : \"\"}`;\n const hook = serviceHooks[hookName as keyof typeof serviceHooks];\n\n if (hook) await serviceHooksManager.handleHook(hook, params);\n }\n\n private buildHookParams(args: any[], config: ServiceOperationConfig): any {\n const context = args[args.length - 1];\n\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return { data: args[0], queryOptions: args[1], context };\n case \"findMany\":\n return { filters: args[0], queryOptions: args[1], context };\n case \"findById\":\n return { id: args[0], queryOptions: args[1], context };\n case \"findOne\":\n return { filters: args[0], queryOptions: args[1], context };\n case \"updateOne\":\n return {\n filters: args[0],\n data: args[1],\n queryOptions: args[2],\n context,\n };\n case \"updateMany\":\n return {\n filters: args[0],\n data: args[1],\n queryOptions: args[2],\n context,\n };\n case \"deleteOne\":\n return { filters: args[0], context };\n case \"deleteMany\":\n return { filters: args[0], context };\n case \"count\":\n return { filters: args[0], context };\n default:\n return { context };\n }\n }\n\n private buildTransactionHookParams(\n args: any[],\n config: ServiceOperationConfig\n ): any {\n const context = args[args.length - 1];\n\n switch (config.operationType) {\n case \"batchUpdate\":\n return { data: args[0], queryOptions: args[1], context };\n case \"batchDelete\":\n return { batchFilters: args[0], context };\n default:\n return { context };\n }\n }\n\n private async handlePasswordHashing(\n args: any[],\n config: ServiceOperationConfig\n ): Promise<any[]> {\n let processedArgs = [...args];\n\n if (config.requiresPasswordHashing) {\n const dataIndex = config.operationType.includes(\"update\") ? 1 : 0;\n const data = processedArgs[dataIndex];\n\n if (Array.isArray(data)) {\n for (const i in data) {\n if (this.shouldHashPassword(data[i]))\n processedArgs[dataIndex][i] = await this.processPasswordHashing(\n data[i]\n );\n }\n } else if (this.shouldHashPassword(data)) {\n processedArgs[dataIndex] = await this.processPasswordHashing(data);\n }\n }\n\n return processedArgs;\n }\n\n private async processRelationFieldsInBody(\n args: any[],\n config: ServiceOperationConfig\n ): Promise<any[]> {\n let processedArgs = [...args];\n\n if (config.relationFieldsHandling) {\n const dataIndex = config.operationType.includes(\"update\") ? 1 : 0;\n\n if (config.operationType === \"batchUpdate\") {\n const dataArray = processedArgs[0];\n if (Array.isArray(dataArray)) {\n processedArgs[0] = dataArray.map((data) =>\n handleRelationFieldsInBody(\n data as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n )\n );\n }\n } else if (config.operationType === \"batchDelete\") {\n const batchFilters = processedArgs[0];\n if (Array.isArray(batchFilters)) {\n processedArgs[0] = batchFilters.map((filters) =>\n handleRelationFieldsInBody(\n filters as Record<string, any>,\n this.relationFields\n )\n );\n }\n } else if (config.operationType === \"createMany\") {\n const data = processedArgs[dataIndex];\n if (Array.isArray(data)) {\n processedArgs[dataIndex] = data.map((item) =>\n handleRelationFieldsInBody(\n item as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n )\n );\n }\n } else {\n const data = processedArgs[dataIndex];\n if (data) {\n processedArgs[dataIndex] = handleRelationFieldsInBody(\n data as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n );\n }\n }\n }\n\n return processedArgs;\n }\n\n private buildPrismaArgs(args: any[], config: ServiceOperationConfig): any {\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return deepmerge({ data: args[0] }, args[1] || {});\n\n case \"findMany\":\n return deepmerge({ where: args[0] }, args[1] || {});\n\n case \"findById\":\n return deepmerge({ where: { id: args[0] } }, args[1] || {});\n\n case \"findOne\":\n return deepmerge({ where: args[0] }, args[1] || {});\n\n case \"updateOne\":\n return deepmerge({ where: args[0], data: args[1] }, args[2] || {});\n\n case \"updateMany\":\n const firstMerge = deepmerge({ data: args[1] }, args[2] || {});\n return deepmerge({ where: args[0] }, firstMerge);\n\n case \"deleteOne\":\n case \"deleteMany\":\n return { where: args[0] };\n\n case \"count\":\n return { where: args[0] };\n\n default:\n return {};\n }\n }\n\n private async executeTransactionLogic(\n args: any[],\n config: ServiceOperationConfig,\n prisma: any\n ): Promise<any> {\n if (config.operationType === \"batchUpdate\") {\n const dataArray = args[0];\n const queryOptions = args[1];\n\n return await prisma.$transaction(async (tx: any) => {\n const updatePromises = dataArray.map(async (data: any) => {\n let processedData = data;\n if (this.shouldHashPassword(data)) {\n processedData = await this.processPasswordHashing(data);\n }\n\n const finalPrismaQueryParams = handleRelationFieldsInBody(\n {\n batchedData: {\n ...processedData,\n apiAction: \"update\",\n },\n } as Record<string, any>,\n {\n singular: [\n {\n ...prismaSchemaParser.getField({\n type: pascalCase(this.modelName),\n })!,\n name: \"batchedData\",\n },\n ],\n list: [],\n }\n );\n\n return await (tx[this.modelName] as T).update(\n deepmerge(\n finalPrismaQueryParams.batchedData?.update,\n queryOptions || {}\n ) as { where: any; data: any }\n );\n });\n\n return await Promise.all(updatePromises);\n });\n }\n\n if (config.operationType === \"batchDelete\") {\n const batchFilters = args[0];\n\n return await prisma.$transaction(async (tx: any) => {\n const deletePromises = batchFilters.map(async (filters: any) => {\n return await (tx[this.modelName] as T).delete({\n where: filters,\n });\n });\n\n return await Promise.all(deletePromises);\n });\n }\n\n throw new Error(`Unknown transaction operation: ${config.operationType}`);\n }\n\n private shouldHashPassword(data: any): boolean {\n return kebabCase(this.modelName) === \"user\" && data?.password;\n }\n\n private async processPasswordHashing(data: any): Promise<any> {\n if (Array.isArray(data)) {\n const processedArray = [];\n for (let i = 0; i < data.length; i++) {\n const curr = data[i];\n if (\n \"password\" in curr &&\n !authService.isPasswordHashed(curr.password!)\n ) {\n processedArray[i] = {\n ...curr,\n password: await authService.hashPassword(curr.password!),\n };\n } else {\n processedArray[i] = curr;\n }\n }\n return processedArray;\n } else {\n if (data.password && !authService.isPasswordHashed(data.password)) {\n return {\n ...data,\n password: await authService.hashPassword(data.password),\n };\n }\n }\n return data;\n }\n\n async createOne<TOptions extends CreateOneOptions<T>>(\n data: CreateOneData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateOneResult<T>> {\n return this.executeOperation({\n operationType: \"createOne\",\n prismaMethod: \"create\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n })(data, queryOptions, context);\n }\n\n async createMany<TOptions extends CreateManyOptions<T>>(\n data: CreateManyData<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<CreateManyResult<T>> {\n return this.executeOperation({\n operationType: \"createMany\",\n prismaMethod: \"createMany\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n })(data, queryOptions, context);\n }\n\n async count(\n filters?: CountFilters<T>,\n context?: ServiceBaseContext\n ): Promise<number> {\n return this.executeOperation({\n operationType: \"count\",\n prismaMethod: \"count\",\n returnsFallback: 0,\n })(filters, context);\n }\n\n async findMany<TOptions extends FindManyOptions<T>>(\n filters?: FindManyFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindManyResult<T, TOptions>> {\n return this.executeOperation({\n operationType: \"findMany\",\n prismaMethod: \"findMany\",\n returnsFallback: [],\n })(filters, queryOptions, context);\n }\n\n async findById<TOptions extends FindByIdOptions<T>>(\n id: string | number,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindByIdResult<T>> {\n return this.executeOperation({\n operationType: \"findById\",\n prismaMethod: \"findUnique\",\n returnsFallback: undefined,\n })(id, queryOptions, context);\n }\n\n async findOne<TOptions extends FindOneOptions<T>>(\n filters: FindOneFilters<T>,\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<FindOneResult<T>> {\n return this.executeOperation({\n operationType: \"findOne\",\n prismaMethod: \"findFirst\",\n returnsFallback: undefined,\n customPrismaLogic: async (args, prisma, _, serviceContext) => {\n const filters = args[0];\n const queryOptions = args[1];\n\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 return await (prisma[serviceContext.modelName] as T).findUnique(\n deepmerge({ where: filters }, queryOptions || {})\n );\n } else {\n return await (prisma[serviceContext.modelName] as T).findFirst(\n deepmerge({ where: filters }, queryOptions || {})\n );\n }\n },\n })(filters, queryOptions, context);\n }\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 return this.executeOperation({\n operationType: \"updateOne\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(filters, data, queryOptions, context);\n }\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 return this.executeOperation({\n operationType: \"updateMany\",\n prismaMethod: \"updateMany\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(filters, data, queryOptions, context);\n }\n\n async deleteOne(\n filters: DeleteOneFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteOneResult<T>> {\n return this.executeOperation({\n operationType: \"deleteOne\",\n prismaMethod: \"delete\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n async deleteMany(\n filters: DeleteManyFilters<T>,\n context?: ServiceBaseContext\n ): Promise<DeleteManyResult<T>> {\n return this.executeOperation({\n operationType: \"deleteMany\",\n prismaMethod: \"deleteMany\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n async batchUpdate<TOptions extends UpdateOneOptions<T>>(\n dataArray: UpdateOneData<T>[],\n queryOptions?: TOptions,\n context?: ServiceBaseContext\n ): Promise<Array<UpdateOneResult<T>>> {\n return this.executeTransactionOperation({\n operationType: \"batchUpdate\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(dataArray, queryOptions, context);\n }\n\n async batchDelete(\n batchFilters: Array<DeleteOneFilters<T>>,\n context?: ServiceBaseContext\n ): Promise<Array<DeleteOneResult<T>>> {\n return this.executeTransactionOperation({\n operationType: \"batchDelete\",\n prismaMethod: \"delete\",\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(batchFilters, context);\n }\n}\n"]}
|
|
@@ -53,7 +53,7 @@ class FileUploadController {
|
|
|
53
53
|
let data;
|
|
54
54
|
if (req.files && Array.isArray(req.files) && req.files.length > 0) {
|
|
55
55
|
if (fileType === "images") {
|
|
56
|
-
data = await Promise.all(req.files.map((file) => (0, file_upload_helpers_1.processImage)(req, file.path, options)));
|
|
56
|
+
data = await Promise.all(req.files.map((file) => (0, file_upload_helpers_1.processImage)(req, next, file.path, options)));
|
|
57
57
|
}
|
|
58
58
|
else {
|
|
59
59
|
data = await Promise.all(req.files.map((file) => (0, file_upload_helpers_1.processFile)(req, file.path)));
|
|
@@ -62,7 +62,7 @@ class FileUploadController {
|
|
|
62
62
|
}
|
|
63
63
|
else if (req.file) {
|
|
64
64
|
if (fileType === "images") {
|
|
65
|
-
data = await (0, file_upload_helpers_1.processImage)(req, req.file.path, options);
|
|
65
|
+
data = await (0, file_upload_helpers_1.processImage)(req, next, req.file.path, options);
|
|
66
66
|
}
|
|
67
67
|
else {
|
|
68
68
|
data = await (0, file_upload_helpers_1.processFile)(req, req.file.path);
|
|
@@ -197,7 +197,7 @@ class FileUploadController {
|
|
|
197
197
|
let data;
|
|
198
198
|
if (req.files && Array.isArray(req.files) && req.files.length > 0) {
|
|
199
199
|
if (fileType === "images") {
|
|
200
|
-
data = await Promise.all(req.files.map((file) => (0, file_upload_helpers_1.processImage)(req, file.path, options)));
|
|
200
|
+
data = await Promise.all(req.files.map((file) => (0, file_upload_helpers_1.processImage)(req, next, file.path, options)));
|
|
201
201
|
}
|
|
202
202
|
else {
|
|
203
203
|
data = await Promise.all(req.files.map((file) => (0, file_upload_helpers_1.processFile)(req, file.path)));
|
|
@@ -206,7 +206,7 @@ class FileUploadController {
|
|
|
206
206
|
}
|
|
207
207
|
else if (req.file) {
|
|
208
208
|
if (fileType === "images") {
|
|
209
|
-
data = await (0, file_upload_helpers_1.processImage)(req, req.file.path, options);
|
|
209
|
+
data = await (0, file_upload_helpers_1.processImage)(req, next, req.file.path, options);
|
|
210
210
|
}
|
|
211
211
|
else {
|
|
212
212
|
data = await (0, file_upload_helpers_1.processFile)(req, req.file.path);
|