vsrepo 1.2.6 → 1.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +296 -437
- package/{VSRepository → dist}/VSRepoError.d.ts +1 -1
- package/dist/VSRepoError.js +17 -0
- package/{VSRepository → dist}/VSRepository.d.ts +937 -907
- package/dist/VSRepository.js +204 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +17 -0
- package/dist/internal/errors/types/vs-repo-error-type.type.js +2 -0
- package/dist/internal/errors/vs-repo.error.js +27 -0
- package/dist/internal/resolvers/base-methods.resolve.js +535 -0
- package/dist/internal/resolvers/create-update-payloads-with-relations.resolve.js +143 -0
- package/dist/internal/resolvers/data-payload-with-relations.resolve.js +60 -0
- package/dist/internal/resolvers/dbAndPrismaArgs.resolve.js +46 -0
- package/dist/internal/resolvers/dinamic-method-customization.resolve.js +45 -0
- package/dist/internal/resolvers/dinamic-method-info.resolve.js +265 -0
- package/dist/internal/resolvers/merge-wheres.resolve.js +22 -0
- package/dist/internal/resolvers/pretty-wheres.resolve.js +87 -0
- package/dist/internal/resolvers/select.resolve.js +7 -0
- package/dist/internal/resolvers/specific-where.resolve.js +77 -0
- package/dist/internal/resolvers/types/base-method-function.type.js +2 -0
- package/dist/internal/resolvers/types/dinamic-method-customization.type.js +2 -0
- package/dist/internal/resolvers/types/dinamic-method-info.type.js +2 -0
- package/dist/internal/resolvers/types/dinamic-method-where-ops.type.js +2 -0
- package/dist/internal/resolvers/types/pretty-where.type.js +2 -0
- package/dist/internal/resolvers/types/prisma-args.type.js +2 -0
- package/dist/internal/resolvers/types/repository-build-instance.type.js +2 -0
- package/dist/internal/resolvers/types/resolve-db-and-prisma-args-data.type.js +2 -0
- package/dist/internal/resolvers/types/ugly-where.type.js +2 -0
- package/dist/internal/resolvers/ugly-where.resolve.js +178 -0
- package/dist/internal/utils/logger.util.js +21 -0
- package/dist/internal/utils/schemas.util.js +10 -0
- package/dist/internal/utils/uncapitalize.util.js +6 -0
- package/dist/internal/validation/build-config.validate.js +84 -0
- package/dist/internal/validation/constructor-config.validate.js +68 -0
- package/dist/internal/validation/extension.validate.js +15 -0
- package/dist/internal/validation/is-object.validate.js +6 -0
- package/dist/internal/validation/method-options.validate.js +26 -0
- package/dist/internal/validation/obj-with-relations.validate.js +37 -0
- package/dist/internal/validation/prisma-client.validate.js +10 -0
- package/dist/internal/validation/types/base-methods.type.js +2 -0
- package/dist/internal/validation/types/build-config.type.js +2 -0
- package/dist/internal/validation/types/constructor-config.type.js +2 -0
- package/dist/internal/validation/types/method-options.type.js +2 -0
- package/dist/internal/validation/types/method.type.js +2 -0
- package/dist/internal/validation/types/pagination.type.js +2 -0
- package/dist/internal/validation/types/relation.type.js +2 -0
- package/dist/internal/validation/types/see-mode.type.js +2 -0
- package/package.json +72 -70
- package/scripts/configure-prisma-import.mjs +3 -3
- package/scripts/copy-types.mjs +24 -0
- package/VSRepository/VSRepoError.js +0 -33
- package/VSRepository/VSRepoUtils.js +0 -155
- package/VSRepository/VSRepository.js +0 -1445
- package/VSRepository/index.d.ts +0 -2
- package/VSRepository/index.js +0 -2
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resolveBaseMethods = resolveBaseMethods;
|
|
7
|
+
const vs_repo_error_1 = require("../errors/vs-repo.error");
|
|
8
|
+
const logger_util_1 = require("../utils/logger.util");
|
|
9
|
+
const is_object_validate_1 = require("../validation/is-object.validate");
|
|
10
|
+
const method_options_validate_1 = require("../validation/method-options.validate");
|
|
11
|
+
const obj_with_relations_validate_1 = require("../validation/obj-with-relations.validate");
|
|
12
|
+
const create_update_payloads_with_relations_resolve_1 = require("./create-update-payloads-with-relations.resolve");
|
|
13
|
+
const data_payload_with_relations_resolve_1 = require("./data-payload-with-relations.resolve");
|
|
14
|
+
const dbAndPrismaArgs_resolve_1 = require("./dbAndPrismaArgs.resolve");
|
|
15
|
+
const deepmerge_1 = __importDefault(require("deepmerge"));
|
|
16
|
+
function resolveBaseMethods(instance, config) {
|
|
17
|
+
const { baseMethods, showWorking } = config;
|
|
18
|
+
const { tableName, pkName, relations, softRemovekName } = instance;
|
|
19
|
+
const relationsKeys = relations ? Object.keys(relations) : [];
|
|
20
|
+
// * GET
|
|
21
|
+
if (baseMethods.get.active) {
|
|
22
|
+
instance.get = async (pk, options) => {
|
|
23
|
+
if (pk == undefined)
|
|
24
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
|
|
25
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
26
|
+
instance,
|
|
27
|
+
baseConfig: baseMethods.get,
|
|
28
|
+
options,
|
|
29
|
+
wherePkValue: pk,
|
|
30
|
+
});
|
|
31
|
+
const start = showWorking
|
|
32
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "get", prismaArgs)
|
|
33
|
+
: undefined;
|
|
34
|
+
const result = await db[tableName].findUnique(prismaArgs);
|
|
35
|
+
if (showWorking)
|
|
36
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "get", start);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// * GET OR THROW
|
|
41
|
+
if (baseMethods.getOrThrow.active) {
|
|
42
|
+
instance.getOrThrow = async (pk, options) => {
|
|
43
|
+
if (pk == undefined)
|
|
44
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
|
|
45
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
46
|
+
instance,
|
|
47
|
+
baseConfig: baseMethods.getOrThrow,
|
|
48
|
+
options,
|
|
49
|
+
wherePkValue: pk,
|
|
50
|
+
});
|
|
51
|
+
const start = showWorking
|
|
52
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "getOrThrow", prismaArgs)
|
|
53
|
+
: undefined;
|
|
54
|
+
const result = await db[tableName].findUnique(prismaArgs);
|
|
55
|
+
if (showWorking)
|
|
56
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "getOrThrow", start);
|
|
57
|
+
if (!result) {
|
|
58
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) No record was found for the provided primary key.`, "20727");
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// * GET LIST
|
|
64
|
+
if (baseMethods.getList.active) {
|
|
65
|
+
instance.getList = async (pks, options) => {
|
|
66
|
+
if (!Array.isArray(pks) || pks.some(pk => pk == undefined))
|
|
67
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pks' must an array of primary keys.`);
|
|
68
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
69
|
+
instance,
|
|
70
|
+
baseConfig: baseMethods.getList,
|
|
71
|
+
options,
|
|
72
|
+
wherePkValue: { in: pks },
|
|
73
|
+
});
|
|
74
|
+
const start = showWorking
|
|
75
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "getList", prismaArgs)
|
|
76
|
+
: undefined;
|
|
77
|
+
const result = await db[tableName].findMany(prismaArgs);
|
|
78
|
+
if (showWorking)
|
|
79
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "getList", start);
|
|
80
|
+
return result;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// * GET ALL
|
|
84
|
+
if (baseMethods.getAll.active) {
|
|
85
|
+
instance.getAll = async (options) => {
|
|
86
|
+
if (options !== undefined && !(0, is_object_validate_1.isObject)(options))
|
|
87
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'options' must be a valid object.`);
|
|
88
|
+
const { pagination, order, ...restOptions } = options ?? {};
|
|
89
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
90
|
+
instance,
|
|
91
|
+
baseConfig: baseMethods.getAll,
|
|
92
|
+
options: restOptions,
|
|
93
|
+
pagination,
|
|
94
|
+
ordenation: order,
|
|
95
|
+
});
|
|
96
|
+
const start = showWorking
|
|
97
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "getAll", prismaArgs)
|
|
98
|
+
: undefined;
|
|
99
|
+
const result = await db[tableName].findMany(prismaArgs);
|
|
100
|
+
if (showWorking)
|
|
101
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "getAll", start);
|
|
102
|
+
return result;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// * REMOVE
|
|
106
|
+
if (baseMethods.remove.active) {
|
|
107
|
+
instance.remove = async (pk, options) => {
|
|
108
|
+
if (pk == undefined)
|
|
109
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
|
|
110
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
111
|
+
instance,
|
|
112
|
+
baseConfig: baseMethods.remove,
|
|
113
|
+
options,
|
|
114
|
+
wherePkValue: pk,
|
|
115
|
+
});
|
|
116
|
+
const start = showWorking
|
|
117
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "remove", prismaArgs)
|
|
118
|
+
: undefined;
|
|
119
|
+
const result = await db[tableName].delete(prismaArgs);
|
|
120
|
+
if (showWorking)
|
|
121
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "remove", start);
|
|
122
|
+
return result;
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// * REMOVE LIST
|
|
126
|
+
if (baseMethods.removeList.active) {
|
|
127
|
+
instance.removeList = async (pks, options) => {
|
|
128
|
+
if (!Array.isArray(pks) || pks.some(pk => pk == undefined))
|
|
129
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pks' must an array of primary keys.`);
|
|
130
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
131
|
+
instance,
|
|
132
|
+
baseConfig: baseMethods.removeList,
|
|
133
|
+
options,
|
|
134
|
+
wherePkValue: { in: pks },
|
|
135
|
+
withoutSelect: true,
|
|
136
|
+
});
|
|
137
|
+
const start = showWorking
|
|
138
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "removeList", prismaArgs)
|
|
139
|
+
: undefined;
|
|
140
|
+
const result = await db[tableName].deleteMany(prismaArgs);
|
|
141
|
+
if (showWorking)
|
|
142
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "removeList", start);
|
|
143
|
+
return result;
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// * TOTAL
|
|
147
|
+
if (baseMethods.total.active) {
|
|
148
|
+
instance.total = async (options) => {
|
|
149
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
150
|
+
instance,
|
|
151
|
+
baseConfig: baseMethods.total,
|
|
152
|
+
options,
|
|
153
|
+
withoutSelect: true,
|
|
154
|
+
});
|
|
155
|
+
const start = showWorking
|
|
156
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "total", prismaArgs)
|
|
157
|
+
: undefined;
|
|
158
|
+
const result = await db[tableName].count(prismaArgs);
|
|
159
|
+
if (showWorking)
|
|
160
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "total", start);
|
|
161
|
+
return result;
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// * HAS
|
|
165
|
+
if (baseMethods.has.active) {
|
|
166
|
+
instance.has = async (pk, options) => {
|
|
167
|
+
if (pk == undefined)
|
|
168
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
|
|
169
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
170
|
+
instance,
|
|
171
|
+
baseConfig: baseMethods.has,
|
|
172
|
+
options,
|
|
173
|
+
wherePkValue: pk,
|
|
174
|
+
specificSelect: { [pkName]: true },
|
|
175
|
+
});
|
|
176
|
+
const start = showWorking
|
|
177
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "has", prismaArgs)
|
|
178
|
+
: undefined;
|
|
179
|
+
const result = await db[tableName].findUnique(prismaArgs);
|
|
180
|
+
if (showWorking)
|
|
181
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "has", start);
|
|
182
|
+
return !!result;
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
// * MERGE
|
|
186
|
+
if (baseMethods.merge.active) {
|
|
187
|
+
instance.merge = async (pk, obj, options) => {
|
|
188
|
+
if (pk == undefined)
|
|
189
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
|
|
190
|
+
if (!(0, is_object_validate_1.isObject)(obj)) {
|
|
191
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'obj' must be a valid object.`);
|
|
192
|
+
}
|
|
193
|
+
(0, obj_with_relations_validate_1.validateObjWithRelations)(instance, obj, relationsKeys);
|
|
194
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
195
|
+
instance,
|
|
196
|
+
baseConfig: baseMethods.merge,
|
|
197
|
+
options,
|
|
198
|
+
wherePkValue: pk,
|
|
199
|
+
});
|
|
200
|
+
const start = showWorking
|
|
201
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "merge", prismaArgs)
|
|
202
|
+
: undefined;
|
|
203
|
+
const result = await db[tableName].findUnique(prismaArgs);
|
|
204
|
+
if (!result) {
|
|
205
|
+
if (showWorking)
|
|
206
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "merge", start);
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
if (!relations) {
|
|
210
|
+
if (showWorking)
|
|
211
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "merge", start);
|
|
212
|
+
return (0, deepmerge_1.default)(result, obj, {
|
|
213
|
+
arrayMerge: (target, source) => target.concat(source),
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
const objKeys = Object.keys(obj);
|
|
217
|
+
const objAny = obj;
|
|
218
|
+
for (let i = 0; i < objKeys.length; i++) {
|
|
219
|
+
const key = objKeys[i];
|
|
220
|
+
if (!relationsKeys.includes(key)) {
|
|
221
|
+
result[key] = objAny[key];
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const relation = relations[key];
|
|
225
|
+
if ((relation.mode === "oto" || relation.mode === "mto") && (0, is_object_validate_1.isObject)(result[key])) {
|
|
226
|
+
result[key] = objAny[key] === null ? null : (0, deepmerge_1.default)(result[key], objAny[key]);
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
else if ((relation.mode === "mtm" || relation.mode === "otm") &&
|
|
230
|
+
Array.isArray(result[key])) {
|
|
231
|
+
const targetArray = result[key];
|
|
232
|
+
const sourceArray = objAny[key];
|
|
233
|
+
const relationPk = relation.pk;
|
|
234
|
+
const targetMap = new Map();
|
|
235
|
+
const targetWithoutPk = [];
|
|
236
|
+
const sourceWithoutPk = [];
|
|
237
|
+
for (let i = 0; i < targetArray.length; i++) {
|
|
238
|
+
const item = targetArray[i];
|
|
239
|
+
if (item[relationPk] !== undefined) {
|
|
240
|
+
targetMap.set(item[relationPk], item);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
targetWithoutPk.push(item);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
for (let i = 0; i < sourceArray.length; i++) {
|
|
247
|
+
const sourceItem = sourceArray[i];
|
|
248
|
+
if (sourceItem[relationPk] !== undefined) {
|
|
249
|
+
const targetItem = targetMap.get(sourceItem[relationPk]);
|
|
250
|
+
if (targetItem) {
|
|
251
|
+
targetMap.set(sourceItem[relationPk], (0, deepmerge_1.default)(targetItem, sourceItem));
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
targetMap.set(sourceItem[relationPk], sourceItem);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
sourceWithoutPk.push(sourceItem);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
result[key] = [...targetMap.values(), ...targetWithoutPk, ...sourceWithoutPk];
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
result[key] = objAny[key];
|
|
265
|
+
}
|
|
266
|
+
if (showWorking)
|
|
267
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "merge", start);
|
|
268
|
+
return result;
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
// * SOFT REMOVE
|
|
272
|
+
if (baseMethods.softRemove.active && softRemovekName) {
|
|
273
|
+
instance.softRemove = async (pk, options) => {
|
|
274
|
+
if (pk == undefined)
|
|
275
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
|
|
276
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
277
|
+
instance,
|
|
278
|
+
baseConfig: baseMethods.softRemove,
|
|
279
|
+
options,
|
|
280
|
+
wherePkValue: pk,
|
|
281
|
+
forceSeeMode: "all",
|
|
282
|
+
dataPayload: { [softRemovekName]: new Date() },
|
|
283
|
+
});
|
|
284
|
+
const start = showWorking
|
|
285
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "softRemove", prismaArgs)
|
|
286
|
+
: undefined;
|
|
287
|
+
const result = await db[tableName].update(prismaArgs);
|
|
288
|
+
if (showWorking)
|
|
289
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "softRemove", start);
|
|
290
|
+
return result;
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
// * SOFT REMOVE LIST
|
|
294
|
+
if (baseMethods.softRemoveList.active && softRemovekName) {
|
|
295
|
+
instance.softRemoveList = async (pks, options) => {
|
|
296
|
+
if (!Array.isArray(pks) || pks.some(pk => pk == undefined))
|
|
297
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pks' must an array of primary keys.`);
|
|
298
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
299
|
+
instance,
|
|
300
|
+
baseConfig: baseMethods.softRemoveList,
|
|
301
|
+
options,
|
|
302
|
+
wherePkValue: { in: pks },
|
|
303
|
+
withoutSelect: true,
|
|
304
|
+
forceSeeMode: "all",
|
|
305
|
+
dataPayload: { [softRemovekName]: new Date() },
|
|
306
|
+
});
|
|
307
|
+
const start = showWorking
|
|
308
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "softRemoveList", prismaArgs)
|
|
309
|
+
: undefined;
|
|
310
|
+
const result = await db[tableName].updateMany(prismaArgs);
|
|
311
|
+
if (showWorking)
|
|
312
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "softRemoveList", start);
|
|
313
|
+
return result;
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
// * RESTORE
|
|
317
|
+
if (baseMethods.restore.active && softRemovekName) {
|
|
318
|
+
instance.restore = async (pk, options) => {
|
|
319
|
+
if (pk == undefined)
|
|
320
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
|
|
321
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
322
|
+
instance,
|
|
323
|
+
baseConfig: baseMethods.restore,
|
|
324
|
+
options,
|
|
325
|
+
wherePkValue: pk,
|
|
326
|
+
forceSeeMode: "all",
|
|
327
|
+
dataPayload: { [softRemovekName]: null },
|
|
328
|
+
});
|
|
329
|
+
const start = showWorking
|
|
330
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "restore", prismaArgs)
|
|
331
|
+
: undefined;
|
|
332
|
+
const result = await db[tableName].update(prismaArgs);
|
|
333
|
+
if (showWorking)
|
|
334
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "restore", start);
|
|
335
|
+
return result;
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
// * RESTORE LIST
|
|
339
|
+
if (baseMethods.restoreList.active && softRemovekName) {
|
|
340
|
+
instance.restoreList = async (pks, options) => {
|
|
341
|
+
if (!Array.isArray(pks) || pks.some(pk => pk == undefined))
|
|
342
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pks' must an array of primary keys.`);
|
|
343
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
344
|
+
instance,
|
|
345
|
+
baseConfig: baseMethods.restoreList,
|
|
346
|
+
options,
|
|
347
|
+
withoutSelect: true,
|
|
348
|
+
wherePkValue: { in: pks },
|
|
349
|
+
forceSeeMode: "all",
|
|
350
|
+
dataPayload: { [softRemovekName]: null },
|
|
351
|
+
});
|
|
352
|
+
const start = showWorking
|
|
353
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "restoreList", prismaArgs)
|
|
354
|
+
: undefined;
|
|
355
|
+
const result = await db[tableName].updateMany(prismaArgs);
|
|
356
|
+
if (showWorking)
|
|
357
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "restoreList", start);
|
|
358
|
+
return result;
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
// * SAVE
|
|
362
|
+
if (baseMethods.save.active) {
|
|
363
|
+
instance.save = async (obj, options) => {
|
|
364
|
+
if (!(0, is_object_validate_1.isObject)(obj)) {
|
|
365
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'obj' must be a valid object.`);
|
|
366
|
+
}
|
|
367
|
+
(0, obj_with_relations_validate_1.validateObjWithRelations)(instance, obj, relationsKeys);
|
|
368
|
+
const objAny = obj;
|
|
369
|
+
if (objAny[pkName] === undefined) {
|
|
370
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
371
|
+
instance,
|
|
372
|
+
baseConfig: baseMethods.save,
|
|
373
|
+
options,
|
|
374
|
+
withoutWhere: true,
|
|
375
|
+
dataPayload: (0, data_payload_with_relations_resolve_1.resolveDataPayloadWithRelations)(instance, objAny, relationsKeys),
|
|
376
|
+
});
|
|
377
|
+
const start = showWorking
|
|
378
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "save", prismaArgs)
|
|
379
|
+
: undefined;
|
|
380
|
+
const result = await db[tableName].create(prismaArgs);
|
|
381
|
+
if (showWorking)
|
|
382
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "save", start);
|
|
383
|
+
return result;
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
const { createPayload, updatePayload } = (0, create_update_payloads_with_relations_resolve_1.resolveCreateUpdatePayloadsWithRelations)(instance, obj, relationsKeys);
|
|
387
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
388
|
+
instance,
|
|
389
|
+
baseConfig: baseMethods.save,
|
|
390
|
+
options,
|
|
391
|
+
wherePkValue: objAny[pkName],
|
|
392
|
+
createPayload,
|
|
393
|
+
updatePayload,
|
|
394
|
+
});
|
|
395
|
+
const start = showWorking
|
|
396
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "save", prismaArgs)
|
|
397
|
+
: undefined;
|
|
398
|
+
const result = await db[tableName].upsert(prismaArgs);
|
|
399
|
+
if (showWorking)
|
|
400
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "save", start);
|
|
401
|
+
return result;
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
// * SAVE LIST
|
|
406
|
+
if (baseMethods.saveList.active) {
|
|
407
|
+
instance.saveList = async (objs, options) => {
|
|
408
|
+
if (!Array.isArray(objs) || objs.some(ob => !(0, is_object_validate_1.isObject)(ob))) {
|
|
409
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'objs' must be an array of valid objects.`);
|
|
410
|
+
}
|
|
411
|
+
const validatedOptions = (0, method_options_validate_1.validateMethodOptions)(options, instance);
|
|
412
|
+
const argsList = [];
|
|
413
|
+
const queries = objs.map(obj => {
|
|
414
|
+
(0, obj_with_relations_validate_1.validateObjWithRelations)(instance, obj, relationsKeys);
|
|
415
|
+
const objAny = obj;
|
|
416
|
+
if (objAny[pkName] === undefined) {
|
|
417
|
+
const { prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
418
|
+
instance,
|
|
419
|
+
baseConfig: baseMethods.saveList,
|
|
420
|
+
options: validatedOptions,
|
|
421
|
+
alreadyValidatedOptions: true,
|
|
422
|
+
withoutWhere: true,
|
|
423
|
+
dataPayload: (0, data_payload_with_relations_resolve_1.resolveDataPayloadWithRelations)(instance, objAny, relationsKeys),
|
|
424
|
+
});
|
|
425
|
+
argsList.push(prismaArgs);
|
|
426
|
+
return (db) => db[tableName].create(prismaArgs);
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
const { createPayload, updatePayload } = (0, create_update_payloads_with_relations_resolve_1.resolveCreateUpdatePayloadsWithRelations)(instance, obj, relationsKeys);
|
|
430
|
+
const { prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
431
|
+
instance,
|
|
432
|
+
baseConfig: baseMethods.saveList,
|
|
433
|
+
options: validatedOptions,
|
|
434
|
+
alreadyValidatedOptions: true,
|
|
435
|
+
wherePkValue: objAny[pkName],
|
|
436
|
+
createPayload,
|
|
437
|
+
updatePayload,
|
|
438
|
+
});
|
|
439
|
+
argsList.push(prismaArgs);
|
|
440
|
+
return (db) => db[tableName].upsert(prismaArgs);
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
const start = showWorking
|
|
444
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "saveList", argsList)
|
|
445
|
+
: undefined;
|
|
446
|
+
const results = [];
|
|
447
|
+
if (validatedOptions.db) {
|
|
448
|
+
for (let i = 0; i < queries.length; i++) {
|
|
449
|
+
results.push(await queries[i](validatedOptions.db));
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
await instance.prisma.$transaction(async (tx) => {
|
|
454
|
+
for (let i = 0; i < queries.length; i++) {
|
|
455
|
+
results.push(await queries[i](tx));
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
if (showWorking)
|
|
460
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "saveList", start);
|
|
461
|
+
return results;
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
// * PATCH
|
|
465
|
+
if (baseMethods.patch.active) {
|
|
466
|
+
instance.patch = async (pk, obj, options) => {
|
|
467
|
+
if (pk == undefined)
|
|
468
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
|
|
469
|
+
if (!(0, is_object_validate_1.isObject)(obj)) {
|
|
470
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'obj' must be a valid object.`);
|
|
471
|
+
}
|
|
472
|
+
(0, obj_with_relations_validate_1.validateObjWithRelations)(instance, obj, relationsKeys);
|
|
473
|
+
const { updatePayload } = (0, create_update_payloads_with_relations_resolve_1.resolveCreateUpdatePayloadsWithRelations)(instance, obj, relationsKeys);
|
|
474
|
+
const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
475
|
+
instance,
|
|
476
|
+
baseConfig: baseMethods.patch,
|
|
477
|
+
options,
|
|
478
|
+
wherePkValue: pk,
|
|
479
|
+
dataPayload: updatePayload,
|
|
480
|
+
});
|
|
481
|
+
const start = showWorking
|
|
482
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "patch", prismaArgs)
|
|
483
|
+
: undefined;
|
|
484
|
+
const result = await db[tableName].update(prismaArgs);
|
|
485
|
+
if (showWorking)
|
|
486
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "patch", start);
|
|
487
|
+
return result;
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
// * PATCH LIST
|
|
491
|
+
if (baseMethods.patchList.active) {
|
|
492
|
+
instance.patchList = async (tuples, options) => {
|
|
493
|
+
if (!Array.isArray(tuples) ||
|
|
494
|
+
tuples.some(tuple => tuple[0] == undefined || !(0, is_object_validate_1.isObject)(tuple[1]))) {
|
|
495
|
+
throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'tuples' must be a valid array of tuples [pk, obj].`);
|
|
496
|
+
}
|
|
497
|
+
const validatedOptions = (0, method_options_validate_1.validateMethodOptions)(options, instance);
|
|
498
|
+
const argsList = [];
|
|
499
|
+
const queries = tuples.map(tuple => {
|
|
500
|
+
(0, obj_with_relations_validate_1.validateObjWithRelations)(instance, tuple[1], relationsKeys);
|
|
501
|
+
const objAny = tuple[1];
|
|
502
|
+
const { updatePayload } = (0, create_update_payloads_with_relations_resolve_1.resolveCreateUpdatePayloadsWithRelations)(instance, objAny, relationsKeys);
|
|
503
|
+
const { prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
|
|
504
|
+
instance,
|
|
505
|
+
baseConfig: baseMethods.patchList,
|
|
506
|
+
options: validatedOptions,
|
|
507
|
+
alreadyValidatedOptions: true,
|
|
508
|
+
wherePkValue: tuple[0],
|
|
509
|
+
dataPayload: updatePayload,
|
|
510
|
+
});
|
|
511
|
+
argsList.push(prismaArgs);
|
|
512
|
+
return (db) => db[tableName].update(prismaArgs);
|
|
513
|
+
});
|
|
514
|
+
const start = showWorking
|
|
515
|
+
? (0, logger_util_1.performanceLoggerStart)(tableName, "patchList", argsList)
|
|
516
|
+
: undefined;
|
|
517
|
+
const results = [];
|
|
518
|
+
if (validatedOptions.db) {
|
|
519
|
+
for (let i = 0; i < queries.length; i++) {
|
|
520
|
+
results.push(await queries[i](validatedOptions.db));
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
await instance.prisma.$transaction(async (tx) => {
|
|
525
|
+
for (let i = 0; i < queries.length; i++) {
|
|
526
|
+
results.push(await queries[i](tx));
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
if (showWorking)
|
|
531
|
+
(0, logger_util_1.performanceLoggerEnd)(tableName, "patchList", start);
|
|
532
|
+
return results;
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveCreateUpdatePayloadsWithRelations = resolveCreateUpdatePayloadsWithRelations;
|
|
4
|
+
function resolveCreateUpdatePayloadsWithRelations(instance, obj, relationsKeys) {
|
|
5
|
+
const relations = instance.relations;
|
|
6
|
+
if (!relations) {
|
|
7
|
+
const objUpdate = { ...obj };
|
|
8
|
+
delete objUpdate[instance.pkName];
|
|
9
|
+
return {
|
|
10
|
+
createPayload: obj,
|
|
11
|
+
updatePayload: objUpdate,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const createPayload = {};
|
|
15
|
+
const updatePayload = {};
|
|
16
|
+
const objKeys = Object.keys(obj);
|
|
17
|
+
for (let i = 0; i < objKeys.length; i++) {
|
|
18
|
+
const key = objKeys[i];
|
|
19
|
+
const field = obj[key];
|
|
20
|
+
if (field === undefined)
|
|
21
|
+
continue;
|
|
22
|
+
if (relationsKeys.includes(key)) {
|
|
23
|
+
const relation = relations[key];
|
|
24
|
+
if (relation.mode === "oto" || relation.mode === "mto") {
|
|
25
|
+
if (field === null) {
|
|
26
|
+
if (relation.mode === "oto" && relation.restriction === "set") {
|
|
27
|
+
updatePayload[key] = { delete: true };
|
|
28
|
+
}
|
|
29
|
+
else if (relation.mode === "mto" && (relation.nullAble || relation.nullable)) {
|
|
30
|
+
updatePayload[key] = { disconnect: true };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if (field !== undefined) {
|
|
34
|
+
const relationFieldPk = field[relation.pk];
|
|
35
|
+
if (relationFieldPk != null) {
|
|
36
|
+
const connectOrCreate = {
|
|
37
|
+
where: { [relation.pk]: relationFieldPk },
|
|
38
|
+
create: field,
|
|
39
|
+
};
|
|
40
|
+
createPayload[key] = { connectOrCreate };
|
|
41
|
+
if (relation.restriction === "add") {
|
|
42
|
+
updatePayload[key] = { connectOrCreate };
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const update = { ...field };
|
|
46
|
+
delete update[relation.pk];
|
|
47
|
+
updatePayload[key] = {
|
|
48
|
+
upsert: {
|
|
49
|
+
where: { [relation.pk]: relationFieldPk },
|
|
50
|
+
create: field,
|
|
51
|
+
update: update,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
createPayload[key] = { create: field };
|
|
58
|
+
updatePayload[key] =
|
|
59
|
+
relation.restriction === "add"
|
|
60
|
+
? { create: field }
|
|
61
|
+
: { upsert: { create: field, update: field } };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const fieldAnyArray = field;
|
|
67
|
+
const dataWithPk = [];
|
|
68
|
+
const dataWithoutPk = [];
|
|
69
|
+
fieldAnyArray.forEach((data) => {
|
|
70
|
+
if (data[relation.pk] !== undefined) {
|
|
71
|
+
dataWithPk.push(data);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
dataWithoutPk.push(data);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
const connectOrCreate = dataWithPk.map(data => ({
|
|
78
|
+
where: { [relation.pk]: data[relation.pk] },
|
|
79
|
+
create: data,
|
|
80
|
+
}));
|
|
81
|
+
createPayload[key] = {
|
|
82
|
+
create: dataWithoutPk,
|
|
83
|
+
connectOrCreate,
|
|
84
|
+
};
|
|
85
|
+
if (relation.restriction === "add") {
|
|
86
|
+
if (relation.mode === "mtm") {
|
|
87
|
+
updatePayload[key] = {
|
|
88
|
+
create: dataWithoutPk,
|
|
89
|
+
connectOrCreate,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
updatePayload[key] = {
|
|
94
|
+
create: dataWithoutPk,
|
|
95
|
+
upsert: dataWithPk.map(data => {
|
|
96
|
+
const update = { ...data };
|
|
97
|
+
delete update[relation.pk];
|
|
98
|
+
return {
|
|
99
|
+
where: { [relation.pk]: data[relation.pk] },
|
|
100
|
+
create: data,
|
|
101
|
+
update,
|
|
102
|
+
};
|
|
103
|
+
}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
if (relation.mode === "mtm") {
|
|
109
|
+
updatePayload[key] = {
|
|
110
|
+
set: [],
|
|
111
|
+
create: dataWithoutPk,
|
|
112
|
+
connectOrCreate,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
updatePayload[key] = {
|
|
117
|
+
deleteMany: {
|
|
118
|
+
[relation.pk]: { notIn: dataWithPk.map(data => data[relation.pk]) },
|
|
119
|
+
},
|
|
120
|
+
create: dataWithoutPk,
|
|
121
|
+
upsert: dataWithPk.map(data => {
|
|
122
|
+
const update = { ...data };
|
|
123
|
+
delete update[relation.pk];
|
|
124
|
+
return {
|
|
125
|
+
where: { [relation.pk]: data[relation.pk] },
|
|
126
|
+
create: data,
|
|
127
|
+
update,
|
|
128
|
+
};
|
|
129
|
+
}),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
createPayload[key] = field;
|
|
137
|
+
if (key !== instance.pkName) {
|
|
138
|
+
updatePayload[key] = field;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return { createPayload, updatePayload };
|
|
143
|
+
}
|