arkos 1.3.8-canary.7 → 1.3.8-canary.8

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.
@@ -18,28 +18,32 @@ class BaseService {
18
18
  return async (...args) => {
19
19
  const context = args[args.length - 1];
20
20
  try {
21
- await this.executeHooks("before", config.operationType, this.buildHookParams(args, config), context);
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(args, config));
24
- let processedArgs = await this.processArguments(args, config);
25
+ await config.hooks.beforeOperation(this.buildHookParams(argsWithRelationFieldsHandled, config));
25
26
  if (config.hooks?.beforePrisma) {
26
- processedArgs = await config.hooks.beforePrisma(processedArgs, this.buildHookParams(args, config));
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(processedArgs, prisma, config, this);
32
+ result = await config.customPrismaLogic(argsWithRelationFieldsHandled, prisma, config, this);
32
33
  }
33
34
  else {
34
- const prismaArgs = this.buildPrismaArgs(processedArgs, config);
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(args, config));
39
+ result = await config.hooks.afterPrisma(result, this.buildHookParams(argsWithRelationFieldsHandled, config));
39
40
  }
40
- await this.executeHooks("after", config.operationType, { ...this.buildHookParams(args, config), result }, context);
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(args, config));
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
- await this.executeHooks("before", config.operationType, this.buildTransactionHookParams(args, config), context);
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(args, config, prisma);
61
- await this.executeHooks("after", config.operationType, { ...this.buildTransactionHookParams(args, config), results }, context);
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) {
@@ -138,28 +147,59 @@ class BaseService {
138
147
  return { context };
139
148
  }
140
149
  }
141
- async processArguments(args, config) {
150
+ async handlePasswordHashing(args, config) {
142
151
  let processedArgs = [...args];
143
152
  if (config.requiresPasswordHashing) {
144
- const dataIndex = config.operationType.includes("update") &&
145
- config.operationType !== "updateMany"
146
- ? 1
147
- : 0;
153
+ const dataIndex = config.operationType.includes("update") ? 1 : 0;
148
154
  const data = processedArgs[dataIndex];
149
- if (this.shouldHashPassword(data)) {
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)) {
150
162
  processedArgs[dataIndex] = await this.processPasswordHashing(data);
151
163
  }
152
164
  }
153
165
  return processedArgs;
154
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
+ }
155
198
  buildPrismaArgs(args, config) {
156
199
  switch (config.operationType) {
157
200
  case "createOne":
158
201
  case "createMany":
159
- const data = config.relationFieldsHandling
160
- ? (0, base_service_helpers_1.handleRelationFieldsInBody)(args[0], this.relationFields, config.relationFieldsHandling)
161
- : args[0];
162
- return (0, deepmerge_helper_1.default)({ data }, args[1] || {});
202
+ return (0, deepmerge_helper_1.default)({ data: args[0] }, args[1] || {});
163
203
  case "findMany":
164
204
  return (0, deepmerge_helper_1.default)({ where: args[0] }, args[1] || {});
165
205
  case "findById":
@@ -167,10 +207,7 @@ class BaseService {
167
207
  case "findOne":
168
208
  return (0, deepmerge_helper_1.default)({ where: args[0] }, args[1] || {});
169
209
  case "updateOne":
170
- const updateData = config.relationFieldsHandling
171
- ? (0, base_service_helpers_1.handleRelationFieldsInBody)(args[1], this.relationFields)
172
- : args[1];
173
- 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] || {});
174
211
  case "updateMany":
175
212
  const firstMerge = (0, deepmerge_helper_1.default)({ data: args[1] }, args[2] || {});
176
213
  return (0, deepmerge_helper_1.default)({ where: args[0] }, firstMerge);
@@ -218,9 +255,8 @@ class BaseService {
218
255
  const batchFilters = args[0];
219
256
  return await prisma.$transaction(async (tx) => {
220
257
  const deletePromises = batchFilters.map(async (filters) => {
221
- const filtersWithRelationFieldsHandled = (0, base_service_helpers_1.handleRelationFieldsInBody)(filters, this.relationFields);
222
258
  return await tx[this.modelName].delete({
223
- where: filtersWithRelationFieldsHandled,
259
+ where: filters,
224
260
  });
225
261
  });
226
262
  return await Promise.all(deletePromises);
@@ -275,26 +311,6 @@ class BaseService {
275
311
  requiresPasswordHashing: true,
276
312
  relationFieldsHandling: ["delete", "disconnect", "update"],
277
313
  returnsFallback: undefined,
278
- customPrismaLogic: async (args, prisma, _, serviceContext) => {
279
- const data = args[0];
280
- const queryOptions = args[1];
281
- const dataWithRelationFieldsHandled = [];
282
- if (Array.isArray(data)) {
283
- for (let i = 0; i < data.length; i++) {
284
- let curr = data[i];
285
- if ("password" in curr && serviceContext.modelName === "user") {
286
- if (!auth_service_1.default.isPasswordHashed(curr.password)) {
287
- curr = {
288
- ...curr,
289
- password: await auth_service_1.default.hashPassword(curr.password),
290
- };
291
- }
292
- }
293
- dataWithRelationFieldsHandled[i] = (0, base_service_helpers_1.handleRelationFieldsInBody)(curr, serviceContext.relationFields, ["delete", "disconnect", "update"]);
294
- }
295
- }
296
- return await prisma[serviceContext.modelName].createMany((0, deepmerge_helper_1.default)({ data: dataWithRelationFieldsHandled }, queryOptions || {}));
297
- },
298
314
  })(data, queryOptions, context);
299
315
  }
300
316
  async count(filters, context) {
@@ -351,23 +367,8 @@ class BaseService {
351
367
  operationType: "updateMany",
352
368
  prismaMethod: "updateMany",
353
369
  requiresPasswordHashing: true,
370
+ relationFieldsHandling: [],
354
371
  returnsFallback: undefined,
355
- customPrismaLogic: async (args, prisma, _, serviceContext) => {
356
- const filters = args[0];
357
- const data = args[1];
358
- const queryOptions = args[2];
359
- let processedData = data;
360
- if (serviceContext.modelName === "user" && data?.password) {
361
- if (!auth_service_1.default.isPasswordHashed(data.password)) {
362
- processedData = {
363
- ...data,
364
- password: await auth_service_1.default.hashPassword(data.password),
365
- };
366
- }
367
- }
368
- const firstMerge = (0, deepmerge_helper_1.default)({ data: processedData }, queryOptions || {});
369
- return await prisma[serviceContext.modelName].updateMany((0, deepmerge_helper_1.default)({ where: filters }, firstMerge));
370
- },
371
372
  })(filters, data, queryOptions, context);
372
373
  }
373
374
  async deleteOne(filters, context) {
@@ -389,6 +390,7 @@ class BaseService {
389
390
  operationType: "batchUpdate",
390
391
  prismaMethod: "update",
391
392
  requiresPasswordHashing: true,
393
+ relationFieldsHandling: [],
392
394
  returnsFallback: undefined,
393
395
  })(dataArray, queryOptions, context);
394
396
  }
@@ -396,6 +398,7 @@ class BaseService {
396
398
  return this.executeTransactionOperation({
397
399
  operationType: "batchDelete",
398
400
  prismaMethod: "delete",
401
+ relationFieldsHandling: [],
399
402
  returnsFallback: undefined,
400
403
  })(batchFilters, context);
401
404
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../src/modules/base/base.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\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) 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 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"]}
@@ -19,6 +19,6 @@ function killServerChildProcess() {
19
19
  (0, start_1.killProductionServerChildProcess)();
20
20
  }
21
21
  function getVersion() {
22
- return "1.3.8-canary.7";
22
+ return "1.3.8-canary.8";
23
23
  }
24
24
  //# sourceMappingURL=cli.helpers.js.map
@@ -8,34 +8,15 @@ function generateServiceTemplate(options) {
8
8
  const isTypeScript = ext === "ts";
9
9
  if (!modelName)
10
10
  throw new Error("Module name is required for service template");
11
- const camelName = modelName.camel.toLowerCase();
12
- let serviceType;
13
- let serviceName;
14
- let serviceImport;
15
- if (camelName === "fileupload") {
16
- serviceType = "fileUpload";
17
- serviceName = "FileUploadService";
18
- serviceImport = imports?.fileUploadService || "arkos/services";
19
- }
20
- else if (camelName === "auth") {
21
- serviceType = "auth";
22
- serviceName = "AuthService";
23
- serviceImport = imports?.authService || "arkos/services";
24
- }
25
- else if (camelName === "email") {
26
- serviceType = "email";
27
- serviceName = "EmailService";
28
- serviceImport = imports?.emailService || "arkos/services";
29
- }
30
- else {
31
- serviceType = "base";
32
- serviceName = "BaseService";
33
- serviceImport = imports?.baseService || "arkos/services";
34
- }
11
+ let serviceType = ["auth", "fileUpload", "email"].includes(modelName.camel)
12
+ ? modelName.camel
13
+ : "base";
14
+ let serviceName = (serviceType !== "base" ? `Arkos${modelName.pascal}` : "Base") + "Service";
15
+ let serviceImport = imports?.[`${serviceType}Service`] || "arkos/services";
35
16
  const prismaImport = isTypeScript && serviceType === "base"
36
17
  ? `import { Prisma } from "@prisma/client";\n`
37
18
  : "";
38
- const serviceClassImport = `import { ${serviceName} } from "${serviceImport}";`;
19
+ const serviceClassImport = `import { ${serviceName.startsWith("Arkos") ? `${serviceName.replace("Arkos", "")} as ${serviceName}` : serviceName} } from "${serviceImport}";`;
39
20
  const typeParameter = isTypeScript && serviceType === "base"
40
21
  ? `<Prisma.${modelName.pascal}Delegate>`
41
22
  : "";
@@ -1 +1 @@
1
- {"version":3,"file":"service-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/service-template.ts"],"names":[],"mappings":";;AAGA,0DAmDC;AAtDD,+DAAsE;AAGtE,SAAgB,uBAAuB,CAAC,OAAwB;IAC9D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,GAAG,GAAG,IAAA,iCAAoB,GAAE,CAAC;IACnC,MAAM,YAAY,GAAG,GAAG,KAAK,IAAI,CAAC;IAElC,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,WAAqD,CAAC;IAC1D,IAAI,WAAmB,CAAC;IACxB,IAAI,aAAqB,CAAC;IAE1B,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QAC/B,WAAW,GAAG,YAAY,CAAC;QAC3B,WAAW,GAAG,mBAAmB,CAAC;QAClC,aAAa,GAAG,OAAO,EAAE,iBAAiB,IAAI,gBAAgB,CAAC;IACjE,CAAC;SAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QAChC,WAAW,GAAG,MAAM,CAAC;QACrB,WAAW,GAAG,aAAa,CAAC;QAC5B,aAAa,GAAG,OAAO,EAAE,WAAW,IAAI,gBAAgB,CAAC;IAC3D,CAAC;SAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACjC,WAAW,GAAG,OAAO,CAAC;QACtB,WAAW,GAAG,cAAc,CAAC;QAC7B,aAAa,GAAG,OAAO,EAAE,YAAY,IAAI,gBAAgB,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,MAAM,CAAC;QACrB,WAAW,GAAG,aAAa,CAAC;QAC5B,aAAa,GAAG,OAAO,EAAE,WAAW,IAAI,gBAAgB,CAAC;IAC3D,CAAC;IAED,MAAM,YAAY,GAChB,YAAY,IAAI,WAAW,KAAK,MAAM;QACpC,CAAC,CAAC,4CAA4C;QAC9C,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,kBAAkB,GAAG,YAAY,WAAW,YAAY,aAAa,IAAI,CAAC;IAEhF,MAAM,aAAa,GACjB,YAAY,IAAI,WAAW,KAAK,MAAM;QACpC,CAAC,CAAC,WAAW,SAAS,CAAC,MAAM,WAAW;QACxC,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,GAAG,YAAY,GAAG,kBAAkB;;QAErC,SAAS,CAAC,MAAM,mBAAmB,WAAW,GAAG,aAAa;;QAE9D,SAAS,CAAC,KAAK,iBAAiB,SAAS,CAAC,MAAM,WAAW,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;;iBAEtG,SAAS,CAAC,KAAK;CAC/B,CAAC;AACF,CAAC","sourcesContent":["import { getUserFileExtension } from \"../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../template-generators\";\n\nexport function generateServiceTemplate(options: TemplateOptions): string {\n const { modelName, imports } = options;\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n\n if (!modelName)\n throw new Error(\"Module name is required for service template\");\n\n const camelName = modelName.camel.toLowerCase();\n let serviceType: \"fileUpload\" | \"auth\" | \"email\" | \"base\";\n let serviceName: string;\n let serviceImport: string;\n\n if (camelName === \"fileupload\") {\n serviceType = \"fileUpload\";\n serviceName = \"FileUploadService\";\n serviceImport = imports?.fileUploadService || \"arkos/services\";\n } else if (camelName === \"auth\") {\n serviceType = \"auth\";\n serviceName = \"AuthService\";\n serviceImport = imports?.authService || \"arkos/services\";\n } else if (camelName === \"email\") {\n serviceType = \"email\";\n serviceName = \"EmailService\";\n serviceImport = imports?.emailService || \"arkos/services\";\n } else {\n serviceType = \"base\";\n serviceName = \"BaseService\";\n serviceImport = imports?.baseService || \"arkos/services\";\n }\n\n const prismaImport =\n isTypeScript && serviceType === \"base\"\n ? `import { Prisma } from \"@prisma/client\";\\n`\n : \"\";\n\n const serviceClassImport = `import { ${serviceName} } from \"${serviceImport}\";`;\n\n const typeParameter =\n isTypeScript && serviceType === \"base\"\n ? `<Prisma.${modelName.pascal}Delegate>`\n : \"\";\n\n return `${prismaImport}${serviceClassImport}\n \nclass ${modelName.pascal}Service extends ${serviceName}${typeParameter} {}\n\nconst ${modelName.camel}Service = new ${modelName.pascal}Service(${serviceType === \"base\" ? `\"${modelName.kebab}\"` : \"\"});\n\nexport default ${modelName.camel}Service;\n`;\n}\n"]}
1
+ {"version":3,"file":"service-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/service-template.ts"],"names":[],"mappings":";;AAGA,0DAoCC;AAvCD,+DAAsE;AAGtE,SAAgB,uBAAuB,CAAC,OAAwB;IAC9D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,GAAG,GAAG,IAAA,iCAAoB,GAAE,CAAC;IACnC,MAAM,YAAY,GAAG,GAAG,KAAK,IAAI,CAAC;IAElC,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAElE,IAAI,WAAW,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;QACzE,CAAC,CAAC,SAAS,CAAC,KAAK;QACjB,CAAC,CAAC,MAAM,CAAC;IACX,IAAI,WAAW,GACb,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7E,IAAI,aAAa,GACf,OAAO,EAAE,CAAC,GAAG,WAAW,SAAS,CAAC,IAAI,gBAAgB,CAAC;IAEzD,MAAM,YAAY,GAChB,YAAY,IAAI,WAAW,KAAK,MAAM;QACpC,CAAC,CAAC,4CAA4C;QAC9C,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,kBAAkB,GAAG,YAAY,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,YAAY,aAAa,IAAI,CAAC;IAE5K,MAAM,aAAa,GACjB,YAAY,IAAI,WAAW,KAAK,MAAM;QACpC,CAAC,CAAC,WAAW,SAAS,CAAC,MAAM,WAAW;QACxC,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,GAAG,YAAY,GAAG,kBAAkB;;QAErC,SAAS,CAAC,MAAM,mBAAmB,WAAW,GAAG,aAAa;;QAE9D,SAAS,CAAC,KAAK,iBAAiB,SAAS,CAAC,MAAM,WAAW,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;;iBAEtG,SAAS,CAAC,KAAK;CAC/B,CAAC;AACF,CAAC","sourcesContent":["import { getUserFileExtension } from \"../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../template-generators\";\n\nexport function generateServiceTemplate(options: TemplateOptions): string {\n const { modelName, imports } = options;\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n\n if (!modelName)\n throw new Error(\"Module name is required for service template\");\n\n let serviceType = [\"auth\", \"fileUpload\", \"email\"].includes(modelName.camel)\n ? modelName.camel\n : \"base\";\n let serviceName: string =\n (serviceType !== \"base\" ? `Arkos${modelName.pascal}` : \"Base\") + \"Service\";\n let serviceImport: string =\n imports?.[`${serviceType}Service`] || \"arkos/services\";\n\n const prismaImport =\n isTypeScript && serviceType === \"base\"\n ? `import { Prisma } from \"@prisma/client\";\\n`\n : \"\";\n\n const serviceClassImport = `import { ${serviceName.startsWith(\"Arkos\") ? `${serviceName.replace(\"Arkos\", \"\")} as ${serviceName}` : serviceName} } from \"${serviceImport}\";`;\n\n const typeParameter =\n isTypeScript && serviceType === \"base\"\n ? `<Prisma.${modelName.pascal}Delegate>`\n : \"\";\n\n return `${prismaImport}${serviceClassImport}\n \nclass ${modelName.pascal}Service extends ${serviceName}${typeParameter} {}\n\nconst ${modelName.camel}Service = new ${modelName.pascal}Service(${serviceType === \"base\" ? `\"${modelName.kebab}\"` : \"\"});\n\nexport default ${modelName.camel}Service;\n`;\n}\n"]}
@@ -12,28 +12,32 @@ export class BaseService {
12
12
  return async (...args) => {
13
13
  const context = args[args.length - 1];
14
14
  try {
15
- await this.executeHooks("before", config.operationType, this.buildHookParams(args, config), context);
15
+ let argsWithRelationFieldsHandled = await this.processRelationFieldsInBody(args, config);
16
+ let prismaFinalArgs = await this.handlePasswordHashing(argsWithRelationFieldsHandled, config);
17
+ await this.executeHooks("before", config.operationType, this.buildHookParams(argsWithRelationFieldsHandled, config), context);
16
18
  if (config.hooks?.beforeOperation)
17
- await config.hooks.beforeOperation(this.buildHookParams(args, config));
18
- let processedArgs = await this.processArguments(args, config);
19
+ await config.hooks.beforeOperation(this.buildHookParams(argsWithRelationFieldsHandled, config));
19
20
  if (config.hooks?.beforePrisma) {
20
- processedArgs = await config.hooks.beforePrisma(processedArgs, this.buildHookParams(args, config));
21
+ argsWithRelationFieldsHandled = await config.hooks.beforePrisma(argsWithRelationFieldsHandled, this.buildHookParams(argsWithRelationFieldsHandled, config));
21
22
  }
22
23
  const prisma = getPrismaInstance();
23
24
  let result;
24
25
  if (config.customPrismaLogic) {
25
- result = await config.customPrismaLogic(processedArgs, prisma, config, this);
26
+ result = await config.customPrismaLogic(argsWithRelationFieldsHandled, prisma, config, this);
26
27
  }
27
28
  else {
28
- const prismaArgs = this.buildPrismaArgs(processedArgs, config);
29
+ const prismaArgs = this.buildPrismaArgs(prismaFinalArgs, config);
29
30
  result = await prisma[this.modelName][config.prismaMethod](prismaArgs);
30
31
  }
31
32
  if (config.hooks?.afterPrisma) {
32
- result = await config.hooks.afterPrisma(result, this.buildHookParams(args, config));
33
+ result = await config.hooks.afterPrisma(result, this.buildHookParams(argsWithRelationFieldsHandled, config));
33
34
  }
34
- await this.executeHooks("after", config.operationType, { ...this.buildHookParams(args, config), result }, context);
35
+ await this.executeHooks("after", config.operationType, {
36
+ ...this.buildHookParams(argsWithRelationFieldsHandled, config),
37
+ result,
38
+ }, context);
35
39
  if (config.hooks?.afterOperation) {
36
- await config.hooks.afterOperation(result, this.buildHookParams(args, config));
40
+ await config.hooks.afterOperation(result, this.buildHookParams(argsWithRelationFieldsHandled, config));
37
41
  }
38
42
  return result;
39
43
  }
@@ -49,10 +53,15 @@ export class BaseService {
49
53
  return async (...args) => {
50
54
  const context = args[args.length - 1];
51
55
  try {
52
- await this.executeHooks("before", config.operationType, this.buildTransactionHookParams(args, config), context);
56
+ let argsWithRelationFieldsHandled = await this.processRelationFieldsInBody(args, config);
57
+ let prismaFinalArgs = await this.handlePasswordHashing(argsWithRelationFieldsHandled, config);
58
+ await this.executeHooks("before", config.operationType, this.buildTransactionHookParams(argsWithRelationFieldsHandled, config), context);
53
59
  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);
60
+ const results = await this.executeTransactionLogic(prismaFinalArgs, config, prisma);
61
+ await this.executeHooks("after", config.operationType, {
62
+ ...this.buildTransactionHookParams(argsWithRelationFieldsHandled, config),
63
+ results,
64
+ }, context);
56
65
  return results;
57
66
  }
58
67
  catch (err) {
@@ -132,28 +141,59 @@ export class BaseService {
132
141
  return { context };
133
142
  }
134
143
  }
135
- async processArguments(args, config) {
144
+ async handlePasswordHashing(args, config) {
136
145
  let processedArgs = [...args];
137
146
  if (config.requiresPasswordHashing) {
138
- const dataIndex = config.operationType.includes("update") &&
139
- config.operationType !== "updateMany"
140
- ? 1
141
- : 0;
147
+ const dataIndex = config.operationType.includes("update") ? 1 : 0;
142
148
  const data = processedArgs[dataIndex];
143
- if (this.shouldHashPassword(data)) {
149
+ if (Array.isArray(data)) {
150
+ for (const i in data) {
151
+ if (this.shouldHashPassword(data[i]))
152
+ processedArgs[dataIndex][i] = await this.processPasswordHashing(data[i]);
153
+ }
154
+ }
155
+ else if (this.shouldHashPassword(data)) {
144
156
  processedArgs[dataIndex] = await this.processPasswordHashing(data);
145
157
  }
146
158
  }
147
159
  return processedArgs;
148
160
  }
161
+ async processRelationFieldsInBody(args, config) {
162
+ let processedArgs = [...args];
163
+ if (config.relationFieldsHandling) {
164
+ const dataIndex = config.operationType.includes("update") ? 1 : 0;
165
+ if (config.operationType === "batchUpdate") {
166
+ const dataArray = processedArgs[0];
167
+ if (Array.isArray(dataArray)) {
168
+ processedArgs[0] = dataArray.map((data) => handleRelationFieldsInBody(data, this.relationFields, config.relationFieldsHandling));
169
+ }
170
+ }
171
+ else if (config.operationType === "batchDelete") {
172
+ const batchFilters = processedArgs[0];
173
+ if (Array.isArray(batchFilters)) {
174
+ processedArgs[0] = batchFilters.map((filters) => handleRelationFieldsInBody(filters, this.relationFields));
175
+ }
176
+ }
177
+ else if (config.operationType === "createMany") {
178
+ const data = processedArgs[dataIndex];
179
+ if (Array.isArray(data)) {
180
+ processedArgs[dataIndex] = data.map((item) => handleRelationFieldsInBody(item, this.relationFields, config.relationFieldsHandling));
181
+ }
182
+ }
183
+ else {
184
+ const data = processedArgs[dataIndex];
185
+ if (data) {
186
+ processedArgs[dataIndex] = handleRelationFieldsInBody(data, this.relationFields, config.relationFieldsHandling);
187
+ }
188
+ }
189
+ }
190
+ return processedArgs;
191
+ }
149
192
  buildPrismaArgs(args, config) {
150
193
  switch (config.operationType) {
151
194
  case "createOne":
152
195
  case "createMany":
153
- const data = config.relationFieldsHandling
154
- ? handleRelationFieldsInBody(args[0], this.relationFields, config.relationFieldsHandling)
155
- : args[0];
156
- return deepmerge({ data }, args[1] || {});
196
+ return deepmerge({ data: args[0] }, args[1] || {});
157
197
  case "findMany":
158
198
  return deepmerge({ where: args[0] }, args[1] || {});
159
199
  case "findById":
@@ -161,10 +201,7 @@ export class BaseService {
161
201
  case "findOne":
162
202
  return deepmerge({ where: args[0] }, args[1] || {});
163
203
  case "updateOne":
164
- const updateData = config.relationFieldsHandling
165
- ? handleRelationFieldsInBody(args[1], this.relationFields)
166
- : args[1];
167
- return deepmerge({ where: args[0], data: updateData }, args[2] || {});
204
+ return deepmerge({ where: args[0], data: args[1] }, args[2] || {});
168
205
  case "updateMany":
169
206
  const firstMerge = deepmerge({ data: args[1] }, args[2] || {});
170
207
  return deepmerge({ where: args[0] }, firstMerge);
@@ -212,9 +249,8 @@ export class BaseService {
212
249
  const batchFilters = args[0];
213
250
  return await prisma.$transaction(async (tx) => {
214
251
  const deletePromises = batchFilters.map(async (filters) => {
215
- const filtersWithRelationFieldsHandled = handleRelationFieldsInBody(filters, this.relationFields);
216
252
  return await tx[this.modelName].delete({
217
- where: filtersWithRelationFieldsHandled,
253
+ where: filters,
218
254
  });
219
255
  });
220
256
  return await Promise.all(deletePromises);
@@ -269,26 +305,6 @@ export class BaseService {
269
305
  requiresPasswordHashing: true,
270
306
  relationFieldsHandling: ["delete", "disconnect", "update"],
271
307
  returnsFallback: undefined,
272
- customPrismaLogic: async (args, prisma, _, serviceContext) => {
273
- const data = args[0];
274
- const queryOptions = args[1];
275
- const dataWithRelationFieldsHandled = [];
276
- if (Array.isArray(data)) {
277
- for (let i = 0; i < data.length; i++) {
278
- let curr = data[i];
279
- if ("password" in curr && serviceContext.modelName === "user") {
280
- if (!authService.isPasswordHashed(curr.password)) {
281
- curr = {
282
- ...curr,
283
- password: await authService.hashPassword(curr.password),
284
- };
285
- }
286
- }
287
- dataWithRelationFieldsHandled[i] = handleRelationFieldsInBody(curr, serviceContext.relationFields, ["delete", "disconnect", "update"]);
288
- }
289
- }
290
- return await prisma[serviceContext.modelName].createMany(deepmerge({ data: dataWithRelationFieldsHandled }, queryOptions || {}));
291
- },
292
308
  })(data, queryOptions, context);
293
309
  }
294
310
  async count(filters, context) {
@@ -345,23 +361,8 @@ export class BaseService {
345
361
  operationType: "updateMany",
346
362
  prismaMethod: "updateMany",
347
363
  requiresPasswordHashing: true,
364
+ relationFieldsHandling: [],
348
365
  returnsFallback: undefined,
349
- customPrismaLogic: async (args, prisma, _, serviceContext) => {
350
- const filters = args[0];
351
- const data = args[1];
352
- const queryOptions = args[2];
353
- let processedData = data;
354
- if (serviceContext.modelName === "user" && data?.password) {
355
- if (!authService.isPasswordHashed(data.password)) {
356
- processedData = {
357
- ...data,
358
- password: await authService.hashPassword(data.password),
359
- };
360
- }
361
- }
362
- const firstMerge = deepmerge({ data: processedData }, queryOptions || {});
363
- return await prisma[serviceContext.modelName].updateMany(deepmerge({ where: filters }, firstMerge));
364
- },
365
366
  })(filters, data, queryOptions, context);
366
367
  }
367
368
  async deleteOne(filters, context) {
@@ -383,6 +384,7 @@ export class BaseService {
383
384
  operationType: "batchUpdate",
384
385
  prismaMethod: "update",
385
386
  requiresPasswordHashing: true,
387
+ relationFieldsHandling: [],
386
388
  returnsFallback: undefined,
387
389
  })(dataArray, queryOptions, context);
388
390
  }
@@ -390,6 +392,7 @@ export class BaseService {
390
392
  return this.executeTransactionOperation({
391
393
  operationType: "batchDelete",
392
394
  prismaMethod: "delete",
395
+ relationFieldsHandling: [],
393
396
  returnsFallback: undefined,
394
397
  })(batchFilters, context);
395
398
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../src/modules/base/base.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\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) 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 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"]}
@@ -11,6 +11,6 @@ export function killServerChildProcess() {
11
11
  killProductionServerChildProcess();
12
12
  }
13
13
  export function getVersion() {
14
- return "1.3.8-canary.7";
14
+ return "1.3.8-canary.8";
15
15
  }
16
16
  //# sourceMappingURL=cli.helpers.js.map
@@ -5,34 +5,15 @@ export function generateServiceTemplate(options) {
5
5
  const isTypeScript = ext === "ts";
6
6
  if (!modelName)
7
7
  throw new Error("Module name is required for service template");
8
- const camelName = modelName.camel.toLowerCase();
9
- let serviceType;
10
- let serviceName;
11
- let serviceImport;
12
- if (camelName === "fileupload") {
13
- serviceType = "fileUpload";
14
- serviceName = "FileUploadService";
15
- serviceImport = imports?.fileUploadService || "arkos/services";
16
- }
17
- else if (camelName === "auth") {
18
- serviceType = "auth";
19
- serviceName = "AuthService";
20
- serviceImport = imports?.authService || "arkos/services";
21
- }
22
- else if (camelName === "email") {
23
- serviceType = "email";
24
- serviceName = "EmailService";
25
- serviceImport = imports?.emailService || "arkos/services";
26
- }
27
- else {
28
- serviceType = "base";
29
- serviceName = "BaseService";
30
- serviceImport = imports?.baseService || "arkos/services";
31
- }
8
+ let serviceType = ["auth", "fileUpload", "email"].includes(modelName.camel)
9
+ ? modelName.camel
10
+ : "base";
11
+ let serviceName = (serviceType !== "base" ? `Arkos${modelName.pascal}` : "Base") + "Service";
12
+ let serviceImport = imports?.[`${serviceType}Service`] || "arkos/services";
32
13
  const prismaImport = isTypeScript && serviceType === "base"
33
14
  ? `import { Prisma } from "@prisma/client";\n`
34
15
  : "";
35
- const serviceClassImport = `import { ${serviceName} } from "${serviceImport}";`;
16
+ const serviceClassImport = `import { ${serviceName.startsWith("Arkos") ? `${serviceName.replace("Arkos", "")} as ${serviceName}` : serviceName} } from "${serviceImport}";`;
36
17
  const typeParameter = isTypeScript && serviceType === "base"
37
18
  ? `<Prisma.${modelName.pascal}Delegate>`
38
19
  : "";
@@ -1 +1 @@
1
- {"version":3,"file":"service-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/service-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAGtE,MAAM,UAAU,uBAAuB,CAAC,OAAwB;IAC9D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;IACnC,MAAM,YAAY,GAAG,GAAG,KAAK,IAAI,CAAC;IAElC,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,WAAqD,CAAC;IAC1D,IAAI,WAAmB,CAAC;IACxB,IAAI,aAAqB,CAAC;IAE1B,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QAC/B,WAAW,GAAG,YAAY,CAAC;QAC3B,WAAW,GAAG,mBAAmB,CAAC;QAClC,aAAa,GAAG,OAAO,EAAE,iBAAiB,IAAI,gBAAgB,CAAC;IACjE,CAAC;SAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QAChC,WAAW,GAAG,MAAM,CAAC;QACrB,WAAW,GAAG,aAAa,CAAC;QAC5B,aAAa,GAAG,OAAO,EAAE,WAAW,IAAI,gBAAgB,CAAC;IAC3D,CAAC;SAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACjC,WAAW,GAAG,OAAO,CAAC;QACtB,WAAW,GAAG,cAAc,CAAC;QAC7B,aAAa,GAAG,OAAO,EAAE,YAAY,IAAI,gBAAgB,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,MAAM,CAAC;QACrB,WAAW,GAAG,aAAa,CAAC;QAC5B,aAAa,GAAG,OAAO,EAAE,WAAW,IAAI,gBAAgB,CAAC;IAC3D,CAAC;IAED,MAAM,YAAY,GAChB,YAAY,IAAI,WAAW,KAAK,MAAM;QACpC,CAAC,CAAC,4CAA4C;QAC9C,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,kBAAkB,GAAG,YAAY,WAAW,YAAY,aAAa,IAAI,CAAC;IAEhF,MAAM,aAAa,GACjB,YAAY,IAAI,WAAW,KAAK,MAAM;QACpC,CAAC,CAAC,WAAW,SAAS,CAAC,MAAM,WAAW;QACxC,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,GAAG,YAAY,GAAG,kBAAkB;;QAErC,SAAS,CAAC,MAAM,mBAAmB,WAAW,GAAG,aAAa;;QAE9D,SAAS,CAAC,KAAK,iBAAiB,SAAS,CAAC,MAAM,WAAW,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;;iBAEtG,SAAS,CAAC,KAAK;CAC/B,CAAC;AACF,CAAC","sourcesContent":["import { getUserFileExtension } from \"../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../template-generators\";\n\nexport function generateServiceTemplate(options: TemplateOptions): string {\n const { modelName, imports } = options;\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n\n if (!modelName)\n throw new Error(\"Module name is required for service template\");\n\n const camelName = modelName.camel.toLowerCase();\n let serviceType: \"fileUpload\" | \"auth\" | \"email\" | \"base\";\n let serviceName: string;\n let serviceImport: string;\n\n if (camelName === \"fileupload\") {\n serviceType = \"fileUpload\";\n serviceName = \"FileUploadService\";\n serviceImport = imports?.fileUploadService || \"arkos/services\";\n } else if (camelName === \"auth\") {\n serviceType = \"auth\";\n serviceName = \"AuthService\";\n serviceImport = imports?.authService || \"arkos/services\";\n } else if (camelName === \"email\") {\n serviceType = \"email\";\n serviceName = \"EmailService\";\n serviceImport = imports?.emailService || \"arkos/services\";\n } else {\n serviceType = \"base\";\n serviceName = \"BaseService\";\n serviceImport = imports?.baseService || \"arkos/services\";\n }\n\n const prismaImport =\n isTypeScript && serviceType === \"base\"\n ? `import { Prisma } from \"@prisma/client\";\\n`\n : \"\";\n\n const serviceClassImport = `import { ${serviceName} } from \"${serviceImport}\";`;\n\n const typeParameter =\n isTypeScript && serviceType === \"base\"\n ? `<Prisma.${modelName.pascal}Delegate>`\n : \"\";\n\n return `${prismaImport}${serviceClassImport}\n \nclass ${modelName.pascal}Service extends ${serviceName}${typeParameter} {}\n\nconst ${modelName.camel}Service = new ${modelName.pascal}Service(${serviceType === \"base\" ? `\"${modelName.kebab}\"` : \"\"});\n\nexport default ${modelName.camel}Service;\n`;\n}\n"]}
1
+ {"version":3,"file":"service-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/service-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAGtE,MAAM,UAAU,uBAAuB,CAAC,OAAwB;IAC9D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;IACnC,MAAM,YAAY,GAAG,GAAG,KAAK,IAAI,CAAC;IAElC,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAElE,IAAI,WAAW,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;QACzE,CAAC,CAAC,SAAS,CAAC,KAAK;QACjB,CAAC,CAAC,MAAM,CAAC;IACX,IAAI,WAAW,GACb,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7E,IAAI,aAAa,GACf,OAAO,EAAE,CAAC,GAAG,WAAW,SAAS,CAAC,IAAI,gBAAgB,CAAC;IAEzD,MAAM,YAAY,GAChB,YAAY,IAAI,WAAW,KAAK,MAAM;QACpC,CAAC,CAAC,4CAA4C;QAC9C,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,kBAAkB,GAAG,YAAY,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,YAAY,aAAa,IAAI,CAAC;IAE5K,MAAM,aAAa,GACjB,YAAY,IAAI,WAAW,KAAK,MAAM;QACpC,CAAC,CAAC,WAAW,SAAS,CAAC,MAAM,WAAW;QACxC,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,GAAG,YAAY,GAAG,kBAAkB;;QAErC,SAAS,CAAC,MAAM,mBAAmB,WAAW,GAAG,aAAa;;QAE9D,SAAS,CAAC,KAAK,iBAAiB,SAAS,CAAC,MAAM,WAAW,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;;iBAEtG,SAAS,CAAC,KAAK;CAC/B,CAAC;AACF,CAAC","sourcesContent":["import { getUserFileExtension } from \"../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../template-generators\";\n\nexport function generateServiceTemplate(options: TemplateOptions): string {\n const { modelName, imports } = options;\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n\n if (!modelName)\n throw new Error(\"Module name is required for service template\");\n\n let serviceType = [\"auth\", \"fileUpload\", \"email\"].includes(modelName.camel)\n ? modelName.camel\n : \"base\";\n let serviceName: string =\n (serviceType !== \"base\" ? `Arkos${modelName.pascal}` : \"Base\") + \"Service\";\n let serviceImport: string =\n imports?.[`${serviceType}Service`] || \"arkos/services\";\n\n const prismaImport =\n isTypeScript && serviceType === \"base\"\n ? `import { Prisma } from \"@prisma/client\";\\n`\n : \"\";\n\n const serviceClassImport = `import { ${serviceName.startsWith(\"Arkos\") ? `${serviceName.replace(\"Arkos\", \"\")} as ${serviceName}` : serviceName} } from \"${serviceImport}\";`;\n\n const typeParameter =\n isTypeScript && serviceType === \"base\"\n ? `<Prisma.${modelName.pascal}Delegate>`\n : \"\";\n\n return `${prismaImport}${serviceClassImport}\n \nclass ${modelName.pascal}Service extends ${serviceName}${typeParameter} {}\n\nconst ${modelName.camel}Service = new ${modelName.pascal}Service(${serviceType === \"base\" ? `\"${modelName.kebab}\"` : \"\"});\n\nexport default ${modelName.camel}Service;\n`;\n}\n"]}
@@ -16,7 +16,8 @@ export declare class BaseService<T extends ModelDelegate = any> {
16
16
  private executeHooks;
17
17
  private buildHookParams;
18
18
  private buildTransactionHookParams;
19
- private processArguments;
19
+ private handlePasswordHashing;
20
+ private processRelationFieldsInBody;
20
21
  private buildPrismaArgs;
21
22
  private executeTransactionLogic;
22
23
  private shouldHashPassword;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkos",
3
- "version": "1.3.8-canary.7",
3
+ "version": "1.3.8-canary.8",
4
4
  "description": "The Express & Prisma RESTful Framework",
5
5
  "main": "dist/cjs/exports/index.js",
6
6
  "module": "dist/esm/exports/index.js",