arkos 1.0.18-beta → 1.0.20-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/dist/cjs/app.js +1 -1
  2. package/dist/cjs/app.js.map +1 -1
  3. package/dist/cjs/exports/middlewares/index.js +7 -0
  4. package/dist/cjs/exports/middlewares/index.js.map +1 -0
  5. package/dist/cjs/exports/utils/index.js.map +1 -1
  6. package/dist/cjs/modules/auth/auth.controller.js +38 -37
  7. package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
  8. package/dist/cjs/modules/auth/auth.router.js +4 -5
  9. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  10. package/dist/cjs/modules/auth/auth.service.js +27 -24
  11. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  12. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +8 -12
  13. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js.map +1 -1
  14. package/dist/cjs/modules/auth/utils/helpers/auth.helpers.js +19 -0
  15. package/dist/cjs/modules/auth/utils/helpers/auth.helpers.js.map +1 -0
  16. package/dist/cjs/modules/base/base.controller.js +2 -29
  17. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  18. package/dist/cjs/modules/base/base.middlewares.js +42 -1
  19. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  20. package/dist/cjs/modules/base/base.router.js +2 -2
  21. package/dist/cjs/modules/base/base.router.js.map +1 -1
  22. package/dist/cjs/modules/base/utils/helpers/base.helpers.js +183 -0
  23. package/dist/cjs/modules/base/utils/helpers/base.helpers.js.map +1 -0
  24. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +2 -3
  25. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  26. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +9 -11
  27. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  28. package/dist/cjs/modules/error-handler/error-handler.controller.js +2 -0
  29. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  30. package/dist/cjs/modules/error-handler/utils/catch-async.js +1 -1
  31. package/dist/cjs/modules/error-handler/utils/catch-async.js.map +1 -1
  32. package/dist/cjs/modules/file-uploader/file-uploader.service.js +4 -4
  33. package/dist/cjs/modules/file-uploader/file-uploader.service.js.map +1 -1
  34. package/dist/cjs/modules/file-uploader/utils/helpers/file-uploader.helpers.js +7 -5
  35. package/dist/cjs/modules/file-uploader/utils/helpers/file-uploader.helpers.js.map +1 -1
  36. package/dist/cjs/server.js +1 -1
  37. package/dist/cjs/server.js.map +1 -1
  38. package/dist/cjs/types/arkos-config.js.map +1 -1
  39. package/dist/cjs/types/auth.js.map +1 -1
  40. package/dist/cjs/types/index.js.map +1 -1
  41. package/dist/cjs/types/prisma-model-router-config.js +3 -0
  42. package/dist/cjs/types/prisma-model-router-config.js.map +1 -0
  43. package/dist/cjs/utils/features/api.features.js +3 -2
  44. package/dist/cjs/utils/features/api.features.js.map +1 -1
  45. package/dist/cjs/utils/helpers/api.features.helpers.js +4 -3
  46. package/dist/cjs/utils/helpers/api.features.helpers.js.map +1 -1
  47. package/dist/cjs/utils/helpers/base.controller.helpers.js +77 -35
  48. package/dist/cjs/utils/helpers/base.controller.helpers.js.map +1 -1
  49. package/dist/cjs/utils/helpers/change-case.helpers.js +3 -3
  50. package/dist/cjs/utils/helpers/change-case.helpers.js.map +1 -1
  51. package/dist/cjs/utils/helpers/fs.helpers.js +14 -45
  52. package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
  53. package/dist/cjs/utils/helpers/models.helpers.js +35 -30
  54. package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
  55. package/dist/cjs/utils/helpers/prisma.helpers.js +5 -3
  56. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  57. package/dist/cjs/utils/scripts/export-prisma-types.js +3 -3
  58. package/dist/cjs/utils/scripts/export-prisma-types.js.map +1 -1
  59. package/dist/cjs/utils/scripts/generate-insomnia-collection.js +228 -0
  60. package/dist/cjs/utils/scripts/generate-insomnia-collection.js.map +1 -0
  61. package/dist/cjs/utils/scripts/generate-zod-schemas.js +4 -3
  62. package/dist/cjs/utils/scripts/generate-zod-schemas.js.map +1 -1
  63. package/dist/cjs/utils/scripts/index.js +12 -0
  64. package/dist/cjs/utils/scripts/index.js.map +1 -0
  65. package/dist/es2020/app.js +1 -1
  66. package/dist/es2020/app.js.map +1 -1
  67. package/dist/es2020/exports/middlewares/index.js +2 -0
  68. package/dist/es2020/exports/middlewares/index.js.map +1 -0
  69. package/dist/es2020/exports/utils/index.js.map +1 -1
  70. package/dist/es2020/modules/auth/auth.controller.js +39 -38
  71. package/dist/es2020/modules/auth/auth.controller.js.map +1 -1
  72. package/dist/es2020/modules/auth/auth.router.js +1 -2
  73. package/dist/es2020/modules/auth/auth.router.js.map +1 -1
  74. package/dist/es2020/modules/auth/auth.service.js +27 -24
  75. package/dist/es2020/modules/auth/auth.service.js.map +1 -1
  76. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js +8 -12
  77. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js.map +1 -1
  78. package/dist/es2020/modules/auth/utils/helpers/auth.helpers.js +12 -0
  79. package/dist/es2020/modules/auth/utils/helpers/auth.helpers.js.map +1 -0
  80. package/dist/es2020/modules/base/base.controller.js +2 -29
  81. package/dist/es2020/modules/base/base.controller.js.map +1 -1
  82. package/dist/es2020/modules/base/base.middlewares.js +38 -1
  83. package/dist/es2020/modules/base/base.middlewares.js.map +1 -1
  84. package/dist/es2020/modules/base/base.router.js +2 -2
  85. package/dist/es2020/modules/base/base.router.js.map +1 -1
  86. package/dist/es2020/modules/base/utils/helpers/base.helpers.js +177 -0
  87. package/dist/es2020/modules/base/utils/helpers/base.helpers.js.map +1 -0
  88. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js +1 -2
  89. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  90. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js +9 -11
  91. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  92. package/dist/es2020/modules/error-handler/error-handler.controller.js +2 -0
  93. package/dist/es2020/modules/error-handler/error-handler.controller.js.map +1 -1
  94. package/dist/es2020/modules/error-handler/utils/catch-async.js +1 -1
  95. package/dist/es2020/modules/error-handler/utils/catch-async.js.map +1 -1
  96. package/dist/es2020/modules/file-uploader/file-uploader.service.js +4 -4
  97. package/dist/es2020/modules/file-uploader/file-uploader.service.js.map +1 -1
  98. package/dist/es2020/modules/file-uploader/utils/helpers/file-uploader.helpers.js +7 -5
  99. package/dist/es2020/modules/file-uploader/utils/helpers/file-uploader.helpers.js.map +1 -1
  100. package/dist/es2020/server.js +1 -1
  101. package/dist/es2020/server.js.map +1 -1
  102. package/dist/es2020/types/arkos-config.js.map +1 -1
  103. package/dist/es2020/types/auth.js.map +1 -1
  104. package/dist/es2020/types/index.js.map +1 -1
  105. package/dist/es2020/types/prisma-model-router-config.js +2 -0
  106. package/dist/es2020/types/prisma-model-router-config.js.map +1 -0
  107. package/dist/es2020/utils/features/api.features.js +3 -2
  108. package/dist/es2020/utils/features/api.features.js.map +1 -1
  109. package/dist/es2020/utils/helpers/api.features.helpers.js +4 -3
  110. package/dist/es2020/utils/helpers/api.features.helpers.js.map +1 -1
  111. package/dist/es2020/utils/helpers/base.controller.helpers.js +75 -31
  112. package/dist/es2020/utils/helpers/base.controller.helpers.js.map +1 -1
  113. package/dist/es2020/utils/helpers/change-case.helpers.js +3 -3
  114. package/dist/es2020/utils/helpers/change-case.helpers.js.map +1 -1
  115. package/dist/es2020/utils/helpers/fs.helpers.js +13 -44
  116. package/dist/es2020/utils/helpers/fs.helpers.js.map +1 -1
  117. package/dist/es2020/utils/helpers/models.helpers.js +36 -31
  118. package/dist/es2020/utils/helpers/models.helpers.js.map +1 -1
  119. package/dist/es2020/utils/helpers/prisma.helpers.js +6 -4
  120. package/dist/es2020/utils/helpers/prisma.helpers.js.map +1 -1
  121. package/dist/es2020/utils/scripts/export-prisma-types.js +3 -3
  122. package/dist/es2020/utils/scripts/export-prisma-types.js.map +1 -1
  123. package/dist/es2020/utils/scripts/generate-insomnia-collection.js +189 -0
  124. package/dist/es2020/utils/scripts/generate-insomnia-collection.js.map +1 -0
  125. package/dist/es2020/utils/scripts/generate-zod-schemas.js +4 -3
  126. package/dist/es2020/utils/scripts/generate-zod-schemas.js.map +1 -1
  127. package/dist/es2020/utils/scripts/index.js +10 -0
  128. package/dist/es2020/utils/scripts/index.js.map +1 -0
  129. package/dist/types/exports/middlewares/index.d.ts +1 -0
  130. package/dist/types/exports/utils/index.d.ts +1 -0
  131. package/dist/types/modules/auth/auth.service.d.ts +3 -3
  132. package/dist/types/modules/auth/utils/helpers/auth.helpers.d.ts +2 -0
  133. package/dist/types/modules/base/base.middlewares.d.ts +6 -1
  134. package/dist/types/modules/base/utils/helpers/base.helpers.d.ts +5 -0
  135. package/dist/types/modules/base/utils/helpers/base.service.helpers.d.ts +1 -1
  136. package/dist/types/types/arkos-config.d.ts +5 -0
  137. package/dist/types/types/auth.d.ts +9 -8
  138. package/dist/types/types/index.d.ts +2 -1
  139. package/dist/types/types/prisma-model-router-config.d.ts +18 -0
  140. package/dist/types/utils/helpers/base.controller.helpers.d.ts +4 -6
  141. package/dist/types/utils/helpers/fs.helpers.d.ts +2 -2
  142. package/dist/types/utils/scripts/generate-insomnia-collection.d.ts +1 -0
  143. package/dist/types/utils/scripts/index.d.ts +2 -0
  144. package/package.json +55 -34
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.isPrismaRelationFormat = isPrismaRelationFormat;
15
+ exports.handleRelationFieldsInBody = handleRelationFieldsInBody;
16
+ exports.canBeUsedToConnect = canBeUsedToConnect;
17
+ exports.isListFieldAnArray = isListFieldAnArray;
18
+ const models_helpers_1 = require("../../../../utils/helpers/models.helpers");
19
+ function removeApiAction(obj) {
20
+ if (!obj || typeof obj !== "object")
21
+ return obj;
22
+ const result = {};
23
+ for (const [key, value] of Object.entries(obj)) {
24
+ if (key === "apiAction")
25
+ continue;
26
+ if (Array.isArray(value)) {
27
+ result[key] = value.map((item) => typeof item === "object" && item !== null ? removeApiAction(item) : item);
28
+ }
29
+ else if (typeof value === "object" && value !== null) {
30
+ result[key] = removeApiAction(value);
31
+ }
32
+ else {
33
+ result[key] = value;
34
+ }
35
+ }
36
+ return result;
37
+ }
38
+ function isPrismaRelationFormat(obj) {
39
+ if (!obj || typeof obj !== "object")
40
+ return false;
41
+ const prismaOperations = [
42
+ "create",
43
+ "connect",
44
+ "update",
45
+ "delete",
46
+ "disconnect",
47
+ "deleteMany",
48
+ "connectOrCreate",
49
+ "upsert",
50
+ "set",
51
+ ];
52
+ return prismaOperations.some((op) => op in obj);
53
+ }
54
+ function handleRelationFieldsInBody(body, relationFields, ignoreActions = []) {
55
+ var _a, _b;
56
+ let mutableBody = Object.assign({}, body);
57
+ (_a = relationFields === null || relationFields === void 0 ? void 0 : relationFields.list) === null || _a === void 0 ? void 0 : _a.forEach((field) => {
58
+ var _a;
59
+ if (!body[field.name])
60
+ return;
61
+ if (isPrismaRelationFormat(body[field.name])) {
62
+ return;
63
+ }
64
+ if (!isListFieldAnArray(body[field.name])) {
65
+ return;
66
+ }
67
+ const createData = [];
68
+ const connectData = [];
69
+ const updateData = [];
70
+ const disconnectData = [];
71
+ const deleteManyIds = [];
72
+ (_a = body[field.name]) === null || _a === void 0 ? void 0 : _a.forEach((bodyField) => {
73
+ if (ignoreActions.includes(bodyField === null || bodyField === void 0 ? void 0 : bodyField.apiAction))
74
+ return;
75
+ const apiAction = bodyField === null || bodyField === void 0 ? void 0 : bodyField.apiAction;
76
+ if (apiAction === "delete") {
77
+ deleteManyIds.push(bodyField.id);
78
+ }
79
+ else if (apiAction === "disconnect") {
80
+ disconnectData.push({ id: bodyField.id });
81
+ }
82
+ else if (canBeUsedToConnect(field.type, bodyField)) {
83
+ const { apiAction: _ } = bodyField, cleanedData = __rest(bodyField, ["apiAction"]);
84
+ connectData.push(cleanedData);
85
+ }
86
+ else if (!(bodyField === null || bodyField === void 0 ? void 0 : bodyField.id)) {
87
+ let nestedRelations = (0, models_helpers_1.getPrismaModelRelations)(field.type);
88
+ let dataToPush = Object.assign({}, bodyField);
89
+ if (nestedRelations) {
90
+ dataToPush = handleRelationFieldsInBody(dataToPush, nestedRelations, ignoreActions);
91
+ }
92
+ if ("apiAction" in dataToPush) {
93
+ const { apiAction: _ } = dataToPush, rest = __rest(dataToPush, ["apiAction"]);
94
+ dataToPush = rest;
95
+ }
96
+ createData.push(dataToPush);
97
+ }
98
+ else {
99
+ const { id, apiAction: _ } = bodyField, data = __rest(bodyField, ["id", "apiAction"]);
100
+ let nestedRelations = (0, models_helpers_1.getPrismaModelRelations)(field.type);
101
+ let dataToPush = data;
102
+ if (nestedRelations) {
103
+ dataToPush = handleRelationFieldsInBody(data, nestedRelations, ignoreActions);
104
+ }
105
+ updateData.push({
106
+ where: { id },
107
+ data: dataToPush,
108
+ });
109
+ }
110
+ });
111
+ mutableBody[field.name] = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (createData.length ? { create: createData } : {})), (connectData.length ? { connect: connectData } : {})), (updateData.length ? { update: updateData } : {})), (disconnectData.length ? { disconnect: disconnectData } : {})), (deleteManyIds.length
112
+ ? { deleteMany: { id: { in: deleteManyIds } } }
113
+ : {}));
114
+ });
115
+ (_b = relationFields === null || relationFields === void 0 ? void 0 : relationFields.singular) === null || _b === void 0 ? void 0 : _b.forEach((field) => {
116
+ var _a;
117
+ if (!body[field.name])
118
+ return;
119
+ if (ignoreActions.includes((_a = body[field.name]) === null || _a === void 0 ? void 0 : _a.apiAction))
120
+ return;
121
+ if (isPrismaRelationFormat(body[field.name])) {
122
+ return;
123
+ }
124
+ const relationData = body[field.name];
125
+ let nestedRelations = (0, models_helpers_1.getPrismaModelRelations)(field.type);
126
+ if (canBeUsedToConnect(field.type, relationData)) {
127
+ const { apiAction: _ } = relationData, cleanedData = __rest(relationData, ["apiAction"]);
128
+ mutableBody[field.name] = { connect: cleanedData };
129
+ }
130
+ else if (!(relationData === null || relationData === void 0 ? void 0 : relationData.id)) {
131
+ let dataToCreate = Object.assign({}, relationData);
132
+ if ("apiAction" in dataToCreate) {
133
+ const { apiAction: _ } = dataToCreate, rest = __rest(dataToCreate, ["apiAction"]);
134
+ dataToCreate = rest;
135
+ }
136
+ if (nestedRelations) {
137
+ dataToCreate = handleRelationFieldsInBody(dataToCreate, nestedRelations, ignoreActions);
138
+ }
139
+ mutableBody[field.name] = { create: dataToCreate };
140
+ }
141
+ else {
142
+ const { id, apiAction: _ } = relationData, data = __rest(relationData, ["id", "apiAction"]);
143
+ let dataToUpdate = data;
144
+ if (nestedRelations) {
145
+ dataToUpdate = handleRelationFieldsInBody(data, nestedRelations, ignoreActions);
146
+ }
147
+ mutableBody[field.name] = {
148
+ update: {
149
+ data: dataToUpdate,
150
+ },
151
+ };
152
+ }
153
+ });
154
+ if ("apiAction" in mutableBody) {
155
+ const { apiAction } = mutableBody, rest = __rest(mutableBody, ["apiAction"]);
156
+ mutableBody = rest;
157
+ }
158
+ return removeApiAction(mutableBody);
159
+ }
160
+ function canBeUsedToConnect(modelName, bodyField) {
161
+ var _a;
162
+ if (!bodyField)
163
+ return false;
164
+ if (bodyField.apiAction && !["connect"].includes(bodyField.apiAction)) {
165
+ return false;
166
+ }
167
+ if (bodyField.apiAction === "connect") {
168
+ return true;
169
+ }
170
+ if (((_a = Object.keys(bodyField)) === null || _a === void 0 ? void 0 : _a.length) === 1 && (bodyField === null || bodyField === void 0 ? void 0 : bodyField.id)) {
171
+ return true;
172
+ }
173
+ const uniqueFields = (0, models_helpers_1.getModelUniqueFields)(modelName);
174
+ if (Object.keys(bodyField).length === 1) {
175
+ const fieldName = Object.keys(bodyField)[0];
176
+ return uniqueFields === null || uniqueFields === void 0 ? void 0 : uniqueFields.some((field) => field.name === fieldName);
177
+ }
178
+ return false;
179
+ }
180
+ function isListFieldAnArray(field) {
181
+ return Array.isArray(field);
182
+ }
183
+ //# sourceMappingURL=base.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getPrismaModelRelations,\n RelationFields,\n getModelUniqueFields,\n} from \"../../../../utils/helpers/models.helpers\";\n\n/**\n * Removes apiAction field from an object and all nested objects\n *\n * @param {Record<string, any>} obj - The object to clean\n * @returns {Record<string, any>} - The cleaned object\n */\nfunction removeApiAction(obj: Record<string, any>): Record<string, any> {\n if (!obj || typeof obj !== \"object\") return obj;\n\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"apiAction\") continue;\n\n if (Array.isArray(value)) {\n result[key] = value.map((item) =>\n typeof item === \"object\" && item !== null ? removeApiAction(item) : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n result[key] = removeApiAction(value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Checks if an object is already formatted as a Prisma relation operation\n *\n * @param {Record<string, any>} obj - The object to check\n * @returns {boolean} - True if the object contains Prisma relation operations\n */\nexport function isPrismaRelationFormat(obj: Record<string, any>): boolean {\n if (!obj || typeof obj !== \"object\") return false;\n\n // Common Prisma relation operations\n const prismaOperations = [\n \"create\",\n \"connect\",\n \"update\",\n \"delete\",\n \"disconnect\",\n \"deleteMany\",\n \"connectOrCreate\",\n \"upsert\",\n \"set\",\n ];\n\n // Check if any key is a Prisma operation\n return prismaOperations.some((op) => op in obj);\n}\n\n/**\n * Determines the appropriate Prisma operation (`create`, `connect`, `update`, `delete`, or `disconnect`)\n * for each relation field in the provided body based on its nested data and recursively does the same for each relation field.\n *\n * This function handles the following types of relations:\n * - **One-to-one**\n * - **One-to-many**\n *\n *\n * ### Operation Rules:\n *\n *\n * - **Create**: Used when the nested relation data is provided **without an `id` or unique field**.\n * - **Connect**: Used when the nested relation data contains **only an `id` or a unique field** (e.g., email).\n * - **Update**: Used when the nested relation data contains **both an `id` and additional fields**.\n * - **Delete**: Used when the nested relation data includes **`apiAction: \"delete\"`**.\n * - **Disconnect**: Used when the nested relation data includes **`apiAction: \"disconnect\"`**.\n *\n * The function will preserve existing Prisma operation formats if detected,\n * allowing developers to manually structure relation operations when needed.\n *\n * @param {Record<string, any>} body - The object containing relation fields to be processed.\n * @param {Object} relationFields - Defines relation field types.\n * @param {RelationFields[]} relationFields.singular - List of one-side relation field names (one-to-one).\n * @param {RelationFields[]} relationFields.list - List of many-side relation field names (one-to-many).\n * @param {string[]} ignoreActions - Optional list of apiAction values to ignore.\n * @returns {Record<string, any>} The transformed data with appropriate Prisma operations applied.\n */\nexport function handleRelationFieldsInBody(\n body: Record<string, any>,\n relationFields: RelationFields,\n ignoreActions: string[] = []\n) {\n let mutableBody = { ...body };\n\n relationFields?.list?.forEach((field) => {\n if (!body[field.name]) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n // Skip if the field is not an array (likely already handled manually)\n if (!isListFieldAnArray(body[field.name])) {\n return;\n }\n\n const createData: any[] = [];\n const connectData: any[] = [];\n const updateData: any[] = [];\n const disconnectData: any[] = [];\n const deleteManyIds: any[] = [];\n\n body[field.name]?.forEach((bodyField: any) => {\n if (ignoreActions.includes(bodyField?.apiAction)) return;\n\n const apiAction = bodyField?.apiAction;\n\n if (apiAction === \"delete\") {\n deleteManyIds.push(bodyField.id);\n } else if (apiAction === \"disconnect\") {\n disconnectData.push({ id: bodyField.id });\n } else if (canBeUsedToConnect(field.type, bodyField)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = bodyField;\n connectData.push(cleanedData);\n } else if (!bodyField?.id) {\n // If no ID, assume create operation\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = { ...bodyField };\n\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n dataToPush,\n nestedRelations,\n ignoreActions\n );\n }\n\n // Ensure apiAction is removed\n if (\"apiAction\" in dataToPush) {\n const { apiAction: _, ...rest } = dataToPush;\n dataToPush = rest;\n }\n\n createData.push(dataToPush);\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = bodyField;\n\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = data;\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n updateData.push({\n where: { id },\n data: dataToPush,\n });\n }\n });\n\n mutableBody[field.name] = {\n ...(createData.length ? { create: createData } : {}),\n ...(connectData.length ? { connect: connectData } : {}),\n ...(updateData.length ? { update: updateData } : {}),\n ...(disconnectData.length ? { disconnect: disconnectData } : {}),\n ...(deleteManyIds.length\n ? { deleteMany: { id: { in: deleteManyIds } } }\n : {}),\n };\n });\n\n relationFields?.singular?.forEach((field) => {\n if (!body[field.name]) return;\n if (ignoreActions.includes(body[field.name]?.apiAction)) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n const relationData = body[field.name];\n let nestedRelations = getPrismaModelRelations(field.type);\n\n if (canBeUsedToConnect(field.type, relationData)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = relationData;\n mutableBody[field.name] = { connect: cleanedData };\n } else if (!relationData?.id) {\n // If no ID, assume create operation\n let dataToCreate = { ...relationData };\n\n if (\"apiAction\" in dataToCreate) {\n const { apiAction: _, ...rest } = dataToCreate;\n dataToCreate = rest;\n }\n\n if (nestedRelations) {\n dataToCreate = handleRelationFieldsInBody(\n dataToCreate,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = { create: dataToCreate };\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = relationData;\n\n let dataToUpdate = data;\n if (nestedRelations) {\n dataToUpdate = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = {\n update: {\n data: dataToUpdate,\n },\n };\n }\n });\n\n // Remove any remaining apiAction fields from the top level\n if (\"apiAction\" in mutableBody) {\n const { apiAction, ...rest } = mutableBody;\n mutableBody = rest;\n }\n\n // As a final step, recursively remove any remaining apiAction fields\n return removeApiAction(mutableBody);\n}\n\n/**\n * Checks if a field value can be used to connect to a model\n * This happens when the field contains only an ID or a single unique field\n *\n * @param {string} modelName - The model name to get unique fields for\n * @param {Record<string, any>} bodyField - The field value from the body\n * @returns {boolean} True if the field can be used for a connect operation\n */\nexport function canBeUsedToConnect(\n modelName: string,\n bodyField: Record<string, any> | undefined | null\n): boolean {\n // If the field is null or undefined, it can't be used to connect\n if (!bodyField) return false;\n\n // If the field has an apiAction that's not for connecting, return false\n if (bodyField.apiAction && ![\"connect\"].includes(bodyField.apiAction)) {\n return false;\n }\n\n // If explicitly marked for connect, allow it\n if (bodyField.apiAction === \"connect\") {\n return true;\n }\n\n // If only ID is present, it can be used to connect\n if (Object.keys(bodyField)?.length === 1 && bodyField?.id) {\n return true;\n }\n\n // Get unique fields for the model\n const uniqueFields = getModelUniqueFields(modelName);\n\n // If the field has exactly one property and it's a unique field, it can be used to connect\n if (Object.keys(bodyField).length === 1) {\n const fieldName = Object.keys(bodyField)[0];\n return uniqueFields?.some((field) => field.name === fieldName);\n }\n\n return false;\n}\n\n/**\n * Checks if a list field is actually an array\n *\n * @param {any} field - The field to check\n * @returns {boolean} - True if the field is an array\n */\nexport function isListFieldAnArray(field: any): boolean {\n return Array.isArray(field);\n}\n"]}
@@ -15,7 +15,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.setupRouters = setupRouters;
16
16
  const pluralize_1 = __importDefault(require("pluralize"));
17
17
  const utils_1 = require("../../../../exports/utils");
18
- const base_controller_helpers_1 = require("../../../../utils/helpers/base.controller.helpers");
19
18
  const models_helpers_1 = require("../../../../utils/helpers/models.helpers");
20
19
  const auth_service_1 = __importDefault(require("../../../auth/auth.service"));
21
20
  const base_controller_1 = require("../../base.controller");
@@ -45,7 +44,7 @@ function setupRouters(models, router) {
45
44
  };
46
45
  if (!isEndpointDisabled("createOne") &&
47
46
  !hasCustomImplementation(`/${routeName}`, "post")) {
48
- router.post(`/${routeName}`, auth_service_1.default.handleAuthenticationControl(authConfigs, "create"), auth_service_1.default.handleActionAccessControl(authConfigs, "create", modelNameInKebab), (0, base_controller_helpers_1.handleRequestBodyValidationAndTransformation)(modelNameInKebab, "create"), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "createOne"), (_a = middlewares === null || middlewares === void 0 ? void 0 : middlewares.beforeCreateOne) !== null && _a !== void 0 ? _a : createOne, (middlewares === null || middlewares === void 0 ? void 0 : middlewares.beforeCreateOne)
47
+ router.post(`/${routeName}`, auth_service_1.default.handleAuthenticationControl(authConfigs, "create"), auth_service_1.default.handleActionAccessControl(authConfigs, "create", modelNameInKebab), (0, base_middlewares_1.handleRequestBodyValidationAndTransformation)(modelNameInKebab, "create"), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "createOne"), (_a = middlewares === null || middlewares === void 0 ? void 0 : middlewares.beforeCreateOne) !== null && _a !== void 0 ? _a : createOne, (middlewares === null || middlewares === void 0 ? void 0 : middlewares.beforeCreateOne)
49
48
  ? createOne
50
49
  : (_b = middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterCreateOne) !== null && _b !== void 0 ? _b : base_middlewares_1.sendResponse, (middlewares === null || middlewares === void 0 ? void 0 : middlewares.beforeCreateOne) && (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterCreateOne)
51
50
  ? middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterCreateOne
@@ -93,7 +92,7 @@ function setupRouters(models, router) {
93
92
  }
94
93
  if (!isEndpointDisabled("updateOne") &&
95
94
  !hasCustomImplementation(`/${routeName}/:id`, "patch")) {
96
- router.patch(`/${routeName}/:id`, auth_service_1.default.handleAuthenticationControl(authConfigs, "update"), auth_service_1.default.handleActionAccessControl(authConfigs, "update", modelNameInKebab), (0, base_controller_helpers_1.handleRequestBodyValidationAndTransformation)(modelNameInKebab, "update"), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "updateOne"), (_o = middlewares === null || middlewares === void 0 ? void 0 : middlewares.beforeUpdateOne) !== null && _o !== void 0 ? _o : updateOne, (middlewares === null || middlewares === void 0 ? void 0 : middlewares.beforeUpdateOne)
95
+ router.patch(`/${routeName}/:id`, auth_service_1.default.handleAuthenticationControl(authConfigs, "update"), auth_service_1.default.handleActionAccessControl(authConfigs, "update", modelNameInKebab), (0, base_middlewares_1.handleRequestBodyValidationAndTransformation)(modelNameInKebab, "update"), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "updateOne"), (_o = middlewares === null || middlewares === void 0 ? void 0 : middlewares.beforeUpdateOne) !== null && _o !== void 0 ? _o : updateOne, (middlewares === null || middlewares === void 0 ? void 0 : middlewares.beforeUpdateOne)
97
96
  ? updateOne
98
97
  : (_p = middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterUpdateOne) !== null && _p !== void 0 ? _p : base_middlewares_1.sendResponse, (middlewares === null || middlewares === void 0 ? void 0 : middlewares.beforeUpdateOne) && (middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterUpdateOne)
99
98
  ? middlewares === null || middlewares === void 0 ? void 0 : middlewares.afterUpdateOne
@@ -1 +1 @@
1
- {"version":3,"file":"base.router.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.router.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport pluralize from \"pluralize\";\nimport { RouterConfig } from \"../../../../exports\";\nimport { kebabCase } from \"../../../../exports/utils\";\nimport { PrismaQueryOptions } from \"../../../../types\";\nimport { RouterEndpoint } from \"../../../../types/router-config\";\nimport { handleRequestBodyValidationAndTransformation } from \"../../../../utils/helpers/base.controller.helpers\";\nimport { importPrismaModelModules } from \"../../../../utils/helpers/models.helpers\";\nimport authService from \"../../../auth/auth.service\";\nimport { BaseController } from \"../../base.controller\";\nimport {\n addPrismaQueryOptionsToRequestQuery,\n sendResponse,\n} from \"../../base.middlewares\";\n\nexport function setupRouters(models: string[], router: Router) {\n return models.map(async (model) => {\n const modelNameInKebab = kebabCase(model);\n const modelModules = await importPrismaModelModules(modelNameInKebab);\n const {\n middlewares,\n authConfigs,\n prismaQueryOptions,\n router: customRouterModule,\n } = modelModules;\n\n const routeName = pluralize.plural(modelNameInKebab);\n const apiRoutePath = `/api/${routeName}`;\n const {\n createOne,\n findMany,\n findOne,\n updateOne,\n deleteOne,\n createMany,\n updateMany,\n deleteMany,\n } = new BaseController(model);\n\n // Check for router customization/disabling\n const routerConfig: RouterConfig = customRouterModule?.config;\n const disableConfig = routerConfig?.disable || {};\n const isCompletelyDisabled = disableConfig === true;\n\n // Check if custom implementation exists\n const customRouter = (customRouterModule?.default as Router) || {};\n const hasCustomImplementation = (path: string, method: string) => {\n return customRouter.stack?.some(\n (layer) =>\n layer.path === path &&\n layer.method.toLowerCase() === method.toLowerCase()\n );\n };\n\n // Helper to determine if an endpoint should be disabled\n const isEndpointDisabled = (endpoint: RouterEndpoint): boolean => {\n if (isCompletelyDisabled) return true;\n return typeof disableConfig === \"object\" && !!disableConfig[endpoint];\n };\n\n // Create individual routes instead of chaining\n\n // POST /{routeName} - Create One\n if (\n !isEndpointDisabled(\"createOne\") &&\n !hasCustomImplementation(`/${routeName}`, \"post\")\n ) {\n router.post(\n `/${routeName}`,\n authService.handleAuthenticationControl(authConfigs, \"create\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"create\",\n modelNameInKebab\n ),\n handleRequestBodyValidationAndTransformation(\n modelNameInKebab,\n \"create\"\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createOne\"\n ),\n middlewares?.beforeCreateOne ?? createOne,\n middlewares?.beforeCreateOne\n ? createOne\n : middlewares?.afterCreateOne ?? sendResponse,\n middlewares?.beforeCreateOne && middlewares?.afterCreateOne\n ? middlewares?.afterCreateOne\n : sendResponse,\n sendResponse\n );\n }\n\n // GET /{routeName} - Find Many\n if (\n !isEndpointDisabled(\"findMany\") &&\n !hasCustomImplementation(`/${routeName}`, \"get\")\n ) {\n router.get(\n `/${routeName}`,\n authService.handleAuthenticationControl(authConfigs, \"view\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"view\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findMany\"\n ),\n middlewares?.beforeFindMany ?? findMany,\n middlewares?.beforeFindMany\n ? findMany\n : middlewares?.afterFindMany ?? sendResponse,\n middlewares?.beforeFindMany && middlewares?.afterFindMany\n ? middlewares?.afterFindMany\n : sendResponse,\n sendResponse\n );\n }\n\n // POST /{routeName}/many - Create Many\n if (\n !isEndpointDisabled(\"createMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"post\")\n ) {\n router.post(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(authConfigs, \"create\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"create\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createMany\"\n ),\n middlewares?.beforeCreateMany ?? createMany,\n middlewares?.beforeCreateMany\n ? createMany\n : middlewares?.afterCreateMany ?? sendResponse,\n middlewares?.beforeCreateMany && middlewares?.afterCreateMany\n ? middlewares?.afterCreateMany\n : sendResponse,\n sendResponse\n );\n }\n\n // PATCH /{routeName}/many - Update Many\n if (\n !isEndpointDisabled(\"updateMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"patch\")\n ) {\n router.patch(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(authConfigs, \"update\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"update\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateMany\"\n ),\n middlewares?.beforeUpdateMany ?? updateMany,\n middlewares?.beforeUpdateMany\n ? updateMany\n : middlewares?.afterUpdateMany ?? sendResponse,\n middlewares?.beforeUpdateMany && middlewares?.afterUpdateMany\n ? middlewares?.afterUpdateMany\n : sendResponse,\n sendResponse\n );\n }\n\n // DELETE /{routeName}/many - Delete Many\n if (\n !isEndpointDisabled(\"deleteMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"delete\")\n ) {\n router.delete(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(authConfigs, \"delete\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"delete\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteMany\"\n ),\n middlewares?.beforeDeleteMany ?? deleteMany,\n middlewares?.beforeDeleteMany\n ? deleteMany\n : middlewares?.afterDeleteMany ?? sendResponse,\n middlewares?.beforeDeleteMany && middlewares?.afterDeleteMany\n ? middlewares?.afterDeleteMany\n : sendResponse,\n sendResponse\n );\n }\n\n // GET /{routeName}/:id - Find One\n if (\n !isEndpointDisabled(\"findOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"get\")\n ) {\n router.get(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(authConfigs, \"view\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"view\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findOne\"\n ),\n middlewares?.beforeFindOne ?? findOne,\n middlewares?.beforeFindOne\n ? findOne\n : middlewares?.afterFindOne ?? sendResponse,\n middlewares?.beforeFindOne && middlewares?.afterFindOne\n ? middlewares?.afterFindOne\n : sendResponse,\n sendResponse\n );\n }\n\n // PATCH /{routeName}/:id - Update One\n if (\n !isEndpointDisabled(\"updateOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"patch\")\n ) {\n router.patch(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(authConfigs, \"update\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"update\",\n modelNameInKebab\n ),\n handleRequestBodyValidationAndTransformation(\n modelNameInKebab,\n \"update\"\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateOne\"\n ),\n middlewares?.beforeUpdateOne ?? updateOne,\n middlewares?.beforeUpdateOne\n ? updateOne\n : middlewares?.afterUpdateOne ?? sendResponse,\n middlewares?.beforeUpdateOne && middlewares?.afterUpdateOne\n ? middlewares?.afterUpdateOne\n : sendResponse,\n sendResponse\n );\n }\n\n // DELETE /{routeName}/:id - Delete One\n if (\n !isEndpointDisabled(\"deleteOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"delete\")\n ) {\n router.delete(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(authConfigs, \"delete\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"delete\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteOne\"\n ),\n middlewares?.beforeDeleteOne ?? deleteOne,\n middlewares?.beforeDeleteOne\n ? deleteOne\n : middlewares?.afterDeleteOne ?? sendResponse,\n middlewares?.beforeDeleteOne && middlewares?.afterDeleteOne\n ? middlewares?.afterDeleteOne\n : sendResponse,\n sendResponse\n );\n }\n\n // // If the custom router has its own routes, add them\n // if (customRouterModule?.default) {\n // customRouter.stack.forEach((stack) => {\n // const { method, path, handle } = stack;\n // (router as any)[method.toLowerCase()](path, handle);\n // });\n // }\n });\n}\n"]}
1
+ {"version":3,"file":"base.router.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.router.helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAeA,oCA+RC;AA7SD,0DAAkC;AAElC,qDAAsD;AAGtD,6EAAoF;AACpF,8EAAqD;AACrD,2DAAuD;AACvD,6DAIgC;AAEhC,SAAgB,YAAY,CAAC,MAAgB,EAAE,MAAc;IAC3D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAO,KAAK,EAAE,EAAE;;QAChC,MAAM,gBAAgB,GAAG,IAAA,iBAAS,EAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,MAAM,IAAA,yCAAwB,EAAC,gBAAgB,CAAC,CAAC;QACtE,MAAM,EACJ,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,MAAM,EAAE,kBAAkB,GAC3B,GAAG,YAAY,CAAC;QAEjB,MAAM,SAAS,GAAG,mBAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,QAAQ,SAAS,EAAE,CAAC;QACzC,MAAM,EACJ,SAAS,EACT,QAAQ,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,GACX,GAAG,IAAI,gCAAc,CAAC,KAAK,CAAC,CAAC;QAG9B,MAAM,YAAY,GAAiB,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,MAAM,CAAC;QAC9D,MAAM,aAAa,GAAG,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,OAAO,KAAI,EAAE,CAAC;QAClD,MAAM,oBAAoB,GAAG,aAAa,KAAK,IAAI,CAAC;QAGpD,MAAM,YAAY,GAAG,CAAC,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAkB,KAAI,EAAE,CAAC;QACnE,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE;;YAC/D,OAAO,MAAA,YAAY,CAAC,KAAK,0CAAE,IAAI,CAC7B,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,IAAI;gBACnB,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CACtD,CAAC;QACJ,CAAC,CAAC;QAGF,MAAM,kBAAkB,GAAG,CAAC,QAAwB,EAAW,EAAE;YAC/D,IAAI,oBAAoB;gBAAE,OAAO,IAAI,CAAC;YACtC,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxE,CAAC,CAAC;QAKF,IACE,CAAC,kBAAkB,CAAC,WAAW,CAAC;YAChC,CAAC,uBAAuB,CAAC,IAAI,SAAS,EAAE,EAAE,MAAM,CAAC,EACjD,CAAC;YACD,MAAM,CAAC,IAAI,CACT,IAAI,SAAS,EAAE,EACf,sBAAW,CAAC,2BAA2B,CAAC,WAAW,EAAE,QAAQ,CAAC,EAC9D,sBAAW,CAAC,yBAAyB,CACnC,WAAW,EACX,QAAQ,EACR,gBAAgB,CACjB,EACD,IAAA,+DAA4C,EAC1C,gBAAgB,EAChB,QAAQ,CACT,EACD,IAAA,sDAAmC,EACjC,kBAA6C,EAC7C,WAAW,CACZ,EACD,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,mCAAI,SAAS,EACzC,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe;gBAC1B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,mCAAI,+BAAY,EAC/C,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,MAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,CAAA;gBACzD,CAAC,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc;gBAC7B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;QACJ,CAAC;QAGD,IACE,CAAC,kBAAkB,CAAC,UAAU,CAAC;YAC/B,CAAC,uBAAuB,CAAC,IAAI,SAAS,EAAE,EAAE,KAAK,CAAC,EAChD,CAAC;YACD,MAAM,CAAC,GAAG,CACR,IAAI,SAAS,EAAE,EACf,sBAAW,CAAC,2BAA2B,CAAC,WAAW,EAAE,MAAM,CAAC,EAC5D,sBAAW,CAAC,yBAAyB,CACnC,WAAW,EACX,MAAM,EACN,gBAAgB,CACjB,EACD,IAAA,sDAAmC,EACjC,kBAA6C,EAC7C,UAAU,CACX,EACD,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,mCAAI,QAAQ,EACvC,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc;gBACzB,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,aAAa,mCAAI,+BAAY,EAC9C,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,MAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,aAAa,CAAA;gBACvD,CAAC,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,aAAa;gBAC5B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;QACJ,CAAC;QAGD,IACE,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACjC,CAAC,uBAAuB,CAAC,IAAI,SAAS,OAAO,EAAE,MAAM,CAAC,EACtD,CAAC;YACD,MAAM,CAAC,IAAI,CACT,IAAI,SAAS,OAAO,EACpB,sBAAW,CAAC,2BAA2B,CAAC,WAAW,EAAE,QAAQ,CAAC,EAC9D,sBAAW,CAAC,yBAAyB,CACnC,WAAW,EACX,QAAQ,EACR,gBAAgB,CACjB,EACD,IAAA,sDAAmC,EACjC,kBAA6C,EAC7C,YAAY,CACb,EACD,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB,mCAAI,UAAU,EAC3C,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB;gBAC3B,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,mCAAI,+BAAY,EAChD,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB,MAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,CAAA;gBAC3D,CAAC,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe;gBAC9B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;QACJ,CAAC;QAGD,IACE,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACjC,CAAC,uBAAuB,CAAC,IAAI,SAAS,OAAO,EAAE,OAAO,CAAC,EACvD,CAAC;YACD,MAAM,CAAC,KAAK,CACV,IAAI,SAAS,OAAO,EACpB,sBAAW,CAAC,2BAA2B,CAAC,WAAW,EAAE,QAAQ,CAAC,EAC9D,sBAAW,CAAC,yBAAyB,CACnC,WAAW,EACX,QAAQ,EACR,gBAAgB,CACjB,EACD,IAAA,sDAAmC,EACjC,kBAA6C,EAC7C,YAAY,CACb,EACD,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB,mCAAI,UAAU,EAC3C,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB;gBAC3B,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,mCAAI,+BAAY,EAChD,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB,MAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,CAAA;gBAC3D,CAAC,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe;gBAC9B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;QACJ,CAAC;QAGD,IACE,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACjC,CAAC,uBAAuB,CAAC,IAAI,SAAS,OAAO,EAAE,QAAQ,CAAC,EACxD,CAAC;YACD,MAAM,CAAC,MAAM,CACX,IAAI,SAAS,OAAO,EACpB,sBAAW,CAAC,2BAA2B,CAAC,WAAW,EAAE,QAAQ,CAAC,EAC9D,sBAAW,CAAC,yBAAyB,CACnC,WAAW,EACX,QAAQ,EACR,gBAAgB,CACjB,EACD,IAAA,sDAAmC,EACjC,kBAA6C,EAC7C,YAAY,CACb,EACD,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB,mCAAI,UAAU,EAC3C,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB;gBAC3B,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,mCAAI,+BAAY,EAChD,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB,MAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,CAAA;gBAC3D,CAAC,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe;gBAC9B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;QACJ,CAAC;QAGD,IACE,CAAC,kBAAkB,CAAC,SAAS,CAAC;YAC9B,CAAC,uBAAuB,CAAC,IAAI,SAAS,MAAM,EAAE,KAAK,CAAC,EACpD,CAAC;YACD,MAAM,CAAC,GAAG,CACR,IAAI,SAAS,MAAM,EACnB,sBAAW,CAAC,2BAA2B,CAAC,WAAW,EAAE,MAAM,CAAC,EAC5D,sBAAW,CAAC,yBAAyB,CACnC,WAAW,EACX,MAAM,EACN,gBAAgB,CACjB,EACD,IAAA,sDAAmC,EACjC,kBAA6C,EAC7C,SAAS,CACV,EACD,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,aAAa,mCAAI,OAAO,EACrC,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,aAAa;gBACxB,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,mCAAI,+BAAY,EAC7C,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,aAAa,MAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,CAAA;gBACrD,CAAC,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY;gBAC3B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;QACJ,CAAC;QAGD,IACE,CAAC,kBAAkB,CAAC,WAAW,CAAC;YAChC,CAAC,uBAAuB,CAAC,IAAI,SAAS,MAAM,EAAE,OAAO,CAAC,EACtD,CAAC;YACD,MAAM,CAAC,KAAK,CACV,IAAI,SAAS,MAAM,EACnB,sBAAW,CAAC,2BAA2B,CAAC,WAAW,EAAE,QAAQ,CAAC,EAC9D,sBAAW,CAAC,yBAAyB,CACnC,WAAW,EACX,QAAQ,EACR,gBAAgB,CACjB,EACD,IAAA,+DAA4C,EAC1C,gBAAgB,EAChB,QAAQ,CACT,EACD,IAAA,sDAAmC,EACjC,kBAA6C,EAC7C,WAAW,CACZ,EACD,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,mCAAI,SAAS,EACzC,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe;gBAC1B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,mCAAI,+BAAY,EAC/C,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,MAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,CAAA;gBACzD,CAAC,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc;gBAC7B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;QACJ,CAAC;QAGD,IACE,CAAC,kBAAkB,CAAC,WAAW,CAAC;YAChC,CAAC,uBAAuB,CAAC,IAAI,SAAS,MAAM,EAAE,QAAQ,CAAC,EACvD,CAAC;YACD,MAAM,CAAC,MAAM,CACX,IAAI,SAAS,MAAM,EACnB,sBAAW,CAAC,2BAA2B,CAAC,WAAW,EAAE,QAAQ,CAAC,EAC9D,sBAAW,CAAC,yBAAyB,CACnC,WAAW,EACX,QAAQ,EACR,gBAAgB,CACjB,EACD,IAAA,sDAAmC,EACjC,kBAA6C,EAC7C,WAAW,CACZ,EACD,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,mCAAI,SAAS,EACzC,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe;gBAC1B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,mCAAI,+BAAY,EAC/C,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe,MAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc,CAAA;gBACzD,CAAC,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,cAAc;gBAC7B,CAAC,CAAC,+BAAY,EAChB,+BAAY,CACb,CAAC;QACJ,CAAC;IASH,CAAC,CAAA,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { Router } from \"express\";\nimport pluralize from \"pluralize\";\nimport { RouterConfig } from \"../../../../exports\";\nimport { kebabCase } from \"../../../../exports/utils\";\nimport { PrismaQueryOptions } from \"../../../../types\";\nimport { RouterEndpoint } from \"../../../../types/router-config\";\nimport { importPrismaModelModules } from \"../../../../utils/helpers/models.helpers\";\nimport authService from \"../../../auth/auth.service\";\nimport { BaseController } from \"../../base.controller\";\nimport {\n addPrismaQueryOptionsToRequestQuery,\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../../base.middlewares\";\n\nexport function setupRouters(models: string[], router: Router) {\n return models.map(async (model) => {\n const modelNameInKebab = kebabCase(model);\n const modelModules = await importPrismaModelModules(modelNameInKebab);\n const {\n middlewares,\n authConfigs,\n prismaQueryOptions,\n router: customRouterModule,\n } = modelModules;\n\n const routeName = pluralize.plural(modelNameInKebab);\n const apiRoutePath = `/api/${routeName}`;\n const {\n createOne,\n findMany,\n findOne,\n updateOne,\n deleteOne,\n createMany,\n updateMany,\n deleteMany,\n } = new BaseController(model);\n\n // Check for router customization/disabling\n const routerConfig: RouterConfig = customRouterModule?.config;\n const disableConfig = routerConfig?.disable || {};\n const isCompletelyDisabled = disableConfig === true;\n\n // Check if custom implementation exists\n const customRouter = (customRouterModule?.default as Router) || {};\n const hasCustomImplementation = (path: string, method: string) => {\n return customRouter.stack?.some(\n (layer) =>\n layer.path === path &&\n layer.method.toLowerCase() === method.toLowerCase()\n );\n };\n\n // Helper to determine if an endpoint should be disabled\n const isEndpointDisabled = (endpoint: RouterEndpoint): boolean => {\n if (isCompletelyDisabled) return true;\n return typeof disableConfig === \"object\" && !!disableConfig[endpoint];\n };\n\n // Create individual routes instead of chaining\n\n // POST /{routeName} - Create One\n if (\n !isEndpointDisabled(\"createOne\") &&\n !hasCustomImplementation(`/${routeName}`, \"post\")\n ) {\n router.post(\n `/${routeName}`,\n authService.handleAuthenticationControl(authConfigs, \"create\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"create\",\n modelNameInKebab\n ),\n handleRequestBodyValidationAndTransformation(\n modelNameInKebab,\n \"create\"\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createOne\"\n ),\n middlewares?.beforeCreateOne ?? createOne,\n middlewares?.beforeCreateOne\n ? createOne\n : middlewares?.afterCreateOne ?? sendResponse,\n middlewares?.beforeCreateOne && middlewares?.afterCreateOne\n ? middlewares?.afterCreateOne\n : sendResponse,\n sendResponse\n );\n }\n\n // GET /{routeName} - Find Many\n if (\n !isEndpointDisabled(\"findMany\") &&\n !hasCustomImplementation(`/${routeName}`, \"get\")\n ) {\n router.get(\n `/${routeName}`,\n authService.handleAuthenticationControl(authConfigs, \"view\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"view\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findMany\"\n ),\n middlewares?.beforeFindMany ?? findMany,\n middlewares?.beforeFindMany\n ? findMany\n : middlewares?.afterFindMany ?? sendResponse,\n middlewares?.beforeFindMany && middlewares?.afterFindMany\n ? middlewares?.afterFindMany\n : sendResponse,\n sendResponse\n );\n }\n\n // POST /{routeName}/many - Create Many\n if (\n !isEndpointDisabled(\"createMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"post\")\n ) {\n router.post(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(authConfigs, \"create\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"create\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createMany\"\n ),\n middlewares?.beforeCreateMany ?? createMany,\n middlewares?.beforeCreateMany\n ? createMany\n : middlewares?.afterCreateMany ?? sendResponse,\n middlewares?.beforeCreateMany && middlewares?.afterCreateMany\n ? middlewares?.afterCreateMany\n : sendResponse,\n sendResponse\n );\n }\n\n // PATCH /{routeName}/many - Update Many\n if (\n !isEndpointDisabled(\"updateMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"patch\")\n ) {\n router.patch(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(authConfigs, \"update\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"update\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateMany\"\n ),\n middlewares?.beforeUpdateMany ?? updateMany,\n middlewares?.beforeUpdateMany\n ? updateMany\n : middlewares?.afterUpdateMany ?? sendResponse,\n middlewares?.beforeUpdateMany && middlewares?.afterUpdateMany\n ? middlewares?.afterUpdateMany\n : sendResponse,\n sendResponse\n );\n }\n\n // DELETE /{routeName}/many - Delete Many\n if (\n !isEndpointDisabled(\"deleteMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"delete\")\n ) {\n router.delete(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(authConfigs, \"delete\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"delete\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteMany\"\n ),\n middlewares?.beforeDeleteMany ?? deleteMany,\n middlewares?.beforeDeleteMany\n ? deleteMany\n : middlewares?.afterDeleteMany ?? sendResponse,\n middlewares?.beforeDeleteMany && middlewares?.afterDeleteMany\n ? middlewares?.afterDeleteMany\n : sendResponse,\n sendResponse\n );\n }\n\n // GET /{routeName}/:id - Find One\n if (\n !isEndpointDisabled(\"findOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"get\")\n ) {\n router.get(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(authConfigs, \"view\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"view\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findOne\"\n ),\n middlewares?.beforeFindOne ?? findOne,\n middlewares?.beforeFindOne\n ? findOne\n : middlewares?.afterFindOne ?? sendResponse,\n middlewares?.beforeFindOne && middlewares?.afterFindOne\n ? middlewares?.afterFindOne\n : sendResponse,\n sendResponse\n );\n }\n\n // PATCH /{routeName}/:id - Update One\n if (\n !isEndpointDisabled(\"updateOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"patch\")\n ) {\n router.patch(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(authConfigs, \"update\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"update\",\n modelNameInKebab\n ),\n handleRequestBodyValidationAndTransformation(\n modelNameInKebab,\n \"update\"\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateOne\"\n ),\n middlewares?.beforeUpdateOne ?? updateOne,\n middlewares?.beforeUpdateOne\n ? updateOne\n : middlewares?.afterUpdateOne ?? sendResponse,\n middlewares?.beforeUpdateOne && middlewares?.afterUpdateOne\n ? middlewares?.afterUpdateOne\n : sendResponse,\n sendResponse\n );\n }\n\n // DELETE /{routeName}/:id - Delete One\n if (\n !isEndpointDisabled(\"deleteOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"delete\")\n ) {\n router.delete(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(authConfigs, \"delete\"),\n authService.handleActionAccessControl(\n authConfigs,\n \"delete\",\n modelNameInKebab\n ),\n addPrismaQueryOptionsToRequestQuery<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteOne\"\n ),\n middlewares?.beforeDeleteOne ?? deleteOne,\n middlewares?.beforeDeleteOne\n ? deleteOne\n : middlewares?.afterDeleteOne ?? sendResponse,\n middlewares?.beforeDeleteOne && middlewares?.afterDeleteOne\n ? middlewares?.afterDeleteOne\n : sendResponse,\n sendResponse\n );\n }\n\n // // If the custom router has its own routes, add them\n // if (customRouterModule?.default) {\n // customRouter.stack.forEach((stack) => {\n // const { method, path, handle } = stack;\n // (router as any)[method.toLowerCase()](path, handle);\n // });\n // }\n });\n}\n"]}
@@ -11,10 +11,10 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  return t;
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.removeApiAction = removeApiAction;
14
15
  exports.isPrismaRelationFormat = isPrismaRelationFormat;
15
16
  exports.handleRelationFieldsInBody = handleRelationFieldsInBody;
16
17
  exports.canBeUsedToConnect = canBeUsedToConnect;
17
- exports.isListFieldAnArray = isListFieldAnArray;
18
18
  const models_helpers_1 = require("../../../../utils/helpers/models.helpers");
19
19
  function removeApiAction(obj) {
20
20
  if (!obj || typeof obj !== "object")
@@ -61,7 +61,7 @@ function handleRelationFieldsInBody(body, relationFields, ignoreActions = []) {
61
61
  if (isPrismaRelationFormat(body[field.name])) {
62
62
  return;
63
63
  }
64
- if (!isListFieldAnArray(body[field.name])) {
64
+ if (!Array.isArray(body[field.name])) {
65
65
  return;
66
66
  }
67
67
  const createData = [];
@@ -70,7 +70,8 @@ function handleRelationFieldsInBody(body, relationFields, ignoreActions = []) {
70
70
  const disconnectData = [];
71
71
  const deleteManyIds = [];
72
72
  (_a = body[field.name]) === null || _a === void 0 ? void 0 : _a.forEach((bodyField) => {
73
- if (ignoreActions.includes(bodyField === null || bodyField === void 0 ? void 0 : bodyField.apiAction))
73
+ var _a;
74
+ if ((_a = ignoreActions === null || ignoreActions === void 0 ? void 0 : ignoreActions.includes) === null || _a === void 0 ? void 0 : _a.call(ignoreActions, bodyField === null || bodyField === void 0 ? void 0 : bodyField.apiAction))
74
75
  return;
75
76
  const apiAction = bodyField === null || bodyField === void 0 ? void 0 : bodyField.apiAction;
76
77
  if (apiAction === "delete") {
@@ -113,10 +114,10 @@ function handleRelationFieldsInBody(body, relationFields, ignoreActions = []) {
113
114
  : {}));
114
115
  });
115
116
  (_b = relationFields === null || relationFields === void 0 ? void 0 : relationFields.singular) === null || _b === void 0 ? void 0 : _b.forEach((field) => {
116
- var _a;
117
+ var _a, _b;
117
118
  if (!body[field.name])
118
119
  return;
119
- if (ignoreActions.includes((_a = body[field.name]) === null || _a === void 0 ? void 0 : _a.apiAction))
120
+ if ((_a = ignoreActions === null || ignoreActions === void 0 ? void 0 : ignoreActions.includes) === null || _a === void 0 ? void 0 : _a.call(ignoreActions, (_b = body[field.name]) === null || _b === void 0 ? void 0 : _b.apiAction))
120
121
  return;
121
122
  if (isPrismaRelationFormat(body[field.name])) {
122
123
  return;
@@ -158,16 +159,16 @@ function handleRelationFieldsInBody(body, relationFields, ignoreActions = []) {
158
159
  return removeApiAction(mutableBody);
159
160
  }
160
161
  function canBeUsedToConnect(modelName, bodyField) {
161
- var _a;
162
+ var _a, _b, _c;
162
163
  if (!bodyField)
163
164
  return false;
164
- if (bodyField.apiAction && !["connect"].includes(bodyField.apiAction)) {
165
+ if (bodyField.apiAction && !((_b = (_a = ["connect"]) === null || _a === void 0 ? void 0 : _a.includes) === null || _b === void 0 ? void 0 : _b.call(_a, bodyField.apiAction))) {
165
166
  return false;
166
167
  }
167
168
  if (bodyField.apiAction === "connect") {
168
169
  return true;
169
170
  }
170
- if (((_a = Object.keys(bodyField)) === null || _a === void 0 ? void 0 : _a.length) === 1 && (bodyField === null || bodyField === void 0 ? void 0 : bodyField.id)) {
171
+ if (((_c = Object.keys(bodyField)) === null || _c === void 0 ? void 0 : _c.length) === 1 && (bodyField === null || bodyField === void 0 ? void 0 : bodyField.id)) {
171
172
  return true;
172
173
  }
173
174
  const uniqueFields = (0, models_helpers_1.getModelUniqueFields)(modelName);
@@ -177,7 +178,4 @@ function canBeUsedToConnect(modelName, bodyField) {
177
178
  }
178
179
  return false;
179
180
  }
180
- function isListFieldAnArray(field) {
181
- return Array.isArray(field);
182
- }
183
181
  //# sourceMappingURL=base.service.helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.service.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.service.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getPrismaModelRelations,\n RelationFields,\n getModelUniqueFields,\n} from \"../../../../utils/helpers/models.helpers\";\n\n/**\n * Removes apiAction field from an object and all nested objects\n *\n * @param {Record<string, any>} obj - The object to clean\n * @returns {Record<string, any>} - The cleaned object\n */\nfunction removeApiAction(obj: Record<string, any>): Record<string, any> {\n if (!obj || typeof obj !== \"object\") return obj;\n\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"apiAction\") continue;\n\n if (Array.isArray(value)) {\n result[key] = value.map((item) =>\n typeof item === \"object\" && item !== null ? removeApiAction(item) : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n result[key] = removeApiAction(value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Checks if an object is already formatted as a Prisma relation operation\n *\n * @param {Record<string, any>} obj - The object to check\n * @returns {boolean} - True if the object contains Prisma relation operations\n */\nexport function isPrismaRelationFormat(obj: Record<string, any>): boolean {\n if (!obj || typeof obj !== \"object\") return false;\n\n // Common Prisma relation operations\n const prismaOperations = [\n \"create\",\n \"connect\",\n \"update\",\n \"delete\",\n \"disconnect\",\n \"deleteMany\",\n \"connectOrCreate\",\n \"upsert\",\n \"set\",\n ];\n\n // Check if any key is a Prisma operation\n return prismaOperations.some((op) => op in obj);\n}\n\n/**\n * Determines the appropriate Prisma operation (`create`, `connect`, `update`, `delete`, or `disconnect`)\n * for each relation field in the provided body based on its nested data and recursively does the same for each relation field.\n *\n * This function handles the following types of relations:\n * - **One-to-one**\n * - **One-to-many**\n *\n *\n * ### Operation Rules:\n *\n *\n * - **Create**: Used when the nested relation data is provided **without an `id` or unique field**.\n * - **Connect**: Used when the nested relation data contains **only an `id` or a unique field** (e.g., email).\n * - **Update**: Used when the nested relation data contains **both an `id` and additional fields**.\n * - **Delete**: Used when the nested relation data includes **`apiAction: \"delete\"`**.\n * - **Disconnect**: Used when the nested relation data includes **`apiAction: \"disconnect\"`**.\n *\n * The function will preserve existing Prisma operation formats if detected,\n * allowing developers to manually structure relation operations when needed.\n *\n * @param {Record<string, any>} body - The object containing relation fields to be processed.\n * @param {Object} relationFields - Defines relation field types.\n * @param {RelationFields[]} relationFields.singular - List of one-side relation field names (one-to-one).\n * @param {RelationFields[]} relationFields.list - List of many-side relation field names (one-to-many).\n * @param {string[]} ignoreActions - Optional list of apiAction values to ignore.\n * @returns {Record<string, any>} The transformed data with appropriate Prisma operations applied.\n */\nexport function handleRelationFieldsInBody(\n body: Record<string, any>,\n relationFields: RelationFields,\n ignoreActions: string[] = []\n) {\n let mutableBody = { ...body };\n\n relationFields?.list?.forEach((field) => {\n if (!body[field.name]) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n // Skip if the field is not an array (likely already handled manually)\n if (!isListFieldAnArray(body[field.name])) {\n return;\n }\n\n const createData: any[] = [];\n const connectData: any[] = [];\n const updateData: any[] = [];\n const disconnectData: any[] = [];\n const deleteManyIds: any[] = [];\n\n body[field.name]?.forEach((bodyField: any) => {\n if (ignoreActions.includes(bodyField?.apiAction)) return;\n\n const apiAction = bodyField?.apiAction;\n\n if (apiAction === \"delete\") {\n deleteManyIds.push(bodyField.id);\n } else if (apiAction === \"disconnect\") {\n disconnectData.push({ id: bodyField.id });\n } else if (canBeUsedToConnect(field.type, bodyField)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = bodyField;\n connectData.push(cleanedData);\n } else if (!bodyField?.id) {\n // If no ID, assume create operation\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = { ...bodyField };\n\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n dataToPush,\n nestedRelations,\n ignoreActions\n );\n }\n\n // Ensure apiAction is removed\n if (\"apiAction\" in dataToPush) {\n const { apiAction: _, ...rest } = dataToPush;\n dataToPush = rest;\n }\n\n createData.push(dataToPush);\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = bodyField;\n\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = data;\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n updateData.push({\n where: { id },\n data: dataToPush,\n });\n }\n });\n\n mutableBody[field.name] = {\n ...(createData.length ? { create: createData } : {}),\n ...(connectData.length ? { connect: connectData } : {}),\n ...(updateData.length ? { update: updateData } : {}),\n ...(disconnectData.length ? { disconnect: disconnectData } : {}),\n ...(deleteManyIds.length\n ? { deleteMany: { id: { in: deleteManyIds } } }\n : {}),\n };\n });\n\n relationFields?.singular?.forEach((field) => {\n if (!body[field.name]) return;\n if (ignoreActions.includes(body[field.name]?.apiAction)) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n const relationData = body[field.name];\n let nestedRelations = getPrismaModelRelations(field.type);\n\n if (canBeUsedToConnect(field.type, relationData)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = relationData;\n mutableBody[field.name] = { connect: cleanedData };\n } else if (!relationData?.id) {\n // If no ID, assume create operation\n let dataToCreate = { ...relationData };\n\n if (\"apiAction\" in dataToCreate) {\n const { apiAction: _, ...rest } = dataToCreate;\n dataToCreate = rest;\n }\n\n if (nestedRelations) {\n dataToCreate = handleRelationFieldsInBody(\n dataToCreate,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = { create: dataToCreate };\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = relationData;\n\n let dataToUpdate = data;\n if (nestedRelations) {\n dataToUpdate = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = {\n update: {\n data: dataToUpdate,\n },\n };\n }\n });\n\n // Remove any remaining apiAction fields from the top level\n if (\"apiAction\" in mutableBody) {\n const { apiAction, ...rest } = mutableBody;\n mutableBody = rest;\n }\n\n // As a final step, recursively remove any remaining apiAction fields\n return removeApiAction(mutableBody);\n}\n\n/**\n * Checks if a field value can be used to connect to a model\n * This happens when the field contains only an ID or a single unique field\n *\n * @param {string} modelName - The model name to get unique fields for\n * @param {Record<string, any>} bodyField - The field value from the body\n * @returns {boolean} True if the field can be used for a connect operation\n */\nexport function canBeUsedToConnect(\n modelName: string,\n bodyField: Record<string, any> | undefined | null\n): boolean {\n // If the field is null or undefined, it can't be used to connect\n if (!bodyField) return false;\n\n // If the field has an apiAction that's not for connecting, return false\n if (bodyField.apiAction && ![\"connect\"].includes(bodyField.apiAction)) {\n return false;\n }\n\n // If explicitly marked for connect, allow it\n if (bodyField.apiAction === \"connect\") {\n return true;\n }\n\n // If only ID is present, it can be used to connect\n if (Object.keys(bodyField)?.length === 1 && bodyField?.id) {\n return true;\n }\n\n // Get unique fields for the model\n const uniqueFields = getModelUniqueFields(modelName);\n\n // If the field has exactly one property and it's a unique field, it can be used to connect\n if (Object.keys(bodyField).length === 1) {\n const fieldName = Object.keys(bodyField)[0];\n return uniqueFields?.some((field) => field.name === fieldName);\n }\n\n return false;\n}\n\n/**\n * Checks if a list field is actually an array\n *\n * @param {any} field - The field to check\n * @returns {boolean} - True if the field is an array\n */\nexport function isListFieldAnArray(field: any): boolean {\n return Array.isArray(field);\n}\n"]}
1
+ {"version":3,"file":"base.service.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.service.helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAYA,0CAoBC;AAQD,wDAkBC;AA8BD,gEA4JC;AAUD,gDAgCC;AA9RD,6EAIkD;AAQlD,SAAgB,eAAe,CAAC,GAAwB;IACtD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAEhD,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,GAAG,KAAK,WAAW;YAAE,SAAS;QAElC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC/B,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CACzE,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD,SAAgB,sBAAsB,CAAC,GAAwB;IAC7D,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAGlD,MAAM,gBAAgB,GAAG;QACvB,QAAQ;QACR,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,YAAY;QACZ,YAAY;QACZ,iBAAiB;QACjB,QAAQ;QACR,KAAK;KACN,CAAC;IAGF,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;AAClD,CAAC;AA8BD,SAAgB,0BAA0B,CACxC,IAAyB,EACzB,cAA8B,EAC9B,gBAA0B,EAAE;;IAE5B,IAAI,WAAW,qBAAQ,IAAI,CAAE,CAAC;IAE9B,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,0CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;;QACtC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO;QAG9B,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QAGD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAU,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAU,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAU,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAU,EAAE,CAAC;QACjC,MAAM,aAAa,GAAU,EAAE,CAAC;QAEhC,MAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,0CAAE,OAAO,CAAC,CAAC,SAAc,EAAE,EAAE;;YAC3C,IAAI,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,QAAQ,8DAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,CAAC;gBAAE,OAAO;YAE5D,MAAM,SAAS,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,CAAC;YAEvC,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC3B,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACnC,CAAC;iBAAM,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;gBACtC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,CAAC;iBAAM,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;gBAErD,MAAM,EAAE,SAAS,EAAE,CAAC,KAAqB,SAAS,EAAzB,WAAW,UAAK,SAAS,EAA5C,aAAgC,CAAY,CAAC;gBACnD,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChC,CAAC;iBAAM,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,EAAE,CAAA,EAAE,CAAC;gBAE1B,IAAI,eAAe,GAAG,IAAA,wCAAuB,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE1D,IAAI,UAAU,qBAAQ,SAAS,CAAE,CAAC;gBAElC,IAAI,eAAe,EAAE,CAAC;oBACpB,UAAU,GAAG,0BAA0B,CACrC,UAAU,EACV,eAAe,EACf,aAAa,CACd,CAAC;gBACJ,CAAC;gBAGD,IAAI,WAAW,IAAI,UAAU,EAAE,CAAC;oBAC9B,MAAM,EAAE,SAAS,EAAE,CAAC,KAAc,UAAU,EAAnB,IAAI,UAAK,UAAU,EAAtC,aAAyB,CAAa,CAAC;oBAC7C,UAAU,GAAG,IAAI,CAAC;gBACpB,CAAC;gBAED,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBAEN,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAc,SAAS,EAAlB,IAAI,UAAK,SAAS,EAAzC,mBAA6B,CAAY,CAAC;gBAEhD,IAAI,eAAe,GAAG,IAAA,wCAAuB,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE1D,IAAI,UAAU,GAAG,IAAI,CAAC;gBACtB,IAAI,eAAe,EAAE,CAAC;oBACpB,UAAU,GAAG,0BAA0B,CACrC,IAAI,EACJ,eAAe,EACf,aAAa,CACd,CAAC;gBACJ,CAAC;gBAED,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK,EAAE,EAAE,EAAE,EAAE;oBACb,IAAI,EAAE,UAAU;iBACjB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,6EAClB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GACjD,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GACpD,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GACjD,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC7D,CAAC,aAAa,CAAC,MAAM;YACtB,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;YAC/C,CAAC,CAAC,EAAE,CAAC,CACR,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,QAAQ,0CAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;;QAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO;QAC9B,IAAI,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,QAAQ,8DAAG,MAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,0CAAE,SAAS,CAAC;YAAE,OAAO;QAGnE,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,eAAe,GAAG,IAAA,wCAAuB,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1D,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;YAEjD,MAAM,EAAE,SAAS,EAAE,CAAC,KAAqB,YAAY,EAA5B,WAAW,UAAK,YAAY,EAA/C,aAAgC,CAAe,CAAC;YACtD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACrD,CAAC;aAAM,IAAI,CAAC,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,EAAE,CAAA,EAAE,CAAC;YAE7B,IAAI,YAAY,qBAAQ,YAAY,CAAE,CAAC;YAEvC,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;gBAChC,MAAM,EAAE,SAAS,EAAE,CAAC,KAAc,YAAY,EAArB,IAAI,UAAK,YAAY,EAAxC,aAAyB,CAAe,CAAC;gBAC/C,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;YAED,IAAI,eAAe,EAAE,CAAC;gBACpB,YAAY,GAAG,0BAA0B,CACvC,YAAY,EACZ,eAAe,EACf,aAAa,CACd,CAAC;YACJ,CAAC;YAED,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QACrD,CAAC;aAAM,CAAC;YAEN,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAc,YAAY,EAArB,IAAI,UAAK,YAAY,EAA5C,mBAA6B,CAAe,CAAC;YAEnD,IAAI,YAAY,GAAG,IAAI,CAAC;YACxB,IAAI,eAAe,EAAE,CAAC;gBACpB,YAAY,GAAG,0BAA0B,CACvC,IAAI,EACJ,eAAe,EACf,aAAa,CACd,CAAC;YACJ,CAAC;YAED,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;gBACxB,MAAM,EAAE;oBACN,IAAI,EAAE,YAAY;iBACnB;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAGH,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,EAAE,SAAS,KAAc,WAAW,EAApB,IAAI,UAAK,WAAW,EAApC,aAAsB,CAAc,CAAC;QAC3C,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IAGD,OAAO,eAAe,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC;AAUD,SAAgB,kBAAkB,CAChC,SAAiB,EACjB,SAAiD;;IAGjD,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAG7B,IAAI,SAAS,CAAC,SAAS,IAAI,CAAC,CAAA,MAAA,MAAA,CAAC,SAAS,CAAC,0CAAE,QAAQ,mDAAG,SAAS,CAAC,SAAS,CAAC,CAAA,EAAE,CAAC;QACzE,OAAO,KAAK,CAAC;IACf,CAAC;IAGD,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,IAAI,CAAA,MAAA,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,0CAAE,MAAM,MAAK,CAAC,KAAI,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,EAAE,CAAA,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,MAAM,YAAY,GAAG,IAAA,qCAAoB,EAAC,SAAS,CAAC,CAAC;IAGrD,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import {\n getPrismaModelRelations,\n RelationFields,\n getModelUniqueFields,\n} from \"../../../../utils/helpers/models.helpers\";\n\n/**\n * Removes apiAction field from an object and all nested objects\n *\n * @param {Record<string, any>} obj - The object to clean\n * @returns {Record<string, any>} - The cleaned object\n */\nexport function removeApiAction(obj: Record<string, any>): Record<string, any> {\n if (!obj || typeof obj !== \"object\") return obj;\n\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"apiAction\") continue;\n\n if (Array.isArray(value)) {\n result[key] = value.map((item) =>\n typeof item === \"object\" && item !== null ? removeApiAction(item) : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n result[key] = removeApiAction(value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Checks if an object is already formatted as a Prisma relation operation\n *\n * @param {Record<string, any>} obj - The object to check\n * @returns {boolean} - True if the object contains Prisma relation operations\n */\nexport function isPrismaRelationFormat(obj: Record<string, any>): boolean {\n if (!obj || typeof obj !== \"object\") return false;\n\n // Common Prisma relation operations\n const prismaOperations = [\n \"create\",\n \"connect\",\n \"update\",\n \"delete\",\n \"disconnect\",\n \"deleteMany\",\n \"connectOrCreate\",\n \"upsert\",\n \"set\",\n ];\n\n // Check if any key is a Prisma operation\n return prismaOperations.some((op) => op in obj);\n}\n\n/**\n * Determines the appropriate Prisma operation (`create`, `connect`, `update`, `delete`, or `disconnect`)\n * for each relation field in the provided body based on its nested data and recursively does the same for each relation field.\n *\n * This function handles the following types of relations:\n * - **One-to-one**\n * - **One-to-many**\n *\n *\n * ### Operation Rules:\n *\n *\n * - **Create**: Used when the nested relation data is provided **without an `id` or unique field**.\n * - **Connect**: Used when the nested relation data contains **only an `id` or a unique field** (e.g., email).\n * - **Update**: Used when the nested relation data contains **both an `id` and additional fields**.\n * - **Delete**: Used when the nested relation data includes **`apiAction: \"delete\"`**.\n * - **Disconnect**: Used when the nested relation data includes **`apiAction: \"disconnect\"`**.\n *\n * The function will preserve existing Prisma operation formats if detected,\n * allowing developers to manually structure relation operations when needed.\n *\n * @param {Record<string, any>} body - The object containing relation fields to be processed.\n * @param {Object} relationFields - Defines relation field types.\n * @param {RelationFields[]} relationFields.singular - List of one-side relation field names (one-to-one).\n * @param {RelationFields[]} relationFields.list - List of many-side relation field names (one-to-many).\n * @param {string[]} ignoreActions - Optional list of apiAction values to ignore.\n * @returns {Record<string, any>} The transformed data with appropriate Prisma operations applied.\n */\nexport function handleRelationFieldsInBody(\n body: Record<string, any>,\n relationFields: RelationFields,\n ignoreActions: string[] = []\n) {\n let mutableBody = { ...body };\n\n relationFields?.list?.forEach((field) => {\n if (!body[field.name]) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n // Skip if the field is not an array (likely already handled manually)\n if (!Array.isArray(body[field.name])) {\n return;\n }\n\n const createData: any[] = [];\n const connectData: any[] = [];\n const updateData: any[] = [];\n const disconnectData: any[] = [];\n const deleteManyIds: any[] = [];\n\n body[field.name]?.forEach((bodyField: any) => {\n if (ignoreActions?.includes?.(bodyField?.apiAction)) return;\n\n const apiAction = bodyField?.apiAction;\n\n if (apiAction === \"delete\") {\n deleteManyIds.push(bodyField.id);\n } else if (apiAction === \"disconnect\") {\n disconnectData.push({ id: bodyField.id });\n } else if (canBeUsedToConnect(field.type, bodyField)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = bodyField;\n connectData.push(cleanedData);\n } else if (!bodyField?.id) {\n // If no ID, assume create operation\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = { ...bodyField };\n\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n dataToPush,\n nestedRelations,\n ignoreActions\n );\n }\n\n // Ensure apiAction is removed\n if (\"apiAction\" in dataToPush) {\n const { apiAction: _, ...rest } = dataToPush;\n dataToPush = rest;\n }\n\n createData.push(dataToPush);\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = bodyField;\n\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = data;\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n updateData.push({\n where: { id },\n data: dataToPush,\n });\n }\n });\n\n mutableBody[field.name] = {\n ...(createData.length ? { create: createData } : {}),\n ...(connectData.length ? { connect: connectData } : {}),\n ...(updateData.length ? { update: updateData } : {}),\n ...(disconnectData.length ? { disconnect: disconnectData } : {}),\n ...(deleteManyIds.length\n ? { deleteMany: { id: { in: deleteManyIds } } }\n : {}),\n };\n });\n\n relationFields?.singular?.forEach((field) => {\n if (!body[field.name]) return;\n if (ignoreActions?.includes?.(body[field.name]?.apiAction)) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n const relationData = body[field.name];\n let nestedRelations = getPrismaModelRelations(field.type);\n\n if (canBeUsedToConnect(field.type, relationData)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = relationData;\n mutableBody[field.name] = { connect: cleanedData };\n } else if (!relationData?.id) {\n // If no ID, assume create operation\n let dataToCreate = { ...relationData };\n\n if (\"apiAction\" in dataToCreate) {\n const { apiAction: _, ...rest } = dataToCreate;\n dataToCreate = rest;\n }\n\n if (nestedRelations) {\n dataToCreate = handleRelationFieldsInBody(\n dataToCreate,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = { create: dataToCreate };\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = relationData;\n\n let dataToUpdate = data;\n if (nestedRelations) {\n dataToUpdate = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = {\n update: {\n data: dataToUpdate,\n },\n };\n }\n });\n\n // Remove any remaining apiAction fields from the top level\n if (\"apiAction\" in mutableBody) {\n const { apiAction, ...rest } = mutableBody;\n mutableBody = rest;\n }\n\n // As a final step, recursively remove any remaining apiAction fields\n return removeApiAction(mutableBody);\n}\n\n/**\n * Checks if a field value can be used to connect to a model\n * This happens when the field contains only an ID or a single unique field\n *\n * @param {string} modelName - The model name to get unique fields for\n * @param {Record<string, any>} bodyField - The field value from the body\n * @returns {boolean} True if the field can be used for a connect operation\n */\nexport function canBeUsedToConnect(\n modelName: string,\n bodyField: Record<string, any> | undefined | null\n): boolean {\n // If the field is null or undefined, it can't be used to connect\n if (!bodyField) return false;\n\n // If the field has an apiAction that's not for connecting, return false\n if (bodyField.apiAction && ![\"connect\"]?.includes?.(bodyField.apiAction)) {\n return false;\n }\n\n // If explicitly marked for connect, allow it\n if (bodyField.apiAction === \"connect\") {\n return true;\n }\n\n // If only ID is present, it can be used to connect\n if (Object.keys(bodyField)?.length === 1 && bodyField?.id) {\n return true;\n }\n\n // Get unique fields for the model\n const uniqueFields = getModelUniqueFields(modelName);\n\n // If the field has exactly one property and it's a unique field, it can be used to connect\n if (Object.keys(bodyField).length === 1) {\n const fieldName = Object.keys(bodyField)[0];\n return uniqueFields?.some((field) => field.name === fieldName);\n }\n\n return false;\n}\n\n// /**\n// * Checks if a list field is actually an array\n// *\n// * @param {any} field - The field to check\n// * @returns {boolean} - True if the field is an array\n// */\n// export function isListFieldAnArray(field: any): boolean {\n// return Array.isArray(field);\n// }\n"]}
@@ -107,6 +107,8 @@ function sendProductionError(err, req, res) {
107
107
  res.status(err.statusCode).json({
108
108
  status: err.status,
109
109
  message: err.message,
110
+ meta: err.meta || {},
111
+ code: err.code || "",
110
112
  });
111
113
  else
112
114
  res.status(500).json({
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.controller.js","sourceRoot":"","sources":["../../../../src/modules/error-handler/error-handler.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport AppError from \"./utils/app-error\";\nimport * as errorControllerHelper from \"./utils/error-handler.helpers\";\nimport { server } from \"../../server\";\n\n/**\n * Error handling middleware for Express.\n *\n * This middleware function handles all errors in the Express application.\n * It checks for the environment (development or production) and sends appropriate error responses\n * based on whether the environment is production or not. It also maps specific errors such as\n * JWT errors, Prisma client errors, and database-related errors to specific helper functions for handling.\n *\n * @param {AppError} err - The error object thrown by the application.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n * @param {NextFunction} next - The next middleware function in the chain.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nexport default function errorHandler(\n err: AppError,\n req: Request,\n res: Response,\n next: NextFunction\n): void {\n // Default error status\n err.statusCode = err.statusCode || 500;\n err.status = err.status || \"error\";\n\n // If the environment is not production, send detailed error information\n if (process.env.NODE_ENV !== \"production\") {\n sendDevelopmentError(err, req, res);\n return;\n }\n\n // Prepare error object for response, copying the original error's properties\n let error = { ...err, message: err.message };\n\n // Handle specific error cases (JWT errors, Prisma validation errors, etc.)\n if (err.name === \"JsonWebTokenError\")\n error = errorControllerHelper.handleJWTError();\n if (err.name === \"TokenExpiredError\")\n error = errorControllerHelper.handleJWTExpired();\n\n // Handle specific Prisma client validation errors\n if (err.name === \"PrismaClientValidationError\")\n error = errorControllerHelper.handlePrismaClientValidationError(err);\n\n // Handle Prisma database-specific error codes (P1000 to P3005)\n if (err.code === \"P1000\")\n error = errorControllerHelper.handleAuthenticationError(err);\n if (err.code === \"P1001\")\n error = errorControllerHelper.handleServerNotReachableError(err);\n if (err.code === \"P1002\")\n error = errorControllerHelper.handleConnectionTimeoutError(err);\n if (err.code === \"P1003\")\n error = errorControllerHelper.handleDatabaseNotFoundError(err);\n if (err.code === \"P2000\")\n error = errorControllerHelper.handleFieldValueTooLargeError(err);\n if (err.code === \"P2001\")\n error = errorControllerHelper.handleRecordNotFoundError(err);\n if (err.code === \"P2002\")\n error = errorControllerHelper.handleUniqueConstraintError(err);\n if (err.code === \"P2003\")\n error = errorControllerHelper.handleForeignKeyConstraintError(err);\n if (err.code === \"P2004\")\n error = errorControllerHelper.handleConstraintFailedError(err);\n if (err.code === \"P3000\")\n error = errorControllerHelper.handleSchemaCreationFailedError(err);\n if (err.code === \"P3001\")\n error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);\n if (err.code === \"P3002\")\n error = errorControllerHelper.handleMigrationScriptFailedError(err);\n if (err.code === \"P3003\")\n error = errorControllerHelper.handleVersionMismatchError(err);\n\n // Handle general error types (e.g., syntax errors, type errors, etc.)\n // if (err.name === \"SyntaxError\")\n // error = errorControllerHelper.handleSchemaSyntaxError(err);\n // if (err.name === \"TypeError\")\n // error = errorControllerHelper.handleClientTypeError(err);\n // if (err.name === \"BinaryError\")\n // error = errorControllerHelper.handleBinaryError(err);\n if (err.name === \"NetworkError\")\n error = errorControllerHelper.handleNetworkError(err);\n // if (err.name === \"UnhandledPromiseRejection\")\n // error = errorControllerHelper.handleUnhandledPromiseError(err);\n if (!err.isOperational) error = new AppError(\"Something went wrong!\", 500);\n\n // Send the error response for production environment\n sendProductionError(error, req, res);\n}\n\n/**\n * Sends a detailed error response in development mode.\n *\n * In development, the error response includes full error details, including\n * the stack trace and the complete error message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendDevelopmentError(\n err: AppError,\n req: Request,\n res: Response\n): void {\n console.error(\"[\\x1b[31mERROR\\x1b[0m]:\", err);\n\n if (req.originalUrl.startsWith(\"/api\"))\n res.status(err.statusCode).json({\n message: err.message.split(\"\\n\")[err.message.split(\"\\n\").length - 1],\n error: err,\n stack: err.stack?.split(\"\\n\"),\n });\n else\n res.status(err.statusCode).json({\n title: \"Something went wrong!\",\n message: err.message,\n });\n}\n\n/**\n * Sends a generic error response in production mode.\n *\n * In production, sensitive error details (such as stack traces) are not exposed\n * to the client. Only operational errors are shown with a generic message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendProductionError(err: AppError, req: Request, res: Response): void {\n if (req.originalUrl.startsWith(\"/api\")) {\n if (err.isOperational)\n res.status(err.statusCode).json({\n status: err.status,\n message: err.message,\n });\n else\n res.status(500).json({\n status: \"error\",\n message: \"Something went wrong!\",\n });\n\n return;\n }\n\n if (err.isOperational) {\n res.status(err.statusCode).json({\n title: \"Something went wrong!\",\n message: err.message,\n });\n return;\n }\n\n res.status(err.statusCode).json({\n title: \"Something went wrong!\",\n message: \"Please try again later.\",\n });\n}\n\n/**\n * Gracefully handles process termination by listening for SIGTERM signal.\n *\n * - In production and staging environments, it will log a shutdown message\n * and attempt to close the server gracefully.\n * - In development or non-production environments, it will immediately exit the process.\n *\n * @returns {void}\n */\nprocess.on(\"SIGTERM\", () => {\n if (\n process.env.NODE_ENV !== \"production\" &&\n process.env.NODE_ENV !== \"staging\"\n ) {\n process.exit();\n } else {\n console.error(\"SIGTERM RECEIVED in Production. Shutting down gracefully!\");\n\n server.close(() => {\n console.error(\"Process terminated!!!\");\n });\n }\n});\n"]}
1
+ {"version":3,"file":"error-handler.controller.js","sourceRoot":"","sources":["../../../../src/modules/error-handler/error-handler.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,+BAwEC;AA3FD,kEAAyC;AACzC,qFAAuE;AACvE,yCAAsC;AAiBtC,SAAwB,YAAY,CAClC,GAAa,EACb,GAAY,EACZ,GAAa,EACb,IAAkB;IAGlB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC;IACvC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC;IAGnC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAGD,IAAI,KAAK,mCAAQ,GAAG,KAAE,OAAO,EAAE,GAAG,CAAC,OAAO,GAAE,CAAC;IAG7C,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB;QAClC,KAAK,GAAG,qBAAqB,CAAC,cAAc,EAAE,CAAC;IACjD,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB;QAClC,KAAK,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,CAAC;IAGnD,IAAI,GAAG,CAAC,IAAI,KAAK,6BAA6B;QAC5C,KAAK,GAAG,qBAAqB,CAAC,iCAAiC,CAAC,GAAG,CAAC,CAAC;IAGvE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC/D,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC;IACnE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;IAClE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC;IACnE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC/D,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,+BAA+B,CAAC,GAAG,CAAC,CAAC;IACrE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,+BAA+B,CAAC,GAAG,CAAC,CAAC;IACrE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,kCAAkC,CAAC,GAAG,CAAC,CAAC;IACxE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,gCAAgC,CAAC,GAAG,CAAC,CAAC;IACtE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,GAAG,qBAAqB,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAShE,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc;QAC7B,KAAK,GAAG,qBAAqB,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAGxD,IAAI,CAAC,GAAG,CAAC,aAAa;QAAE,KAAK,GAAG,IAAI,mBAAQ,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;IAG3E,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAcD,SAAS,oBAAoB,CAC3B,GAAa,EACb,GAAY,EACZ,GAAa;;IAEb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IAE9C,IAAI,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;QACpC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC9B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACpE,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,MAAA,GAAG,CAAC,KAAK,0CAAE,KAAK,CAAC,IAAI,CAAC;SAC9B,CAAC,CAAC;;QAEH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC9B,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;AACP,CAAC;AAcD,SAAS,mBAAmB,CAAC,GAAa,EAAE,GAAY,EAAE,GAAa;IACrE,IAAI,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,IAAI,GAAG,CAAC,aAAa;YACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;gBAC9B,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;aACrB,CAAC,CAAC;;YAEH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;QAEL,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC9B,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QAC9B,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,yBAAyB;KACnC,CAAC,CAAC;AACL,CAAC;AAWD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,IACE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QACrC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,EAClC,CAAC;QACD,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAE3E,eAAM,CAAC,KAAK,CAAC,GAAG,EAAE;YAChB,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport AppError from \"./utils/app-error\";\nimport * as errorControllerHelper from \"./utils/error-handler.helpers\";\nimport { server } from \"../../server\";\n\n/**\n * Error handling middleware for Express.\n *\n * This middleware function handles all errors in the Express application.\n * It checks for the environment (development or production) and sends appropriate error responses\n * based on whether the environment is production or not. It also maps specific errors such as\n * JWT errors, Prisma client errors, and database-related errors to specific helper functions for handling.\n *\n * @param {AppError} err - The error object thrown by the application.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n * @param {NextFunction} next - The next middleware function in the chain.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nexport default function errorHandler(\n err: AppError,\n req: Request,\n res: Response,\n next: NextFunction\n): void {\n // Default error status\n err.statusCode = err.statusCode || 500;\n err.status = err.status || \"error\";\n\n // If the environment is not production, send detailed error information\n if (process.env.NODE_ENV !== \"production\") {\n sendDevelopmentError(err, req, res);\n return;\n }\n\n // Prepare error object for response, copying the original error's properties\n let error = { ...err, message: err.message };\n\n // Handle specific error cases (JWT errors, Prisma validation errors, etc.)\n if (err.name === \"JsonWebTokenError\")\n error = errorControllerHelper.handleJWTError();\n if (err.name === \"TokenExpiredError\")\n error = errorControllerHelper.handleJWTExpired();\n\n // Handle specific Prisma client validation errors\n if (err.name === \"PrismaClientValidationError\")\n error = errorControllerHelper.handlePrismaClientValidationError(err);\n\n // Handle Prisma database-specific error codes (P1000 to P3005)\n if (err.code === \"P1000\")\n error = errorControllerHelper.handleAuthenticationError(err);\n if (err.code === \"P1001\")\n error = errorControllerHelper.handleServerNotReachableError(err);\n if (err.code === \"P1002\")\n error = errorControllerHelper.handleConnectionTimeoutError(err);\n if (err.code === \"P1003\")\n error = errorControllerHelper.handleDatabaseNotFoundError(err);\n if (err.code === \"P2000\")\n error = errorControllerHelper.handleFieldValueTooLargeError(err);\n if (err.code === \"P2001\")\n error = errorControllerHelper.handleRecordNotFoundError(err);\n if (err.code === \"P2002\")\n error = errorControllerHelper.handleUniqueConstraintError(err);\n if (err.code === \"P2003\")\n error = errorControllerHelper.handleForeignKeyConstraintError(err);\n if (err.code === \"P2004\")\n error = errorControllerHelper.handleConstraintFailedError(err);\n if (err.code === \"P3000\")\n error = errorControllerHelper.handleSchemaCreationFailedError(err);\n if (err.code === \"P3001\")\n error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);\n if (err.code === \"P3002\")\n error = errorControllerHelper.handleMigrationScriptFailedError(err);\n if (err.code === \"P3003\")\n error = errorControllerHelper.handleVersionMismatchError(err);\n\n // Handle general error types (e.g., syntax errors, type errors, etc.)\n // if (err.name === \"SyntaxError\")\n // error = errorControllerHelper.handleSchemaSyntaxError(err);\n // if (err.name === \"TypeError\")\n // error = errorControllerHelper.handleClientTypeError(err);\n // if (err.name === \"BinaryError\")\n // error = errorControllerHelper.handleBinaryError(err);\n if (err.name === \"NetworkError\")\n error = errorControllerHelper.handleNetworkError(err);\n // if (err.name === \"UnhandledPromiseRejection\")\n // error = errorControllerHelper.handleUnhandledPromiseError(err);\n if (!err.isOperational) error = new AppError(\"Something went wrong!\", 500);\n\n // Send the error response for production environment\n sendProductionError(error, req, res);\n}\n\n/**\n * Sends a detailed error response in development mode.\n *\n * In development, the error response includes full error details, including\n * the stack trace and the complete error message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendDevelopmentError(\n err: AppError,\n req: Request,\n res: Response\n): void {\n console.error(\"[\\x1b[31mERROR\\x1b[0m]:\", err);\n\n if (req.originalUrl.startsWith(\"/api\"))\n res.status(err.statusCode).json({\n message: err.message.split(\"\\n\")[err.message.split(\"\\n\").length - 1],\n error: err,\n stack: err.stack?.split(\"\\n\"),\n });\n else\n res.status(err.statusCode).json({\n title: \"Something went wrong!\",\n message: err.message,\n });\n}\n\n/**\n * Sends a generic error response in production mode.\n *\n * In production, sensitive error details (such as stack traces) are not exposed\n * to the client. Only operational errors are shown with a generic message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendProductionError(err: AppError, req: Request, res: Response): void {\n if (req.originalUrl.startsWith(\"/api\")) {\n if (err.isOperational)\n res.status(err.statusCode).json({\n status: err.status,\n message: err.message,\n meta: err.meta || {},\n code: err.code || \"\",\n });\n else\n res.status(500).json({\n status: \"error\",\n message: \"Something went wrong!\",\n });\n\n return;\n }\n\n if (err.isOperational) {\n res.status(err.statusCode).json({\n title: \"Something went wrong!\",\n message: err.message,\n });\n return;\n }\n\n res.status(err.statusCode).json({\n title: \"Something went wrong!\",\n message: \"Please try again later.\",\n });\n}\n\n/**\n * Gracefully handles process termination by listening for SIGTERM signal.\n *\n * - In production and staging environments, it will log a shutdown message\n * and attempt to close the server gracefully.\n * - In development or non-production environments, it will immediately exit the process.\n *\n * @returns {void}\n */\nprocess.on(\"SIGTERM\", () => {\n if (\n process.env.NODE_ENV !== \"production\" &&\n process.env.NODE_ENV !== \"staging\"\n ) {\n process.exit();\n } else {\n console.error(\"SIGTERM RECEIVED in Production. Shutting down gracefully!\");\n\n server.close(() => {\n console.error(\"Process terminated!!!\");\n });\n }\n});\n"]}
@@ -11,7 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  const catchAsync = (fn) => (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
13
13
  try {
14
- yield fn(req, res, next);
14
+ return yield fn(req, res, next);
15
15
  }
16
16
  catch (err) {
17
17
  next(err);
@@ -1 +1 @@
1
- {"version":3,"file":"catch-async.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/catch-async.ts"],"names":[],"mappings":";;;;;;;;;;;AAuBA,MAAM,UAAU,GACd,CAAC,EAAuB,EAAE,EAAE,CAC5B,CAAO,GAAiB,EAAE,GAAkB,EAAE,IAAuB,EAAE,EAAE;IACvE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC;AACH,CAAC,CAAA,CAAC;AAEJ,kBAAe,UAAU,CAAC","sourcesContent":["import {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n} from \"../../../types\";\n\n/**\n * Used to wrap request handlers and middleware for automatic catch async errors and throw to next to invoke the global error handler\n *\n * @param {ArkosRequestHandler} fn - an express request handler or middleware that will be called with req, res, next, with catch attached for error handling\n * @returns\n *\n * @example\n * ```typescript\n * import { ArkosRequest, ArkosResponse, ArkosNextFunction } from 'arkos'\n *\n * export const getManyPosts = catchAsync(async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n * const posts = await getSomePosts()\n * res.status(200).json({ data: posts })\n * })\n * ```\n */\nconst catchAsync =\n (fn: ArkosRequestHandler) =>\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n try {\n await fn(req, res, next);\n } catch (err) {\n next(err);\n }\n };\n\nexport default catchAsync;\n"]}
1
+ {"version":3,"file":"catch-async.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/catch-async.ts"],"names":[],"mappings":";;;;;;;;;;;AAwBA,MAAM,UAAU,GACd,CAAC,EAAuB,EAAE,EAAE,CAC5B,CAAO,GAAiB,EAAE,GAAkB,EAAE,IAAuB,EAAE,EAAE;IACvE,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC;AACH,CAAC,CAAA,CAAC;AAEJ,kBAAe,UAAU,CAAC","sourcesContent":["import {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n} from \"../../../types\";\n\n/**\n * Used to wrap request handlers and middleware for automatic catch async errors and throw to next to invoke the global error handler\n *\n * @param {ArkosRequestHandler} fn - an express request handler or middleware that will be called with req, res, next, with catch attached for error handling\n * @returns\n *\n * @example\n * ```typescript\n * import { ArkosRequest, ArkosResponse, ArkosNextFunction } from 'arkos'\n *\n * export const getManyPosts = catchAsync(async\n * (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n * const posts = await getSomePosts()\n * res.status(200).json({ data: posts })\n * })\n * ```\n */\nconst catchAsync =\n (fn: ArkosRequestHandler) =>\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n try {\n return await fn(req, res, next);\n } catch (err) {\n next(err);\n }\n };\n\nexport default catchAsync;\n"]}
@@ -206,11 +206,11 @@ class FileUploaderService {
206
206
  ? this.getUploader().array(this.getFieldName(), this.maxCount)
207
207
  : this.getUploader().single(this.getFieldName());
208
208
  uploadHandler(req, res, (err) => __awaiter(this, void 0, void 0, function* () {
209
- var _a;
209
+ var _a, _b, _c, _d, _e, _f;
210
210
  if (err)
211
211
  return reject(err);
212
212
  try {
213
- const protocol = ((_a = req.get("host")) === null || _a === void 0 ? void 0 : _a.includes("localhost"))
213
+ const protocol = ((_b = (_a = req.get("host")) === null || _a === void 0 ? void 0 : _a.includes) === null || _b === void 0 ? void 0 : _b.call(_a, "localhost"))
214
214
  ? "http"
215
215
  : "https";
216
216
  const baseURL = `${protocol}://${req.get("host")}`;
@@ -220,7 +220,7 @@ class FileUploaderService {
220
220
  : dirParts[dirParts.length - 1]) || "files";
221
221
  let data;
222
222
  if (req.files && Array.isArray(req.files) && req.files.length > 0) {
223
- const isImageUploader = this.uploadDir.includes("/images");
223
+ const isImageUploader = (_d = (_c = this.uploadDir) === null || _c === void 0 ? void 0 : _c.includes) === null || _d === void 0 ? void 0 : _d.call(_c, "/images");
224
224
  if (isImageUploader) {
225
225
  data = yield Promise.all(req.files.map((file) => (0, file_uploader_helpers_1.processImage)(req, file.path, options)));
226
226
  }
@@ -230,7 +230,7 @@ class FileUploaderService {
230
230
  data = data.filter((url) => url !== null);
231
231
  }
232
232
  else if (req.file) {
233
- const isImageUploader = this.uploadDir.includes("/images");
233
+ const isImageUploader = (_f = (_e = this.uploadDir) === null || _e === void 0 ? void 0 : _e.includes) === null || _f === void 0 ? void 0 : _f.call(_e, "/images");
234
234
  if (isImageUploader) {
235
235
  data = yield (0, file_uploader_helpers_1.processImage)(req, req.file.path, options);
236
236
  }