@futdevpro/nts-dynamo 1.10.9 → 1.10.10

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.
@@ -25,7 +25,8 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
25
25
 
26
26
  dataModel/* : mongoose.Model<T> */; // = mongoose.model(this.dataParams.dataName, this.getSchema());
27
27
 
28
- private depDataName: string;
28
+ /* private depDataName: string; */
29
+ private readonly depKeys: string[] = [];
29
30
 
30
31
  defaultErrorUserMsg =
31
32
  `We encountered an unhandled DB Error, ` +
@@ -43,7 +44,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
43
44
  try {
44
45
  this.serviceName = this.constructor?.name;
45
46
 
46
- if (!this.dataParams.dataName) {
47
+ if (!this.dataParams.dataName || typeof this.dataParams.dataName !== 'string') {
47
48
  throw new Error(
48
49
  `dbName not setted up for this db-service (${this.dataParams.dataName}) (NTS DB)`
49
50
  );
@@ -204,11 +205,11 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
204
205
  * get data by dependency data id,
205
206
  * !!!: throws error if not found (errorCode on not found: NTS-DBS-GD2)
206
207
  *
207
- * @param dependencyId id
208
+ * @param dependencyIdsFilter id
208
209
  * @returns data
209
210
  */
210
- async getDataByDependencyId(dependencyId: string): Promise<T> {
211
- if (!this.depDataName) {
211
+ async getDataByDependencyId(dependencyIdsFilter: { [key: string]: string }): Promise<T> {
212
+ if (!this.depKeys.length) {
212
213
  throw new DyFM_Error({
213
214
  ...this._getDefaultErrorSettings(
214
215
  'getDataByDependencyId',
@@ -222,16 +223,17 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
222
223
  }
223
224
 
224
225
  const data: T = await this.dataModel
225
- .findOne({ [this.depDataName]: dependencyId })
226
+ .findOne(dependencyIdsFilter)
226
227
  .then((res): T => res?.toObject() as T ?? null)
227
228
  .catch((error): void => {
228
229
  throw new DyFM_Error({
229
230
  ...this._getDefaultErrorSettings('getDataByDependencyId', error),
230
231
 
231
232
  errorCode: 'NTS-DBS-GD1',
232
- additionalContent: { dependencyId },
233
+ additionalContent: { dependencyIdsFilter: dependencyIdsFilter },
233
234
  message:
234
- `get "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful (NTS DB)`,
235
+ `get "${this.dataParams.dataName}" by ` +
236
+ `"${Object.keys(dependencyIdsFilter).join(', ')}" was unsuccessful (NTS DB)`,
235
237
  });
236
238
  });
237
239
 
@@ -242,11 +244,11 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
242
244
  * get data by dependency data id,
243
245
  * !!!: throws error if not found (errorCode on not found: NTS-DBS-GLD2)
244
246
  *
245
- * @param dependencyId id
247
+ * @param dependencyIdsFilter id
246
248
  * @returns dataList
247
249
  */
248
- async getDataListByDependencyId(dependencyId: string): Promise<T[]> {
249
- if (!this.depDataName) {
250
+ async getDataListByDependencyId(dependencyIdsFilter: { [key: string]: string }): Promise<T[]> {
251
+ if (!this.depKeys.length) {
250
252
  throw new DyFM_Error({
251
253
  ...this._getDefaultErrorSettings(
252
254
  'getDataListByDependencyId',
@@ -263,17 +265,16 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
263
265
  }
264
266
 
265
267
  const dataList: T[] = await this.dataModel
266
- .find({
267
- [this.depDataName]: dependencyId,
268
- })
268
+ .find(dependencyIdsFilter)
269
269
  .then((res): T[] => res as T[] ?? [])
270
270
  .catch((error): void => {
271
271
  throw new DyFM_Error({
272
272
  ...this._getDefaultErrorSettings('getDataListByDependencyId', error),
273
273
  errorCode: 'NTS-DBS-GLD1',
274
- additionalContent: { dependencyId },
274
+ additionalContent: { dependencyIdsFilter: dependencyIdsFilter },
275
275
  message:
276
- `get "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful (NTS DB)`,
276
+ `get "${this.dataParams.dataName}" by ` +
277
+ `"${Object.keys(dependencyIdsFilter).join(', ')}" was unsuccessful (NTS DB)`,
277
278
  });
278
279
  });
279
280
 
@@ -291,8 +292,8 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
291
292
  * @param ids ids
292
293
  * @returns dataList
293
294
  */
294
- async getDataListByDependencyIds(dependencyIds: string[]): Promise<T[]> {
295
- if (!this.depDataName) {
295
+ async getDataListByDependencyIds(dependencyKey: string, dependencyIds: string[]): Promise<T[]> {
296
+ if (!this.depKeys.length) {
296
297
  throw new DyFM_Error({
297
298
  ...this._getDefaultErrorSettings(
298
299
  'getDataListByDependencyIds',
@@ -305,9 +306,31 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
305
306
  });
306
307
  }
307
308
 
309
+ if (!dependencyIds?.length) {
310
+ return [];
311
+ }
312
+
313
+ if (!dependencyKey) {
314
+ throw new DyFM_Error({
315
+ ...this._getDefaultErrorSettings(
316
+ 'getDataListByDependencyIds',
317
+ new Error(`dependencyKey is missing! (${this.dataParams.dataName}) (NTS DB)`),
318
+ ),
319
+ });
320
+ }
321
+
322
+ if (!this.depKeys.includes(dependencyKey)) {
323
+ throw new DyFM_Error({
324
+ ...this._getDefaultErrorSettings(
325
+ 'getDataListByDependencyIds',
326
+ new Error(`dependencyKey is not valid! (${dependencyKey}) (NTS DB)`),
327
+ ),
328
+ });
329
+ }
330
+
308
331
  const dataList: T[] = await this.dataModel
309
332
  .find({
310
- [this.depDataName]: { $in: dependencyIds },
333
+ [dependencyKey]: { $in: dependencyIds },
311
334
  })
312
335
  .then((res): T[] => res as T[] ?? [])
313
336
  .catch((error): void => {
@@ -316,7 +339,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
316
339
  errorCode: 'NTS-DBS-GLDS1',
317
340
  additionalContent: { dependencyIds },
318
341
  message:
319
- `get "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful (NTS DB)`,
342
+ `get "${this.dataParams.dataName}" by "${dependencyKey}" was unsuccessful (NTS DB)`,
320
343
  });
321
344
  });
322
345
 
@@ -375,9 +398,9 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
375
398
  );
376
399
  }
377
400
 
378
- async markDeletedByDependencyId(dependencyId: string, issuer: string): Promise<void> {
401
+ async markDeletedByDependencyId(dependencyIdsFilter: { [key: string]: string }, issuer: string): Promise<void> {
379
402
  await this.dataModel.updateMany(
380
- { [this.depDataName]: dependencyId },
403
+ dependencyIdsFilter,
381
404
  {
382
405
  _deleted: new Date(),
383
406
  _deletedBy: issuer,
@@ -386,9 +409,10 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
386
409
  throw new DyFM_Error({
387
410
  ...this._getDefaultErrorSettings('markDeletedByDependencyId', error, issuer),
388
411
  errorCode: 'NTS-DBS-MDD0',
389
- additionalContent: { dependencyId },
412
+ additionalContent: { dependencyIdsFilter: dependencyIdsFilter },
390
413
  message:
391
- `markDeleted "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful ` +
414
+ `markDeleted "${this.dataParams.dataName}" by ` +
415
+ `"${Object.keys(dependencyIdsFilter).join(', ')}" was unsuccessful ` +
392
416
  `(NTS DB)`,
393
417
  issuer,
394
418
  });
@@ -415,9 +439,12 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
415
439
  });
416
440
  }
417
441
 
418
- async restoreDeletedByDependencyId(dependencyId: string, issuer: string): Promise<void> {
442
+ async restoreDeletedByDependencyId(
443
+ dependencyIdsFilter: { [key: string]: string },
444
+ issuer: string
445
+ ): Promise<void> {
419
446
  await this.dataModel.updateMany(
420
- { [this.depDataName]: dependencyId },
447
+ dependencyIdsFilter,
421
448
  {
422
449
  _deleted: null,
423
450
  __lastModified: new Date(),
@@ -427,9 +454,10 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
427
454
  throw new DyFM_Error({
428
455
  ...this._getDefaultErrorSettings('restoreDeletedByDependencyId', error, issuer),
429
456
  errorCode: 'NTS-DBS-RDD0',
430
- additionalContent: { dependencyId },
457
+ additionalContent: { dependencyIdsFilter: dependencyIdsFilter },
431
458
  message:
432
- `restoreDeleted "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful ` +
459
+ `restoreDeleted "${this.dataParams.dataName}" by ` +
460
+ `"${Object.keys(dependencyIdsFilter).join(', ')}" was unsuccessful ` +
433
461
  `(NTS DB)`,
434
462
  issuer,
435
463
  });
@@ -474,8 +502,8 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
474
502
  * deleted data by id
475
503
  * @param dependencyId id
476
504
  */
477
- async deleteDataByDependencyId(dependencyId: string): Promise<void> {
478
- if (!this.depDataName) {
505
+ async deleteDataByDependencyId(dependencyIdsFilter: { [key: string]: string }): Promise<void> {
506
+ if (!this.depKeys.length) {
479
507
  throw new DyFM_Error({
480
508
  ...this._getDefaultErrorSettings(
481
509
  'deleteDataByDependencyId',
@@ -489,14 +517,15 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
489
517
  }
490
518
 
491
519
  await this.dataModel
492
- .deleteMany({ [this.depDataName]: dependencyId })
520
+ .deleteMany(dependencyIdsFilter)
493
521
  .catch((error): void => {
494
522
  throw new DyFM_Error({
495
523
  ...this._getDefaultErrorSettings('deleteDataByDependencyId', error),
496
524
  errorCode: 'NTS-DBS-DDD1',
497
- additionalContent: { dependencyId },
525
+ additionalContent: { dependencyIdsFilter: dependencyIdsFilter },
498
526
  message:
499
- `delete "${this.dataParams.dataName}" by ${this.depDataName} was unsuccessful (NTS DB)`,
527
+ `delete "${this.dataParams.dataName}" by ` +
528
+ `"${Object.keys(dependencyIdsFilter).join(', ')}" was unsuccessful (NTS DB)`,
500
529
  });
501
530
  });
502
531
  }
@@ -521,12 +550,13 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
521
550
  */
522
551
  async searchData(
523
552
  filterBy: DyFM_DBFilter<T>,
524
- narrowByDependencyIds?: string[]
553
+ narrowByDependencyIds?: string[],
554
+ narrowByDependencyKey?: string,
525
555
  ): Promise<T[]> {
526
556
  const filter = {};
527
557
 
528
558
  if (0 < narrowByDependencyIds.length) {
529
- if (!this.depDataName) {
559
+ if (!this.depKeys.length) {
530
560
  throw new DyFM_Error({
531
561
  ...this._getDefaultErrorSettings(
532
562
  'searchData',
@@ -538,8 +568,21 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
538
568
  errorCode: 'NTS-DBS-SD0',
539
569
  });
540
570
  }
541
-
542
- filter[this.depDataName] = { $in: narrowByDependencyIds };
571
+
572
+ if (!narrowByDependencyKey) {
573
+ if (this.depKeys.length === 1) {
574
+ narrowByDependencyKey = this.depKeys[0];
575
+ } else {
576
+ throw new DyFM_Error({
577
+ ...this._getDefaultErrorSettings(
578
+ 'searchData',
579
+ new Error(`dependencyKey is missing! (${this.dataParams.dataName}) (NTS DB)`),
580
+ ),
581
+ });
582
+ }
583
+ }
584
+
585
+ filter[narrowByDependencyKey] = { $in: narrowByDependencyIds };
543
586
  }
544
587
 
545
588
  Object.values(this.dataParams.properties).forEach(
@@ -1231,33 +1274,16 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
1231
1274
  * sets depDataKey
1232
1275
  */
1233
1276
  private lookForDependencyDataSettings(): void {
1234
- const dependencyParam: DyFM_DataProperty_Params<any> =
1235
- Object.values(this.dataParams.properties).find(
1236
- (modelParams: DyFM_DataProperty_Params<any>): boolean =>
1237
- Boolean(modelParams.dependencyDataName)
1238
- );
1239
-
1240
- if (
1277
+ const dependencyParams: DyFM_DataProperty_Params<any>[] =
1241
1278
  Object.values(this.dataParams.properties).filter(
1242
1279
  (modelParams: DyFM_DataProperty_Params<any>): boolean =>
1243
1280
  Boolean(modelParams.dependencyDataName)
1244
- ).length > 1
1245
- ) {
1246
- throw new DyFM_Error({
1247
- ...this._getDefaultErrorSettings(
1248
- 'lookForDependencyDataSettings',
1249
- new Error(
1250
- `Multiple "dependencyDataName" found for this dataModel (${this.dataParams.dataName}) ` +
1251
- `(NTS DB)` +
1252
- `\nSorry, but this is not supported yet! (Donate to Dynamo to get this feature!)`
1253
- )
1254
- ),
1255
- errorCode: 'NTS-DBS-LFDD0',
1256
- });
1257
- }
1281
+ );
1258
1282
 
1259
- if (dependencyParam) {
1260
- this.depDataName = dependencyParam.key;
1283
+ if (dependencyParams) {
1284
+ this.depKeys.push(...dependencyParams.map(
1285
+ (dependencyParam: DyFM_DataProperty_Params<any>): string => dependencyParam.key
1286
+ ));
1261
1287
  }
1262
1288
  }
1263
1289
  }
@@ -195,7 +195,11 @@ export class DyNTS_ApiService {
195
195
  DyFM_Log.error(msg);
196
196
  }
197
197
 
198
- if (error && callParams?.httpOptions?.responseType === DyFM_HttpResponseType.text) {
198
+ if (
199
+ error &&
200
+ typeof error.error === 'string' &&
201
+ callParams?.httpOptions?.responseType === DyFM_HttpResponseType.text
202
+ ) {
199
203
  error.error = JSON.parse(error?.error);
200
204
  }
201
205
 
@@ -215,6 +219,7 @@ export class DyNTS_ApiService {
215
219
  additionalContent: {
216
220
  callParams,
217
221
  inputParams,
222
+ response: error.response,
218
223
  },
219
224
  });
220
225
 
@@ -233,6 +238,7 @@ export class DyNTS_ApiService {
233
238
  additionalContent: {
234
239
  callParams,
235
240
  inputParams,
241
+ response: error.response,
236
242
  },
237
243
  });
238
244
 
@@ -252,22 +258,37 @@ export class DyNTS_ApiService {
252
258
  callParams,
253
259
  inputParams,
254
260
  url,
261
+ response: error.response,
255
262
  },
256
263
  });
257
264
 
258
265
  } else if (error.config && error.message) {
259
266
 
267
+ let msg: string = error.message;
268
+ let status: number = +error.message.substring(error.message.length - 4, 3);
269
+
270
+ if (error.message.includes('status code')) {msg += `\nendpoint: ${callParams.baseUrl}${callParams.endpoint}` +
271
+ `\npathParams: ${
272
+ inputParams.pathParams ?
273
+ Object.keys(inputParams.pathParams).join(', ') :
274
+ '-no path params-'
275
+ }` +
276
+ `\nenpointStackLocation: ${callParams.stack}`;
277
+ }
278
+
260
279
  throw new DyFM_Error({
261
280
  ...this._getDefaultErrorSettings(
262
281
  callParams.name + ' startApiCall',
263
282
  error
264
283
  ),
265
284
 
266
- status: +error.message.substring(error.message.length - 4, 3),
285
+ status: status,
286
+ message: msg,
267
287
  errorCode: 'NTS-API-HE4',
268
288
  additionalContent: {
269
289
  callParams,
270
290
  inputParams,
291
+ response: error.response,
271
292
  },
272
293
  });
273
294
  } else {
@@ -308,10 +308,19 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
308
308
 
309
309
  this.asyncConstruct(/* extended */).catch((error: any): void => {
310
310
  if (error instanceof DyFM_Error) {
311
- DyFM_Log.H_warn(
312
- '(constructor asyncConstruct.catch) additional error content:\n',
313
- error?.additionalContent
314
- );
311
+ if (error.additionalContent?.constructErrors?.length) {
312
+ error.additionalContent.constructErrors.forEach((errorItem: DyFM_Error): void => {
313
+ errorItem.logSimple(
314
+ `(constructor asyncConstruct.catch) additional error content:\n`,
315
+ errorItem?.additionalContent
316
+ );
317
+ });
318
+ } else {
319
+ DyFM_Log.H_warn(
320
+ '(constructor asyncConstruct.catch) additional error content:\n',
321
+ error?.additionalContent
322
+ );
323
+ }
315
324
  }
316
325
 
317
326
  if (