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.
- package/dist/cjs/modules/base/base.service.js +67 -64
- package/dist/cjs/modules/base/base.service.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js +6 -25
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
- package/dist/esm/modules/base/base.service.js +67 -64
- package/dist/esm/modules/base/base.service.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js +6 -25
- package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
- package/dist/types/modules/base/base.service.d.ts +2 -1
- package/package.json +1 -1
|
@@ -18,28 +18,32 @@ class BaseService {
|
|
|
18
18
|
return async (...args) => {
|
|
19
19
|
const context = args[args.length - 1];
|
|
20
20
|
try {
|
|
21
|
-
|
|
21
|
+
let argsWithRelationFieldsHandled = await this.processRelationFieldsInBody(args, config);
|
|
22
|
+
let prismaFinalArgs = await this.handlePasswordHashing(argsWithRelationFieldsHandled, config);
|
|
23
|
+
await this.executeHooks("before", config.operationType, this.buildHookParams(argsWithRelationFieldsHandled, config), context);
|
|
22
24
|
if (config.hooks?.beforeOperation)
|
|
23
|
-
await config.hooks.beforeOperation(this.buildHookParams(
|
|
24
|
-
let processedArgs = await this.processArguments(args, config);
|
|
25
|
+
await config.hooks.beforeOperation(this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
25
26
|
if (config.hooks?.beforePrisma) {
|
|
26
|
-
|
|
27
|
+
argsWithRelationFieldsHandled = await config.hooks.beforePrisma(argsWithRelationFieldsHandled, this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
27
28
|
}
|
|
28
29
|
const prisma = (0, prisma_helpers_1.getPrismaInstance)();
|
|
29
30
|
let result;
|
|
30
31
|
if (config.customPrismaLogic) {
|
|
31
|
-
result = await config.customPrismaLogic(
|
|
32
|
+
result = await config.customPrismaLogic(argsWithRelationFieldsHandled, prisma, config, this);
|
|
32
33
|
}
|
|
33
34
|
else {
|
|
34
|
-
const prismaArgs = this.buildPrismaArgs(
|
|
35
|
+
const prismaArgs = this.buildPrismaArgs(prismaFinalArgs, config);
|
|
35
36
|
result = await prisma[this.modelName][config.prismaMethod](prismaArgs);
|
|
36
37
|
}
|
|
37
38
|
if (config.hooks?.afterPrisma) {
|
|
38
|
-
result = await config.hooks.afterPrisma(result, this.buildHookParams(
|
|
39
|
+
result = await config.hooks.afterPrisma(result, this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
39
40
|
}
|
|
40
|
-
await this.executeHooks("after", config.operationType, {
|
|
41
|
+
await this.executeHooks("after", config.operationType, {
|
|
42
|
+
...this.buildHookParams(argsWithRelationFieldsHandled, config),
|
|
43
|
+
result,
|
|
44
|
+
}, context);
|
|
41
45
|
if (config.hooks?.afterOperation) {
|
|
42
|
-
await config.hooks.afterOperation(result, this.buildHookParams(
|
|
46
|
+
await config.hooks.afterOperation(result, this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
43
47
|
}
|
|
44
48
|
return result;
|
|
45
49
|
}
|
|
@@ -55,10 +59,15 @@ class BaseService {
|
|
|
55
59
|
return async (...args) => {
|
|
56
60
|
const context = args[args.length - 1];
|
|
57
61
|
try {
|
|
58
|
-
|
|
62
|
+
let argsWithRelationFieldsHandled = await this.processRelationFieldsInBody(args, config);
|
|
63
|
+
let prismaFinalArgs = await this.handlePasswordHashing(argsWithRelationFieldsHandled, config);
|
|
64
|
+
await this.executeHooks("before", config.operationType, this.buildTransactionHookParams(argsWithRelationFieldsHandled, config), context);
|
|
59
65
|
const prisma = (0, prisma_helpers_1.getPrismaInstance)();
|
|
60
|
-
const results = await this.executeTransactionLogic(
|
|
61
|
-
await this.executeHooks("after", config.operationType, {
|
|
66
|
+
const results = await this.executeTransactionLogic(prismaFinalArgs, config, prisma);
|
|
67
|
+
await this.executeHooks("after", config.operationType, {
|
|
68
|
+
...this.buildTransactionHookParams(argsWithRelationFieldsHandled, config),
|
|
69
|
+
results,
|
|
70
|
+
}, context);
|
|
62
71
|
return results;
|
|
63
72
|
}
|
|
64
73
|
catch (err) {
|
|
@@ -138,28 +147,59 @@ class BaseService {
|
|
|
138
147
|
return { context };
|
|
139
148
|
}
|
|
140
149
|
}
|
|
141
|
-
async
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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"]}
|
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
let
|
|
15
|
-
|
|
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,
|
|
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
|
-
|
|
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(
|
|
18
|
-
let processedArgs = await this.processArguments(args, config);
|
|
19
|
+
await config.hooks.beforeOperation(this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
19
20
|
if (config.hooks?.beforePrisma) {
|
|
20
|
-
|
|
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(
|
|
26
|
+
result = await config.customPrismaLogic(argsWithRelationFieldsHandled, prisma, config, this);
|
|
26
27
|
}
|
|
27
28
|
else {
|
|
28
|
-
const prismaArgs = this.buildPrismaArgs(
|
|
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(
|
|
33
|
+
result = await config.hooks.afterPrisma(result, this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
33
34
|
}
|
|
34
|
-
await this.executeHooks("after", config.operationType, {
|
|
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(
|
|
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
|
-
|
|
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(
|
|
55
|
-
await this.executeHooks("after", config.operationType, {
|
|
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
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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"]}
|
|
@@ -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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
let
|
|
12
|
-
|
|
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,
|
|
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
|
|
19
|
+
private handlePasswordHashing;
|
|
20
|
+
private processRelationFieldsInBody;
|
|
20
21
|
private buildPrismaArgs;
|
|
21
22
|
private executeTransactionLogic;
|
|
22
23
|
private shouldHashPassword;
|