arkos 1.3.3-canary.2 → 1.3.4-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.
Files changed (194) hide show
  1. package/README.md +4 -2
  2. package/dist/cjs/app.js +45 -7
  3. package/dist/cjs/app.js.map +1 -1
  4. package/dist/cjs/exports/controllers/index.js +36 -5
  5. package/dist/cjs/exports/controllers/index.js.map +1 -1
  6. package/dist/cjs/modules/auth/auth.controller.js +18 -0
  7. package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
  8. package/dist/cjs/modules/auth/auth.router.js +2 -0
  9. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  10. package/dist/cjs/modules/auth/auth.service.js +3 -0
  11. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  12. package/dist/cjs/modules/auth/utils/services/auth-action.service.js +4 -0
  13. package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +1 -1
  14. package/dist/cjs/modules/base/base.controller.js +235 -130
  15. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  16. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  17. package/dist/cjs/modules/base/base.service.js +345 -447
  18. package/dist/cjs/modules/base/base.service.js.map +1 -1
  19. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +31 -15
  20. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  21. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +5 -8
  22. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  23. package/dist/cjs/modules/base/utils/router-validator.js +1 -4
  24. package/dist/cjs/modules/base/utils/router-validator.js.map +1 -1
  25. package/dist/cjs/modules/base/utils/service-hooks-manager.js.map +1 -1
  26. package/dist/cjs/modules/debugger/debugger.service.js +86 -0
  27. package/dist/cjs/modules/debugger/debugger.service.js.map +1 -0
  28. package/dist/cjs/modules/debugger/utils/loaded-components-logger.js +55 -0
  29. package/dist/cjs/modules/debugger/utils/loaded-components-logger.js.map +1 -0
  30. package/dist/cjs/modules/file-upload/file-upload.controller.js +6 -0
  31. package/dist/cjs/modules/file-upload/file-upload.controller.js.map +1 -1
  32. package/dist/cjs/modules/file-upload/file-upload.router.js +3 -1
  33. package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
  34. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +11 -13
  35. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
  36. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +2 -1
  37. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
  38. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +0 -1
  39. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
  40. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -1
  41. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +3 -3
  42. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
  43. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +2 -1
  44. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
  45. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
  46. package/dist/cjs/server.js +5 -0
  47. package/dist/cjs/server.js.map +1 -1
  48. package/dist/cjs/types/arkos-config.js.map +1 -1
  49. package/dist/cjs/types/index.js.map +1 -1
  50. package/dist/cjs/utils/cli/build.js +1 -1
  51. package/dist/cjs/utils/cli/build.js.map +1 -1
  52. package/dist/cjs/utils/cli/generate.js +13 -2
  53. package/dist/cjs/utils/cli/generate.js.map +1 -1
  54. package/dist/cjs/utils/cli/index.js +8 -8
  55. package/dist/cjs/utils/cli/index.js.map +1 -1
  56. package/dist/cjs/utils/cli/prisma-generate.js +1 -1
  57. package/dist/cjs/utils/cli/prisma-generate.js.map +1 -1
  58. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
  59. package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js +5 -5
  60. package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -1
  61. package/dist/cjs/utils/cli/utils/template-generator/templates/controller-template.js +30 -11
  62. package/dist/cjs/utils/cli/utils/template-generator/templates/controller-template.js.map +1 -1
  63. package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js +2 -2
  64. package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -1
  65. package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js +17 -19
  66. package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
  67. package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js +5 -7
  68. package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -1
  69. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +7 -12
  70. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  71. package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js +33 -11
  72. package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
  73. package/dist/cjs/utils/dynamic-loader.js +11 -2
  74. package/dist/cjs/utils/dynamic-loader.js.map +1 -1
  75. package/dist/cjs/utils/features/api.features.js +12 -13
  76. package/dist/cjs/utils/features/api.features.js.map +1 -1
  77. package/dist/cjs/utils/helpers/deepmerge.helper.js.map +1 -1
  78. package/dist/cjs/utils/helpers/fs.helpers.js +9 -3
  79. package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
  80. package/dist/cjs/utils/helpers/prisma.helpers.js +1 -5
  81. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  82. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +24 -10
  83. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  84. package/dist/cjs/utils/prisma/prisma-schema-parser.js +24 -5
  85. package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -1
  86. package/dist/cjs/utils/prisma/types.js.map +1 -1
  87. package/dist/cjs/utils/sheu.js +11 -0
  88. package/dist/cjs/utils/sheu.js.map +1 -1
  89. package/dist/esm/app.js +12 -7
  90. package/dist/esm/app.js.map +1 -1
  91. package/dist/esm/exports/controllers/index.js +2 -2
  92. package/dist/esm/exports/controllers/index.js.map +1 -1
  93. package/dist/esm/modules/auth/auth.controller.js +18 -0
  94. package/dist/esm/modules/auth/auth.controller.js.map +1 -1
  95. package/dist/esm/modules/auth/auth.router.js +3 -1
  96. package/dist/esm/modules/auth/auth.router.js.map +1 -1
  97. package/dist/esm/modules/auth/auth.service.js +3 -0
  98. package/dist/esm/modules/auth/auth.service.js.map +1 -1
  99. package/dist/esm/modules/auth/utils/services/auth-action.service.js +4 -0
  100. package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
  101. package/dist/esm/modules/base/base.controller.js +235 -130
  102. package/dist/esm/modules/base/base.controller.js.map +1 -1
  103. package/dist/esm/modules/base/base.middlewares.js.map +1 -1
  104. package/dist/esm/modules/base/base.service.js +346 -448
  105. package/dist/esm/modules/base/base.service.js.map +1 -1
  106. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +30 -15
  107. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  108. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +5 -8
  109. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  110. package/dist/esm/modules/base/utils/router-validator.js +1 -4
  111. package/dist/esm/modules/base/utils/router-validator.js.map +1 -1
  112. package/dist/esm/modules/base/utils/service-hooks-manager.js.map +1 -1
  113. package/dist/esm/modules/debugger/debugger.service.js +81 -0
  114. package/dist/esm/modules/debugger/debugger.service.js.map +1 -0
  115. package/dist/esm/modules/debugger/utils/loaded-components-logger.js +50 -0
  116. package/dist/esm/modules/debugger/utils/loaded-components-logger.js.map +1 -0
  117. package/dist/esm/modules/file-upload/file-upload.controller.js +5 -1
  118. package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
  119. package/dist/esm/modules/file-upload/file-upload.router.js +3 -1
  120. package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
  121. package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +11 -13
  122. package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
  123. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +2 -1
  124. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
  125. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +0 -1
  126. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
  127. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +2 -2
  128. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -1
  129. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +3 -3
  130. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
  131. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +2 -1
  132. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
  133. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
  134. package/dist/esm/server.js +5 -0
  135. package/dist/esm/server.js.map +1 -1
  136. package/dist/esm/types/arkos-config.js.map +1 -1
  137. package/dist/esm/types/index.js.map +1 -1
  138. package/dist/esm/utils/cli/build.js +1 -1
  139. package/dist/esm/utils/cli/build.js.map +1 -1
  140. package/dist/esm/utils/cli/generate.js +13 -2
  141. package/dist/esm/utils/cli/generate.js.map +1 -1
  142. package/dist/esm/utils/cli/index.js +8 -8
  143. package/dist/esm/utils/cli/index.js.map +1 -1
  144. package/dist/esm/utils/cli/prisma-generate.js +1 -1
  145. package/dist/esm/utils/cli/prisma-generate.js.map +1 -1
  146. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  147. package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js +5 -5
  148. package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -1
  149. package/dist/esm/utils/cli/utils/template-generator/templates/controller-template.js +30 -11
  150. package/dist/esm/utils/cli/utils/template-generator/templates/controller-template.js.map +1 -1
  151. package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js +2 -2
  152. package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -1
  153. package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js +17 -19
  154. package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
  155. package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js +5 -7
  156. package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -1
  157. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +7 -9
  158. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  159. package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js +33 -11
  160. package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
  161. package/dist/esm/utils/dynamic-loader.js +11 -2
  162. package/dist/esm/utils/dynamic-loader.js.map +1 -1
  163. package/dist/esm/utils/features/api.features.js +12 -13
  164. package/dist/esm/utils/features/api.features.js.map +1 -1
  165. package/dist/esm/utils/helpers/deepmerge.helper.js.map +1 -1
  166. package/dist/esm/utils/helpers/fs.helpers.js +9 -3
  167. package/dist/esm/utils/helpers/fs.helpers.js.map +1 -1
  168. package/dist/esm/utils/helpers/prisma.helpers.js +1 -5
  169. package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
  170. package/dist/esm/utils/prisma/prisma-json-schema-generator.js +24 -10
  171. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  172. package/dist/esm/utils/prisma/prisma-schema-parser.js +24 -5
  173. package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
  174. package/dist/esm/utils/prisma/types.js.map +1 -1
  175. package/dist/esm/utils/sheu.js +11 -0
  176. package/dist/esm/utils/sheu.js.map +1 -1
  177. package/dist/types/exports/controllers/index.d.ts +2 -2
  178. package/dist/types/modules/auth/utils/services/auth-action.service.d.ts +1 -1
  179. package/dist/types/modules/base/base.controller.d.ts +18 -0
  180. package/dist/types/modules/base/base.service.d.ts +18 -0
  181. package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +3 -1
  182. package/dist/types/modules/base/utils/service-hooks-manager.d.ts +1 -1
  183. package/dist/types/modules/debugger/debugger.service.d.ts +15 -0
  184. package/dist/types/modules/debugger/utils/loaded-components-logger.d.ts +9 -0
  185. package/dist/types/modules/file-upload/file-upload.controller.d.ts +1 -1
  186. package/dist/types/types/arkos-config.d.ts +14 -0
  187. package/dist/types/types/index.d.ts +16 -9
  188. package/dist/types/utils/cli/generate.d.ts +2 -0
  189. package/dist/types/utils/dynamic-loader.d.ts +33 -13
  190. package/dist/types/utils/features/api.features.d.ts +1 -1
  191. package/dist/types/utils/prisma/prisma-schema-parser.d.ts +1 -0
  192. package/dist/types/utils/prisma/types.d.ts +2 -1
  193. package/dist/types/utils/sheu.d.ts +8 -0
  194. package/package.json +3 -3
@@ -1,4 +1,4 @@
1
- import { camelCase, kebabCase } from "../../utils/helpers/change-case.helpers.js";
1
+ import { camelCase, kebabCase, pascalCase, } from "../../utils/helpers/change-case.helpers.js";
2
2
  import { getModuleComponents } from "../../utils/dynamic-loader.js";
3
3
  import deepmerge from "../../utils/helpers/deepmerge.helper.js";
4
4
  import { handleRelationFieldsInBody, } from "./utils/helpers/base.service.helpers.js";
@@ -8,6 +8,61 @@ import serviceHooksManager from "./utils/service-hooks-manager.js";
8
8
  import prismaSchemaParser from "../../utils/prisma/prisma-schema-parser.js";
9
9
  export class BaseService {
10
10
  constructor(modelName) {
11
+ this.executeOperation = (config) => {
12
+ return async (...args) => {
13
+ const context = args[args.length - 1];
14
+ try {
15
+ await this.executeHooks("before", config.operationType, this.buildHookParams(args, config), context);
16
+ if (config.hooks?.beforeOperation)
17
+ await config.hooks.beforeOperation(this.buildHookParams(args, config));
18
+ let processedArgs = await this.processArguments(args, config);
19
+ if (config.hooks?.beforePrisma) {
20
+ processedArgs = await config.hooks.beforePrisma(processedArgs, this.buildHookParams(args, config));
21
+ }
22
+ const prisma = getPrismaInstance();
23
+ let result;
24
+ if (config.customPrismaLogic) {
25
+ result = await config.customPrismaLogic(processedArgs, prisma, config, this);
26
+ }
27
+ else {
28
+ const prismaArgs = this.buildPrismaArgs(processedArgs, config);
29
+ result = await prisma[this.modelName][config.prismaMethod](prismaArgs);
30
+ }
31
+ if (config.hooks?.afterPrisma) {
32
+ result = await config.hooks.afterPrisma(result, this.buildHookParams(args, config));
33
+ }
34
+ await this.executeHooks("after", config.operationType, { ...this.buildHookParams(args, config), result }, context);
35
+ if (config.hooks?.afterOperation) {
36
+ await config.hooks.afterOperation(result, this.buildHookParams(args, config));
37
+ }
38
+ return result;
39
+ }
40
+ catch (err) {
41
+ await this.executeHooks("error", config.operationType, { ...this.buildHookParams(args, config), error: err }, context);
42
+ if (context?.throwOnError !== false)
43
+ throw err;
44
+ return config.returnsFallback;
45
+ }
46
+ };
47
+ };
48
+ this.executeTransactionOperation = (config) => {
49
+ return async (...args) => {
50
+ const context = args[args.length - 1];
51
+ try {
52
+ await this.executeHooks("before", config.operationType, this.buildTransactionHookParams(args, config), context);
53
+ const prisma = getPrismaInstance();
54
+ const results = await this.executeTransactionLogic(args, config, prisma);
55
+ await this.executeHooks("after", config.operationType, { ...this.buildTransactionHookParams(args, config), results }, context);
56
+ return results;
57
+ }
58
+ catch (err) {
59
+ await this.executeHooks("error", config.operationType, { ...this.buildTransactionHookParams(args, config), error: err }, context);
60
+ if (context?.throwOnError !== false)
61
+ throw err;
62
+ return config.returnsFallback;
63
+ }
64
+ };
65
+ };
11
66
  this.modelName = camelCase(modelName);
12
67
  const modelFields = prismaSchemaParser.getModelRelations(modelName);
13
68
  this.relationFields = {
@@ -16,485 +71,328 @@ export class BaseService {
16
71
  list: modelFields?.filter((field) => field.isRelation && field.isArray) || [],
17
72
  };
18
73
  }
19
- async createOne(data, queryOptions, context) {
74
+ async executeHooks(hookType, operationType, params, context) {
20
75
  const serviceHooks = getModuleComponents(this.modelName)?.hooks;
21
- try {
22
- if (serviceHooks?.beforeCreateOne &&
23
- context?.skip !== "before" &&
24
- context?.skip !== "all" &&
25
- !context?.skip?.includes("before"))
26
- await serviceHooksManager.handleHook(serviceHooks.beforeCreateOne, {
27
- data,
28
- queryOptions,
76
+ if (!serviceHooks)
77
+ return;
78
+ const skipCondition = context?.skip === hookType ||
79
+ context?.skip === "all" ||
80
+ (Array.isArray(context?.skip) && context.skip.includes(hookType));
81
+ if (skipCondition)
82
+ return;
83
+ const hookName = `${hookType === "error" ? "on" : hookType}${operationType.charAt(0).toUpperCase()}${operationType.slice(1)}${hookType === "error" ? "Error" : ""}`;
84
+ const hook = serviceHooks[hookName];
85
+ if (hook && typeof hook === "function") {
86
+ await serviceHooksManager.handleHook(hook, params);
87
+ }
88
+ }
89
+ buildHookParams(args, config) {
90
+ const context = args[args.length - 1];
91
+ switch (config.operationType) {
92
+ case "createOne":
93
+ case "createMany":
94
+ return { data: args[0], queryOptions: args[1], context };
95
+ case "findMany":
96
+ return { filters: args[0], queryOptions: args[1], context };
97
+ case "findById":
98
+ return { id: args[0], queryOptions: args[1], context };
99
+ case "findOne":
100
+ return { filters: args[0], queryOptions: args[1], context };
101
+ case "updateOne":
102
+ return {
103
+ filters: args[0],
104
+ data: args[1],
105
+ queryOptions: args[2],
29
106
  context,
30
- });
31
- if (kebabCase(this.modelName) === "user" && data.password)
32
- if (!authService.isPasswordHashed(data.password))
33
- data.password = await authService.hashPassword(data.password);
34
- const prisma = getPrismaInstance();
35
- const dataWithRelationFieldsHandled = handleRelationFieldsInBody(data, {
36
- ...this.relationFields,
37
- }, ["delete", "disconnect", "update"]);
38
- const result = await prisma[this.modelName].create(deepmerge({
39
- data: dataWithRelationFieldsHandled,
40
- }, queryOptions || {}));
41
- if (serviceHooks?.afterCreateOne &&
42
- context?.skip !== "after" &&
43
- context?.skip !== "all" &&
44
- !context?.skip?.includes("after"))
45
- await serviceHooksManager.handleHook(serviceHooks.afterCreateOne, {
46
- result,
47
- data,
48
- queryOptions,
107
+ };
108
+ case "updateMany":
109
+ return {
110
+ filters: args[0],
111
+ data: args[1],
112
+ queryOptions: args[2],
49
113
  context,
50
- });
51
- return result;
114
+ };
115
+ case "deleteOne":
116
+ return { filters: args[0], context };
117
+ case "deleteMany":
118
+ return { filters: args[0], context };
119
+ case "count":
120
+ return { filters: args[0], context };
121
+ default:
122
+ return { context };
52
123
  }
53
- catch (err) {
54
- if (serviceHooks?.onCreateOneError &&
55
- context?.skip !== "error" &&
56
- context?.skip !== "all" &&
57
- !context?.skip?.includes("error"))
58
- await serviceHooksManager.handleHook(serviceHooks.onCreateOneError, {
59
- error: err,
60
- data,
61
- queryOptions,
62
- context,
63
- });
64
- if (context?.throwOnError !== false)
65
- throw err;
66
- return undefined;
124
+ }
125
+ buildTransactionHookParams(args, config) {
126
+ const context = args[args.length - 1];
127
+ switch (config.operationType) {
128
+ case "batchUpdate":
129
+ return { data: args[0], queryOptions: args[1], context };
130
+ case "batchDelete":
131
+ return { batchFilters: args[0], context };
132
+ default:
133
+ return { context };
67
134
  }
68
135
  }
69
- async createMany(data, queryOptions, context) {
70
- const serviceHooks = getModuleComponents(this.modelName)?.hooks;
71
- try {
72
- if (serviceHooks?.beforeCreateMany &&
73
- context?.skip !== "before" &&
74
- context?.skip !== "all" &&
75
- !context?.skip?.includes("before")) {
76
- await serviceHooksManager.handleHook(serviceHooks.beforeCreateMany, {
77
- data,
78
- queryOptions,
79
- context,
80
- });
81
- }
82
- const prisma = getPrismaInstance();
83
- const dataWithRelationFieldsHandled = [];
84
- if (Array.isArray(data)) {
85
- for (let i = 0; i < data.length; i++) {
86
- const curr = data[i];
87
- if ("password" in curr && this.modelName === "user") {
88
- if (!authService.isPasswordHashed(curr.password)) {
89
- data[i].password = await authService.hashPassword(curr?.password);
90
- }
91
- }
92
- dataWithRelationFieldsHandled[i] = handleRelationFieldsInBody(data[i], { ...this.relationFields }, ["delete", "disconnect", "update"]);
93
- }
136
+ async processArguments(args, config) {
137
+ let processedArgs = [...args];
138
+ if (config.requiresPasswordHashing) {
139
+ const dataIndex = config.operationType.includes("update") &&
140
+ config.operationType !== "updateMany"
141
+ ? 1
142
+ : 0;
143
+ const data = processedArgs[dataIndex];
144
+ if (this.shouldHashPassword(data)) {
145
+ processedArgs[dataIndex] = await this.processPasswordHashing(data);
94
146
  }
95
- const result = await prisma[this.modelName].createMany(deepmerge({ data: dataWithRelationFieldsHandled }, queryOptions || {}));
96
- if (serviceHooks?.afterCreateMany &&
97
- context?.skip !== "after" &&
98
- context?.skip !== "all" &&
99
- !context?.skip?.includes("after"))
100
- await serviceHooksManager.handleHook(serviceHooks.afterCreateMany, {
101
- result,
102
- data,
103
- queryOptions,
104
- context,
105
- });
106
- return result;
107
147
  }
108
- catch (err) {
109
- if (serviceHooks?.onCreateManyError &&
110
- context?.skip !== "error" &&
111
- context?.skip !== "all" &&
112
- !context?.skip?.includes("error"))
113
- await serviceHooksManager.handleHook(serviceHooks.onCreateManyError, {
114
- error: err,
115
- data,
116
- queryOptions,
117
- context,
118
- });
119
- if (context?.throwOnError !== false)
120
- throw err;
121
- return undefined;
148
+ return processedArgs;
149
+ }
150
+ buildPrismaArgs(args, config) {
151
+ switch (config.operationType) {
152
+ case "createOne":
153
+ case "createMany":
154
+ const data = config.relationFieldsHandling
155
+ ? handleRelationFieldsInBody(args[0], this.relationFields, config.relationFieldsHandling)
156
+ : args[0];
157
+ return deepmerge({ data }, args[1] || {});
158
+ case "findMany":
159
+ return deepmerge({ where: args[0] }, args[1] || {});
160
+ case "findById":
161
+ return deepmerge({ where: { id: args[0] } }, args[1] || {});
162
+ case "findOne":
163
+ return deepmerge({ where: args[0] }, args[1] || {});
164
+ case "updateOne":
165
+ const updateData = config.relationFieldsHandling
166
+ ? handleRelationFieldsInBody(args[1], this.relationFields)
167
+ : args[1];
168
+ return deepmerge({ where: args[0], data: updateData }, args[2] || {});
169
+ case "updateMany":
170
+ const firstMerge = deepmerge({ data: args[1] }, args[2] || {});
171
+ return deepmerge({ where: args[0] }, firstMerge);
172
+ case "deleteOne":
173
+ case "deleteMany":
174
+ return { where: args[0] };
175
+ case "count":
176
+ return { where: args[0] };
177
+ default:
178
+ return {};
122
179
  }
123
180
  }
124
- async count(filters, context) {
125
- const serviceHooks = getModuleComponents(this.modelName)?.hooks;
126
- try {
127
- if (serviceHooks?.beforeCount &&
128
- context?.skip !== "before" &&
129
- context?.skip !== "all" &&
130
- !context?.skip?.includes("before")) {
131
- await serviceHooksManager.handleHook(serviceHooks.beforeCount, {
132
- filters,
133
- context,
181
+ async executeTransactionLogic(args, config, prisma) {
182
+ if (config.operationType === "batchUpdate") {
183
+ const dataArray = args[0];
184
+ const queryOptions = args[1];
185
+ return await prisma.$transaction(async (tx) => {
186
+ const updatePromises = dataArray.map(async (data) => {
187
+ let processedData = data;
188
+ if (this.shouldHashPassword(data)) {
189
+ processedData = await this.processPasswordHashing(data);
190
+ }
191
+ const finalPrismaQueryParams = handleRelationFieldsInBody({
192
+ batchedData: {
193
+ ...processedData,
194
+ apiAction: "update",
195
+ },
196
+ }, {
197
+ singular: [
198
+ {
199
+ ...prismaSchemaParser.getField({
200
+ type: pascalCase(this.modelName),
201
+ }),
202
+ name: "batchedData",
203
+ },
204
+ ],
205
+ list: [],
206
+ });
207
+ return await tx[this.modelName].update(deepmerge(finalPrismaQueryParams.batchedData?.update, queryOptions || {}));
134
208
  });
135
- }
136
- const prisma = getPrismaInstance();
137
- const result = await prisma[this.modelName].count({
138
- where: filters,
209
+ return await Promise.all(updatePromises);
139
210
  });
140
- if (serviceHooks?.afterCount &&
141
- context?.skip !== "after" &&
142
- context?.skip !== "all" &&
143
- !context?.skip?.includes("after")) {
144
- await serviceHooksManager.handleHook(serviceHooks.afterCount, {
145
- result,
146
- filters,
147
- context,
148
- });
149
- }
150
- return result;
151
211
  }
152
- catch (err) {
153
- if (serviceHooks?.onCountError &&
154
- context?.skip !== "error" &&
155
- context?.skip !== "all" &&
156
- !context?.skip?.includes("error"))
157
- await serviceHooksManager.handleHook(serviceHooks.onCountError, {
158
- error: err,
159
- filters,
160
- context,
212
+ if (config.operationType === "batchDelete") {
213
+ const batchFilters = args[0];
214
+ return await prisma.$transaction(async (tx) => {
215
+ const deletePromises = batchFilters.map(async (filters) => {
216
+ const filtersWithRelationFieldsHandled = handleRelationFieldsInBody(filters, this.relationFields);
217
+ return await tx[this.modelName].delete({
218
+ where: filtersWithRelationFieldsHandled,
219
+ });
161
220
  });
162
- if (context?.throwOnError !== false)
163
- throw err;
164
- return 0;
221
+ return await Promise.all(deletePromises);
222
+ });
165
223
  }
224
+ throw new Error(`Unknown transaction operation: ${config.operationType}`);
166
225
  }
167
- async findMany(filters, queryOptions, context) {
168
- const serviceHooks = getModuleComponents(this.modelName)?.hooks;
169
- try {
170
- if (serviceHooks?.beforeFindMany &&
171
- context?.skip !== "before" &&
172
- context?.skip !== "all" &&
173
- !context?.skip?.includes("before")) {
174
- await serviceHooksManager.handleHook(serviceHooks.beforeFindMany, {
175
- filters,
176
- queryOptions,
177
- context,
178
- });
226
+ shouldHashPassword(data) {
227
+ return kebabCase(this.modelName) === "user" && data?.password;
228
+ }
229
+ async processPasswordHashing(data) {
230
+ if (Array.isArray(data)) {
231
+ const processedArray = [];
232
+ for (let i = 0; i < data.length; i++) {
233
+ const curr = data[i];
234
+ if ("password" in curr &&
235
+ !authService.isPasswordHashed(curr.password)) {
236
+ processedArray[i] = {
237
+ ...curr,
238
+ password: await authService.hashPassword(curr.password),
239
+ };
240
+ }
241
+ else {
242
+ processedArray[i] = curr;
243
+ }
179
244
  }
180
- const prisma = getPrismaInstance();
181
- const result = await prisma[this.modelName].findMany(deepmerge({ where: filters }, queryOptions || {}));
182
- if (serviceHooks?.afterFindMany &&
183
- context?.skip !== "after" &&
184
- context?.skip !== "all" &&
185
- !context?.skip?.includes("after"))
186
- await serviceHooksManager.handleHook(serviceHooks.afterFindMany, {
187
- result,
188
- filters,
189
- queryOptions,
190
- context,
191
- });
192
- return result;
245
+ return processedArray;
193
246
  }
194
- catch (err) {
195
- if (serviceHooks?.onFindManyError &&
196
- context?.skip !== "error" &&
197
- context?.skip !== "all" &&
198
- !context?.skip?.includes("error"))
199
- await serviceHooksManager.handleHook(serviceHooks.onFindManyError, {
200
- error: err,
201
- filters,
202
- queryOptions,
203
- context,
204
- });
205
- if (context?.throwOnError !== false)
206
- throw err;
207
- return [];
247
+ else {
248
+ if (data.password && !authService.isPasswordHashed(data.password)) {
249
+ return {
250
+ ...data,
251
+ password: await authService.hashPassword(data.password),
252
+ };
253
+ }
208
254
  }
255
+ return data;
256
+ }
257
+ async createOne(data, queryOptions, context) {
258
+ return this.executeOperation({
259
+ operationType: "createOne",
260
+ prismaMethod: "create",
261
+ requiresPasswordHashing: true,
262
+ relationFieldsHandling: ["delete", "disconnect", "update"],
263
+ returnsFallback: undefined,
264
+ })(data, queryOptions, context);
265
+ }
266
+ async createMany(data, queryOptions, context) {
267
+ return this.executeOperation({
268
+ operationType: "createMany",
269
+ prismaMethod: "createMany",
270
+ requiresPasswordHashing: true,
271
+ relationFieldsHandling: ["delete", "disconnect", "update"],
272
+ returnsFallback: undefined,
273
+ customPrismaLogic: async (args, prisma, _, serviceContext) => {
274
+ const data = args[0];
275
+ const queryOptions = args[1];
276
+ const dataWithRelationFieldsHandled = [];
277
+ if (Array.isArray(data)) {
278
+ for (let i = 0; i < data.length; i++) {
279
+ let curr = data[i];
280
+ if ("password" in curr && serviceContext.modelName === "user") {
281
+ if (!authService.isPasswordHashed(curr.password)) {
282
+ curr = {
283
+ ...curr,
284
+ password: await authService.hashPassword(curr.password),
285
+ };
286
+ }
287
+ }
288
+ dataWithRelationFieldsHandled[i] = handleRelationFieldsInBody(curr, serviceContext.relationFields, ["delete", "disconnect", "update"]);
289
+ }
290
+ }
291
+ return await prisma[serviceContext.modelName].createMany(deepmerge({ data: dataWithRelationFieldsHandled }, queryOptions || {}));
292
+ },
293
+ })(data, queryOptions, context);
294
+ }
295
+ async count(filters, context) {
296
+ return this.executeOperation({
297
+ operationType: "count",
298
+ prismaMethod: "count",
299
+ returnsFallback: 0,
300
+ })(filters, context);
301
+ }
302
+ async findMany(filters, queryOptions, context) {
303
+ return this.executeOperation({
304
+ operationType: "findMany",
305
+ prismaMethod: "findMany",
306
+ returnsFallback: [],
307
+ })(filters, queryOptions, context);
209
308
  }
210
309
  async findById(id, queryOptions, context) {
211
- const serviceHooks = getModuleComponents(this.modelName)?.hooks;
212
- try {
213
- if (serviceHooks?.beforeFindById &&
214
- context?.skip !== "before" &&
215
- context?.skip !== "all" &&
216
- !context?.skip?.includes("before")) {
217
- await serviceHooksManager.handleHook(serviceHooks.beforeFindById, {
218
- id,
219
- queryOptions,
220
- context,
221
- });
222
- }
223
- const prisma = getPrismaInstance();
224
- const result = await prisma[this.modelName].findUnique(deepmerge({
225
- where: { id },
226
- }, queryOptions || {}));
227
- if (serviceHooks?.afterFindById &&
228
- context?.skip !== "after" &&
229
- context?.skip !== "all" &&
230
- !context?.skip?.includes("after")) {
231
- await serviceHooksManager.handleHook(serviceHooks.afterFindById, {
232
- result,
233
- id,
234
- queryOptions,
235
- context,
236
- });
237
- }
238
- return result;
239
- }
240
- catch (err) {
241
- if (serviceHooks?.onFindByIdError &&
242
- context?.skip !== "error" &&
243
- context?.skip !== "all" &&
244
- !context?.skip?.includes("error"))
245
- await serviceHooksManager.handleHook(serviceHooks.onFindByIdError, {
246
- error: err,
247
- id,
248
- queryOptions,
249
- context,
250
- });
251
- if (context?.throwOnError !== false)
252
- throw err;
253
- return undefined;
254
- }
310
+ return this.executeOperation({
311
+ operationType: "findById",
312
+ prismaMethod: "findUnique",
313
+ returnsFallback: undefined,
314
+ })(id, queryOptions, context);
255
315
  }
256
316
  async findOne(filters, queryOptions, context) {
257
- const serviceHooks = getModuleComponents(this.modelName)?.hooks;
258
- try {
259
- if (serviceHooks?.beforeFindOne &&
260
- context?.skip !== "before" &&
261
- context?.skip !== "all" &&
262
- !context?.skip?.includes("before")) {
263
- await serviceHooksManager.handleHook(serviceHooks.beforeFindOne, {
264
- filters,
265
- queryOptions,
266
- context,
267
- });
268
- }
269
- const prisma = getPrismaInstance();
270
- let result;
271
- if (Object.keys(filters).length === 1 &&
272
- "id" in filters &&
273
- filters.id !== "me")
274
- result = await prisma[this.modelName].findUnique(deepmerge({
275
- where: filters,
276
- }, queryOptions || {}));
277
- else
278
- result = await prisma[this.modelName].findFirst(deepmerge({
279
- where: filters,
280
- }, queryOptions || {}));
281
- if (serviceHooks?.afterFindOne &&
282
- context?.skip !== "after" &&
283
- context?.skip !== "all" &&
284
- !context?.skip?.includes("after"))
285
- await serviceHooksManager.handleHook(serviceHooks.afterFindOne, {
286
- result,
287
- filters,
288
- queryOptions,
289
- context,
290
- });
291
- return result;
292
- }
293
- catch (err) {
294
- if (serviceHooks?.onFindOneError &&
295
- context?.skip !== "error" &&
296
- context?.skip !== "all" &&
297
- !context?.skip?.includes("error"))
298
- await serviceHooksManager.handleHook(serviceHooks.onFindOneError, {
299
- error: err,
300
- filters,
301
- queryOptions,
302
- context,
303
- });
304
- if (context?.throwOnError !== false)
305
- throw err;
306
- return undefined;
307
- }
317
+ return this.executeOperation({
318
+ operationType: "findOne",
319
+ prismaMethod: "findFirst",
320
+ returnsFallback: undefined,
321
+ customPrismaLogic: async (args, prisma, _, serviceContext) => {
322
+ const filters = args[0];
323
+ const queryOptions = args[1];
324
+ if (Object.keys(filters).length === 1 &&
325
+ "id" in filters &&
326
+ filters.id !== "me") {
327
+ return await prisma[serviceContext.modelName].findUnique(deepmerge({ where: filters }, queryOptions || {}));
328
+ }
329
+ else {
330
+ return await prisma[serviceContext.modelName].findFirst(deepmerge({ where: filters }, queryOptions || {}));
331
+ }
332
+ },
333
+ })(filters, queryOptions, context);
308
334
  }
309
335
  async updateOne(filters, data, queryOptions, context) {
310
- const serviceHooks = getModuleComponents(this.modelName)?.hooks;
311
- try {
312
- if (serviceHooks?.beforeUpdateOne &&
313
- context?.skip !== "before" &&
314
- context?.skip !== "all" &&
315
- !context?.skip?.includes("before"))
316
- await serviceHooksManager.handleHook(serviceHooks.beforeUpdateOne, {
317
- filters,
318
- data,
319
- queryOptions,
320
- context,
321
- });
322
- if (kebabCase(this.modelName) === "user" && data?.password) {
323
- if (!authService.isPasswordHashed(data.password))
324
- data.password = await authService.hashPassword(data?.password);
325
- }
326
- const prisma = getPrismaInstance();
327
- const dataWithRelationFieldsHandled = handleRelationFieldsInBody(data, {
328
- ...this.relationFields,
329
- });
330
- const result = await prisma[this.modelName].update(deepmerge({
331
- where: filters,
332
- data: dataWithRelationFieldsHandled,
333
- }, queryOptions || {}));
334
- if (serviceHooks?.afterUpdateOne &&
335
- context?.skip !== "after" &&
336
- context?.skip !== "all" &&
337
- !context?.skip?.includes("after"))
338
- await serviceHooksManager.handleHook(serviceHooks.afterUpdateOne, {
339
- result,
340
- filters,
341
- data,
342
- queryOptions,
343
- context,
344
- });
345
- return result;
346
- }
347
- catch (err) {
348
- if (serviceHooks?.onUpdateOneError &&
349
- context?.skip !== "error" &&
350
- context?.skip !== "all" &&
351
- !context?.skip?.includes("error"))
352
- await serviceHooksManager.handleHook(serviceHooks.onUpdateOneError, {
353
- error: err,
354
- filters,
355
- data,
356
- queryOptions,
357
- context,
358
- });
359
- if (context?.throwOnError !== false)
360
- throw err;
361
- return undefined;
362
- }
336
+ return this.executeOperation({
337
+ operationType: "updateOne",
338
+ prismaMethod: "update",
339
+ requiresPasswordHashing: true,
340
+ relationFieldsHandling: [],
341
+ returnsFallback: undefined,
342
+ })(filters, data, queryOptions, context);
363
343
  }
364
344
  async updateMany(filters, data, queryOptions, context) {
365
- const serviceHooks = getModuleComponents(this.modelName)?.hooks;
366
- try {
367
- if (serviceHooks?.beforeUpdateMany &&
368
- context?.skip !== "before" &&
369
- context?.skip !== "all" &&
370
- !context?.skip?.includes("before"))
371
- await serviceHooksManager.handleHook(serviceHooks.beforeUpdateMany, {
372
- filters,
373
- data,
374
- queryOptions,
375
- context,
376
- });
377
- const prisma = getPrismaInstance();
378
- if (this.modelName === "user" &&
379
- "password" in data &&
380
- data?.password) {
381
- if (!authService.isPasswordHashed(data.password)) {
382
- data.password = await authService.hashPassword(data?.password);
345
+ return this.executeOperation({
346
+ operationType: "updateMany",
347
+ prismaMethod: "updateMany",
348
+ requiresPasswordHashing: true,
349
+ returnsFallback: undefined,
350
+ customPrismaLogic: async (args, prisma, _, serviceContext) => {
351
+ const filters = args[0];
352
+ const data = args[1];
353
+ const queryOptions = args[2];
354
+ let processedData = data;
355
+ if (serviceContext.modelName === "user" && data?.password) {
356
+ if (!authService.isPasswordHashed(data.password)) {
357
+ processedData = {
358
+ ...data,
359
+ password: await authService.hashPassword(data.password),
360
+ };
361
+ }
383
362
  }
384
- }
385
- const firstMerge = deepmerge({ data }, queryOptions || {});
386
- const result = await prisma[this.modelName].updateMany(deepmerge({ where: filters }, firstMerge));
387
- if (serviceHooks?.afterUpdateMany &&
388
- context?.skip !== "after" &&
389
- context?.skip !== "all" &&
390
- !context?.skip?.includes("after"))
391
- await serviceHooksManager.handleHook(serviceHooks.afterUpdateMany, {
392
- result,
393
- filters,
394
- data,
395
- queryOptions,
396
- context,
397
- });
398
- return result;
399
- }
400
- catch (err) {
401
- if (serviceHooks?.onUpdateManyError &&
402
- context?.skip !== "error" &&
403
- context?.skip !== "all" &&
404
- !context?.skip?.includes("error"))
405
- await serviceHooksManager.handleHook(serviceHooks.onUpdateManyError, {
406
- error: err,
407
- filters,
408
- data,
409
- queryOptions,
410
- context,
411
- });
412
- if (context?.throwOnError !== false)
413
- throw err;
414
- return undefined;
415
- }
363
+ const firstMerge = deepmerge({ data: processedData }, queryOptions || {});
364
+ return await prisma[serviceContext.modelName].updateMany(deepmerge({ where: filters }, firstMerge));
365
+ },
366
+ })(filters, data, queryOptions, context);
416
367
  }
417
368
  async deleteOne(filters, context) {
418
- const serviceHooks = getModuleComponents(this.modelName)?.hooks;
419
- try {
420
- if (serviceHooks?.beforeDeleteOne &&
421
- context?.skip !== "before" &&
422
- context?.skip !== "all" &&
423
- !context?.skip?.includes("before"))
424
- await serviceHooksManager.handleHook(serviceHooks.beforeDeleteOne, {
425
- filters,
426
- context,
427
- });
428
- const prisma = getPrismaInstance();
429
- const result = await prisma[this.modelName].delete({
430
- where: filters,
431
- });
432
- if (serviceHooks?.afterDeleteOne &&
433
- context?.skip !== "after" &&
434
- context?.skip !== "all" &&
435
- !context?.skip?.includes("after"))
436
- await serviceHooksManager.handleHook(serviceHooks.afterDeleteOne, {
437
- result,
438
- filters,
439
- context,
440
- });
441
- return result;
442
- }
443
- catch (err) {
444
- if (serviceHooks?.onDeleteOneError &&
445
- context?.skip !== "error" &&
446
- context?.skip !== "all" &&
447
- !context?.skip?.includes("error"))
448
- await serviceHooksManager.handleHook(serviceHooks.onDeleteOneError, {
449
- error: err,
450
- filters,
451
- context,
452
- });
453
- if (context?.throwOnError !== false)
454
- throw err;
455
- return undefined;
456
- }
369
+ return this.executeOperation({
370
+ operationType: "deleteOne",
371
+ prismaMethod: "delete",
372
+ returnsFallback: undefined,
373
+ })(filters, context);
457
374
  }
458
375
  async deleteMany(filters, context) {
459
- const serviceHooks = getModuleComponents(this.modelName)?.hooks;
460
- try {
461
- if (serviceHooks?.beforeDeleteMany &&
462
- context?.skip !== "before" &&
463
- context?.skip !== "all" &&
464
- !context?.skip?.includes("before"))
465
- await serviceHooksManager.handleHook(serviceHooks.beforeDeleteMany, {
466
- filters,
467
- context,
468
- });
469
- const prisma = getPrismaInstance();
470
- const result = await prisma[this.modelName].deleteMany({
471
- where: filters,
472
- });
473
- if (serviceHooks?.afterDeleteMany &&
474
- context?.skip !== "after" &&
475
- context?.skip !== "all" &&
476
- !context?.skip?.includes("after"))
477
- await serviceHooksManager.handleHook(serviceHooks.afterDeleteMany, {
478
- result,
479
- filters,
480
- context,
481
- });
482
- return result;
483
- }
484
- catch (err) {
485
- if (serviceHooks?.onDeleteManyError &&
486
- context?.skip !== "error" &&
487
- context?.skip !== "all" &&
488
- !context?.skip?.includes("error"))
489
- await serviceHooksManager.handleHook(serviceHooks.onDeleteManyError, {
490
- error: err,
491
- filters,
492
- context,
493
- });
494
- if (context?.throwOnError !== false)
495
- throw err;
496
- return undefined;
497
- }
376
+ return this.executeOperation({
377
+ operationType: "deleteMany",
378
+ prismaMethod: "deleteMany",
379
+ returnsFallback: undefined,
380
+ })(filters, context);
381
+ }
382
+ async batchUpdate(dataArray, queryOptions, context) {
383
+ return this.executeTransactionOperation({
384
+ operationType: "batchUpdate",
385
+ prismaMethod: "update",
386
+ requiresPasswordHashing: true,
387
+ returnsFallback: undefined,
388
+ })(dataArray, queryOptions, context);
389
+ }
390
+ async batchDelete(batchFilters, context) {
391
+ return this.executeTransactionOperation({
392
+ operationType: "batchDelete",
393
+ prismaMethod: "delete",
394
+ returnsFallback: undefined,
395
+ })(batchFilters, context);
498
396
  }
499
397
  }
500
398
  //# sourceMappingURL=base.service.js.map