@futdevpro/nts-dynamo 1.9.50 → 1.10.2
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/.eslintrc.json +1 -0
- package/.github/workflows/main.yml +57 -3
- package/build/_collections/archive.util.spec.d.ts +2 -0
- package/build/_collections/archive.util.spec.d.ts.map +1 -0
- package/build/_collections/archive.util.spec.js +21 -0
- package/build/_collections/archive.util.spec.js.map +1 -0
- package/build/_models/control-models/api-call-params.control-model.spec.d.ts +2 -0
- package/build/_models/control-models/api-call-params.control-model.spec.d.ts.map +1 -0
- package/build/_models/control-models/api-call-params.control-model.spec.js +82 -0
- package/build/_models/control-models/api-call-params.control-model.spec.js.map +1 -0
- package/build/_models/control-models/app-params.control-model.spec.d.ts +2 -0
- package/build/_models/control-models/app-params.control-model.spec.d.ts.map +1 -0
- package/build/_models/control-models/app-params.control-model.spec.js +59 -0
- package/build/_models/control-models/app-params.control-model.spec.js.map +1 -0
- package/build/_models/control-models/app-system-controls.control-model.spec.d.ts +2 -0
- package/build/_models/control-models/app-system-controls.control-model.spec.d.ts.map +1 -0
- package/build/_models/control-models/app-system-controls.control-model.spec.js +26 -0
- package/build/_models/control-models/app-system-controls.control-model.spec.js.map +1 -0
- package/build/_models/control-models/endpoint-params.control-model.d.ts +1 -1
- package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
- package/build/_models/control-models/endpoint-params.control-model.js +3 -3
- package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
- package/build/_models/control-models/http-settings.control-model.spec.d.ts +2 -0
- package/build/_models/control-models/http-settings.control-model.spec.d.ts.map +1 -0
- package/build/_models/control-models/http-settings.control-model.spec.js +62 -0
- package/build/_models/control-models/http-settings.control-model.spec.js.map +1 -0
- package/build/_models/control-models/system-control.control-model.spec.d.ts +2 -0
- package/build/_models/control-models/system-control.control-model.spec.d.ts.map +1 -0
- package/build/_models/control-models/system-control.control-model.spec.js +24 -0
- package/build/_models/control-models/system-control.control-model.spec.js.map +1 -0
- package/build/_modules/custom-data/custom-data.controller.d.ts.map +1 -1
- package/build/_modules/custom-data/custom-data.controller.js +3 -3
- package/build/_modules/custom-data/custom-data.controller.js.map +1 -1
- package/build/_modules/custom-data/custom-data.data-service.d.ts +1 -1
- package/build/_modules/custom-data/custom-data.data-service.d.ts.map +1 -1
- package/build/_modules/custom-data/custom-data.data-service.js +3 -3
- package/build/_modules/custom-data/custom-data.data-service.js.map +1 -1
- package/build/_modules/mock/app-params.mock.spec.d.ts +2 -0
- package/build/_modules/mock/app-params.mock.spec.d.ts.map +1 -0
- package/build/_modules/mock/app-params.mock.spec.js +19 -0
- package/build/_modules/mock/app-params.mock.spec.js.map +1 -0
- package/build/_modules/mock/auth-service.mock.spec.d.ts +2 -0
- package/build/_modules/mock/auth-service.mock.spec.d.ts.map +1 -0
- package/build/_modules/mock/auth-service.mock.spec.js +40 -0
- package/build/_modules/mock/auth-service.mock.spec.js.map +1 -0
- package/build/_modules/mock/controller.mock.spec.d.ts +2 -0
- package/build/_modules/mock/controller.mock.spec.d.ts.map +1 -0
- package/build/_modules/mock/controller.mock.spec.js +23 -0
- package/build/_modules/mock/controller.mock.spec.js.map +1 -0
- package/build/_modules/mock/data-model.mock.spec.d.ts +2 -0
- package/build/_modules/mock/data-model.mock.spec.d.ts.map +1 -0
- package/build/_modules/mock/data-model.mock.spec.js +99 -0
- package/build/_modules/mock/data-model.mock.spec.js.map +1 -0
- package/build/_modules/mock/email-service-collection.mock.spec.d.ts +2 -0
- package/build/_modules/mock/email-service-collection.mock.spec.d.ts.map +1 -0
- package/build/_modules/mock/email-service-collection.mock.spec.js +21 -0
- package/build/_modules/mock/email-service-collection.mock.spec.js.map +1 -0
- package/build/_modules/mock/email-service.mock.spec.d.ts +2 -0
- package/build/_modules/mock/email-service.mock.spec.d.ts.map +1 -0
- package/build/_modules/mock/email-service.mock.spec.js +14 -0
- package/build/_modules/mock/email-service.mock.spec.js.map +1 -0
- package/build/_modules/mock/socket-client.mock.js +2 -2
- package/build/_modules/mock/socket-client.mock.spec.d.ts +2 -0
- package/build/_modules/mock/socket-client.mock.spec.d.ts.map +1 -0
- package/build/_modules/mock/socket-client.mock.spec.js +32 -0
- package/build/_modules/mock/socket-client.mock.spec.js.map +1 -0
- package/build/_modules/mock/socket-server.mock.spec.d.ts +2 -0
- package/build/_modules/mock/socket-server.mock.spec.d.ts.map +1 -0
- package/build/_modules/mock/socket-server.mock.spec.js +36 -0
- package/build/_modules/mock/socket-server.mock.spec.js.map +1 -0
- package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.d.ts +2 -0
- package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.d.ts.map +1 -0
- package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.js +22 -0
- package/build/_modules/socket/_models/socket-client-service-params.control-model.spec.js.map +1 -0
- package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.d.ts +2 -0
- package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.d.ts.map +1 -0
- package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.js +29 -0
- package/build/_modules/socket/_models/socket-server-service-params.control-model.spec.js.map +1 -0
- package/build/_modules/socket/_services/socket-server.service.js +1 -1
- package/build/_modules/socket/_services/socket-server.service.js.map +1 -1
- package/build/_modules/usage/usage.controller.d.ts.map +1 -1
- package/build/_modules/usage/usage.controller.js +6 -4
- package/build/_modules/usage/usage.controller.js.map +1 -1
- package/build/_modules/usage/usage.data-service.d.ts +4 -4
- package/build/_modules/usage/usage.data-service.d.ts.map +1 -1
- package/build/_modules/usage/usage.data-service.js +2 -2
- package/build/_modules/usage/usage.data-service.js.map +1 -1
- package/build/_services/base/data.service.d.ts +7 -5
- package/build/_services/base/data.service.d.ts.map +1 -1
- package/build/_services/base/data.service.js +153 -13
- package/build/_services/base/data.service.js.map +1 -1
- package/build/_services/base/db.service.d.ts +2 -1
- package/build/_services/base/db.service.d.ts.map +1 -1
- package/build/_services/base/db.service.js +49 -19
- package/build/_services/base/db.service.js.map +1 -1
- package/build/_services/base/singleton.service-base.d.ts.map +1 -1
- package/build/_services/base/singleton.service-base.js.map +1 -1
- package/build/_services/core/api.service.d.ts +1 -1
- package/build/_services/core/api.service.js +2 -2
- package/build/_services/core/api.service.spec.d.ts +2 -0
- package/build/_services/core/api.service.spec.d.ts.map +1 -0
- package/build/_services/core/api.service.spec.js +75 -0
- package/build/_services/core/api.service.spec.js.map +1 -0
- package/build/_services/core/email.service.d.ts +6 -6
- package/build/_services/core/email.service.d.ts.map +1 -1
- package/build/_services/core/email.service.js.map +1 -1
- package/build/_services/core/email.service.spec.d.ts +2 -0
- package/build/_services/core/email.service.spec.d.ts.map +1 -0
- package/build/_services/core/email.service.spec.js +77 -0
- package/build/_services/core/email.service.spec.js.map +1 -0
- package/build/_services/core/global.service.d.ts.map +1 -1
- package/build/_services/core/global.service.js +2 -1
- package/build/_services/core/global.service.js.map +1 -1
- package/build/_services/route/controller.service.d.ts +3 -3
- package/build/_services/route/controller.service.js +2 -2
- package/build/_services/route/controller.service.spec.d.ts +2 -0
- package/build/_services/route/controller.service.spec.d.ts.map +1 -0
- package/build/_services/route/controller.service.spec.js +48 -0
- package/build/_services/route/controller.service.spec.js.map +1 -0
- package/build/_services/route/routing-module.service.spec.d.ts +2 -0
- package/build/_services/route/routing-module.service.spec.d.ts.map +1 -0
- package/build/_services/route/routing-module.service.spec.js +65 -0
- package/build/_services/route/routing-module.service.spec.js.map +1 -0
- package/build/_services/server/app.server.d.ts +5 -5
- package/build/_services/server/app.server.d.ts.map +1 -1
- package/build/_services/server/app.server.js +9 -7
- package/build/_services/server/app.server.js.map +1 -1
- package/package.json +8 -8
- package/spec/support/jasmine.json +8 -0
- package/src/_collections/archive.util.spec.ts +22 -0
- package/src/_models/control-models/api-call-params.control-model.spec.ts +94 -0
- package/src/_models/control-models/app-params.control-model.spec.ts +69 -0
- package/src/_models/control-models/app-system-controls.control-model.spec.ts +31 -0
- package/src/_models/control-models/endpoint-params.control-model.ts +7 -6
- package/src/_models/control-models/http-settings.control-model.spec.ts +66 -0
- package/src/_models/control-models/system-control.control-model.spec.ts +27 -0
- package/src/_modules/custom-data/custom-data.controller.ts +6 -6
- package/src/_modules/custom-data/custom-data.data-service.ts +4 -3
- package/src/_modules/mock/app-params.mock.spec.ts +21 -0
- package/src/_modules/mock/auth-service.mock.spec.ts +47 -0
- package/src/_modules/mock/controller.mock.spec.ts +26 -0
- package/src/_modules/mock/data-model.mock.spec.ts +109 -0
- package/src/_modules/mock/email-service-collection.mock.spec.ts +24 -0
- package/src/_modules/mock/email-service.mock.spec.ts +17 -0
- package/src/_modules/mock/socket-client.mock.spec.ts +40 -0
- package/src/_modules/mock/socket-client.mock.ts +4 -4
- package/src/_modules/mock/socket-server.mock.spec.ts +44 -0
- package/src/_modules/socket/_models/socket-client-service-params.control-model.spec.ts +30 -0
- package/src/_modules/socket/_models/socket-server-service-params.control-model.spec.ts +33 -0
- package/src/_modules/socket/_services/socket-server.service.ts +1 -1
- package/src/_modules/test/get-test-routing-module.util.ts +2 -2
- package/src/_modules/usage/usage.controller.ts +10 -8
- package/src/_modules/usage/usage.data-service.ts +10 -7
- package/src/_services/base/data.service.ts +235 -17
- package/src/_services/base/db.service.ts +50 -12
- package/src/_services/base/singleton.service-base.ts +0 -2
- package/src/_services/core/api.service.spec.ts +96 -0
- package/src/_services/core/api.service.ts +2 -2
- package/src/_services/core/email.service.spec.ts +93 -0
- package/src/_services/core/email.service.ts +9 -11
- package/src/_services/core/global.service.ts +3 -2
- package/src/_services/route/controller.service.spec.ts +52 -0
- package/src/_services/route/controller.service.ts +3 -3
- package/src/_services/route/routing-module.service.spec.ts +81 -0
- package/src/_services/server/app.server.ts +26 -24
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
|
|
2
|
+
import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
|
|
3
|
+
import { DyNTS_SocketSecurity } from '../_enums/socket-security.enum';
|
|
4
|
+
import { DyNTS_SocketServerService_Params } from './socket-server-service-params.control-model';
|
|
5
|
+
|
|
6
|
+
describe('DyNTS_SocketServerService_Params', () => {
|
|
7
|
+
it('should create an instance with provided values', () => {
|
|
8
|
+
const params = {
|
|
9
|
+
name: 'TestSocket',
|
|
10
|
+
port: 8080,
|
|
11
|
+
security: DyNTS_SocketSecurity.secure,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const instance = new DyNTS_SocketServerService_Params(params);
|
|
15
|
+
|
|
16
|
+
expect(instance.name).toBe('TestSocket');
|
|
17
|
+
expect(instance.port).toBe(8080);
|
|
18
|
+
expect(instance.security).toBe(DyNTS_SocketSecurity.secure);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should use default security if not provided', () => {
|
|
22
|
+
const params = {
|
|
23
|
+
name: 'TestSocket',
|
|
24
|
+
port: 8080,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const instance = new DyNTS_SocketServerService_Params(params);
|
|
28
|
+
|
|
29
|
+
expect(instance.name).toBe('TestSocket');
|
|
30
|
+
expect(instance.port).toBe(8080);
|
|
31
|
+
expect(instance.security).toBe(DyNTS_global_settings.defaultSocketSecurity);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -222,7 +222,7 @@ export abstract class DyNTS_SocketServerService<
|
|
|
222
222
|
}));
|
|
223
223
|
}
|
|
224
224
|
|
|
225
|
-
this.subscriptionEvent.
|
|
225
|
+
this.subscriptionEvent.name = this.params.name;
|
|
226
226
|
} else {
|
|
227
227
|
DyFM_Log.error(
|
|
228
228
|
'getPresenceFromSubscriptionEventContent is not set',
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
import { DyFM_testModule_settings } from '@futdevpro/fsm-dynamo/test';
|
|
3
3
|
import { DyNTS_RouteSecurity } from '../../_enums/route-security.enum';
|
|
4
|
-
import {
|
|
5
|
-
DyNTS_RoutingModule_Settings
|
|
4
|
+
import {
|
|
5
|
+
DyNTS_RoutingModule_Settings
|
|
6
6
|
} from '../../_models/interfaces/routing-module-settings.interface';
|
|
7
7
|
import { DyNTS_RoutingModule } from '../../_services/route/routing-module.service';
|
|
8
8
|
import { DyNTS_Test_Controller } from './test.controller';
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
import { Request, Response } from 'express';
|
|
3
3
|
|
|
4
4
|
import { DyFM_RelativeDate } from '@futdevpro/fsm-dynamo';
|
|
5
|
-
import {
|
|
6
|
-
DyFM_usageModule_settings, DyFM_UsageSession
|
|
5
|
+
import {
|
|
6
|
+
DyFM_usageModule_settings, DyFM_UsageSession
|
|
7
7
|
} from '@futdevpro/fsm-dynamo/usage';
|
|
8
8
|
|
|
9
9
|
import { DyNTS_HttpCallType } from '../../_enums/http/http-call-type.enum';
|
|
10
|
+
import {
|
|
11
|
+
DyNTS_Endpoint_Params
|
|
12
|
+
} from '../../_models/control-models/endpoint-params.control-model';
|
|
10
13
|
import { DyNTS_AuthService } from '../../_services/core/auth.service';
|
|
11
|
-
import { DyNTS_Controller } from '../../_services/route/controller.service';
|
|
12
14
|
import { DyNTS_GlobalService } from '../../_services/core/global.service';
|
|
13
|
-
import {
|
|
14
|
-
DyNTS_Endpoint_Params
|
|
15
|
-
} from '../../_models/control-models/endpoint-params.control-model';
|
|
15
|
+
import { DyNTS_Controller } from '../../_services/route/controller.service';
|
|
16
16
|
import { DyNTS_Usage_DataService } from './usage.data-service';
|
|
17
17
|
|
|
18
18
|
export class DyNTS_Usage_Controller extends DyNTS_Controller {
|
|
@@ -106,10 +106,12 @@ export class DyNTS_Usage_Controller extends DyNTS_Controller {
|
|
|
106
106
|
endpoint: DyFM_usageModule_settings.endPoints.getUsageData,
|
|
107
107
|
preProcesses: [ this.authService.authenticate_tokenPerm_accUsageData ],
|
|
108
108
|
tasks: [
|
|
109
|
-
async (req: Request, res: Response): Promise<void> => {
|
|
109
|
+
async (req: Request, res: Response, issuer: string): Promise<void> => {
|
|
110
110
|
const range: DyFM_RelativeDate = req.params.range as DyFM_RelativeDate;
|
|
111
111
|
|
|
112
|
-
const usageService = new DyNTS_Usage_DataService(
|
|
112
|
+
const usageService = new DyNTS_Usage_DataService({
|
|
113
|
+
issuer: issuer,
|
|
114
|
+
});
|
|
113
115
|
|
|
114
116
|
await usageService.getUsage(range);
|
|
115
117
|
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
|
|
2
|
+
import { DyFM_Error, DyFM_RelativeDate, DyFM_Time } from '@futdevpro/fsm-dynamo';
|
|
3
|
+
import {
|
|
4
|
+
DyFM_DailyUsageData,
|
|
5
|
+
DyFM_UsageData,
|
|
6
|
+
DyFM_UsageSession, DyFM_usageSession_dataParams
|
|
7
|
+
} from '@futdevpro/fsm-dynamo/usage';
|
|
2
8
|
import { Request } from 'express';
|
|
3
|
-
import { DyFM_Error, DyFM_Time, DyFM_RelativeDate } from '@futdevpro/fsm-dynamo';
|
|
4
|
-
import { DyFM_UsageSession, DyFM_usageSession_dataParams, DyFM_UsageData,
|
|
5
|
-
DyFM_DailyUsageData } from '@futdevpro/fsm-dynamo/usage';
|
|
6
9
|
|
|
7
10
|
import { DyNTS_DataService } from '../../_services/base/data.service';
|
|
8
11
|
import { DyNTS_Shared } from '../../_services/shared.static-service';
|
|
@@ -12,18 +15,18 @@ export class DyNTS_Usage_DataService extends DyNTS_DataService<DyFM_UsageSession
|
|
|
12
15
|
simplifiedDailyUsage: DyFM_DailyUsageData[] = [];
|
|
13
16
|
|
|
14
17
|
constructor(
|
|
15
|
-
set
|
|
18
|
+
set: {
|
|
16
19
|
usageSession?: DyFM_UsageSession,
|
|
17
20
|
usageData?: DyFM_UsageData[],
|
|
18
|
-
issuer
|
|
21
|
+
issuer: string,
|
|
19
22
|
}
|
|
20
23
|
) {
|
|
21
24
|
super(
|
|
22
25
|
new DyFM_UsageSession(set?.usageSession),
|
|
23
26
|
DyFM_usageSession_dataParams,
|
|
24
|
-
set
|
|
27
|
+
set.issuer
|
|
25
28
|
);
|
|
26
|
-
this.usageData = set?.usageData
|
|
29
|
+
this.usageData = set?.usageData ?? [];
|
|
27
30
|
}
|
|
28
31
|
|
|
29
32
|
getLocationDataFromRequest(req: Request): void {
|
|
@@ -3,13 +3,18 @@ import {
|
|
|
3
3
|
DyFM_AnyError,
|
|
4
4
|
DyFM_Array,
|
|
5
5
|
DyFM_Data_Params,
|
|
6
|
-
DyFM_DataModel_Params,
|
|
6
|
+
DyFM_DataModel_Params,
|
|
7
|
+
DyFM_DataProperty_Params,
|
|
7
8
|
DyFM_DBFilter,
|
|
9
|
+
DyFM_DBĐSort,
|
|
8
10
|
DyFM_Error,
|
|
9
|
-
DyFM_Error_Settings,
|
|
11
|
+
DyFM_Error_Settings,
|
|
12
|
+
DyFM_ErrorLevel,
|
|
10
13
|
DyFM_Log,
|
|
11
14
|
DyFM_Metadata,
|
|
12
|
-
|
|
15
|
+
DyFM_RangeValue,
|
|
16
|
+
DyFM_SearchQuery,
|
|
17
|
+
DyFM_SearchResult
|
|
13
18
|
} from '@futdevpro/fsm-dynamo';
|
|
14
19
|
|
|
15
20
|
import { DyNTS_getArchivedDBName } from '../../_collections/archive.util';
|
|
@@ -27,16 +32,16 @@ import { DyNTS_DBService } from './db.service';
|
|
|
27
32
|
* @example
|
|
28
33
|
* export class UserMatchStatisticsService extends DyNTS_DataService<UserMatchStatistics> {
|
|
29
34
|
* constructor(
|
|
30
|
-
* set
|
|
35
|
+
* set: {
|
|
31
36
|
* data?: UserMatchStatistics,
|
|
32
|
-
* issuer
|
|
37
|
+
* issuer: string,
|
|
33
38
|
* }
|
|
34
39
|
* ) {
|
|
35
40
|
* super(
|
|
36
41
|
* new UserMatchStatistics(set?.data),
|
|
37
42
|
* userMatchStatisticsModelParams
|
|
38
43
|
* );
|
|
39
|
-
* this.issuer = set
|
|
44
|
+
* this.issuer = set.issuer;
|
|
40
45
|
* }
|
|
41
46
|
* }
|
|
42
47
|
*/
|
|
@@ -1083,22 +1088,34 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
1083
1088
|
}
|
|
1084
1089
|
}
|
|
1085
1090
|
|
|
1086
|
-
async searchData(query?: DyFM_SearchQuery<T>): Promise<T
|
|
1091
|
+
async searchData(query?: DyFM_SearchQuery<T>): Promise<DyFM_SearchResult<T>> {
|
|
1087
1092
|
try {
|
|
1088
|
-
if (!query || Object.keys(query).length === 0) {
|
|
1089
|
-
|
|
1090
|
-
|
|
1093
|
+
/* if (!query || Object.keys(query).length === 0) {
|
|
1094
|
+
console.log('T1');
|
|
1095
|
+
const allData: T[] = await this.getAll();
|
|
1096
|
+
|
|
1097
|
+
return {
|
|
1098
|
+
results: allData,
|
|
1099
|
+
totalItems: allData.length,
|
|
1100
|
+
};
|
|
1101
|
+
} */
|
|
1091
1102
|
|
|
1092
1103
|
if (!query.filterBy) {
|
|
1093
1104
|
query.filterBy = {};
|
|
1094
1105
|
}
|
|
1095
1106
|
|
|
1096
|
-
if (!query.page && !query.pageSize && !query.sortBy) {
|
|
1097
|
-
|
|
1098
|
-
|
|
1107
|
+
/* if (!query.page && !query.pageSize && !query.sortBy) {
|
|
1108
|
+
console.log('T2');
|
|
1109
|
+
const dataFindResult: T[] = await this.dataDBService.find(query.filterBy);
|
|
1110
|
+
|
|
1111
|
+
return {
|
|
1112
|
+
results: dataFindResult,
|
|
1113
|
+
totalItems: dataFindResult.length,
|
|
1114
|
+
};
|
|
1115
|
+
} */
|
|
1099
1116
|
|
|
1100
1117
|
if (!query.page) {
|
|
1101
|
-
query.page =
|
|
1118
|
+
query.page = 0;
|
|
1102
1119
|
}
|
|
1103
1120
|
|
|
1104
1121
|
if (!query.pageSize) {
|
|
@@ -1106,16 +1123,43 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
1106
1123
|
query.pageSize = DyNTS_global_settings.defaultPageSize;
|
|
1107
1124
|
}
|
|
1108
1125
|
|
|
1109
|
-
if (!query.sortBy) {
|
|
1110
|
-
query.sortBy = { __lastModified: -1 };
|
|
1126
|
+
if (!query.sortBy?.length) {
|
|
1127
|
+
query.sortBy = [{ key: '__lastModified', order: -1 }];
|
|
1111
1128
|
}
|
|
1112
1129
|
|
|
1113
|
-
|
|
1130
|
+
console.log('T3');
|
|
1131
|
+
/* const dataFindWithPagingResult: T[] = await this.dataDBService.findWithPaging(
|
|
1114
1132
|
query.filterBy,
|
|
1115
1133
|
query.page,
|
|
1116
1134
|
query.pageSize,
|
|
1117
1135
|
query.sortBy
|
|
1136
|
+
); */
|
|
1137
|
+
query.sortBy.reverse();
|
|
1138
|
+
|
|
1139
|
+
let dataList: T[] = await this.getAll();
|
|
1140
|
+
const filterKeys = Object.keys(query.filterBy);
|
|
1141
|
+
const filterFunctionsByKey: { [key: string]: (dataProperty) => boolean } = {};
|
|
1142
|
+
|
|
1143
|
+
filterKeys.forEach((key: string): void => {
|
|
1144
|
+
filterFunctionsByKey[key] = this.getFilterFunctionForKey(
|
|
1145
|
+
key, query.filterBy[key]
|
|
1146
|
+
);
|
|
1147
|
+
});
|
|
1148
|
+
|
|
1149
|
+
query.sortBy.forEach((sort: DyFM_DBĐSort): void => {
|
|
1150
|
+
dataList.sort(this.getSortFunctionForKey(sort.key, sort.order));
|
|
1151
|
+
});
|
|
1152
|
+
|
|
1153
|
+
dataList = dataList.filter(
|
|
1154
|
+
(data: T): boolean => filterKeys.every(
|
|
1155
|
+
(key: string): boolean => filterFunctionsByKey[key](data[key])
|
|
1156
|
+
)
|
|
1118
1157
|
);
|
|
1158
|
+
|
|
1159
|
+
return {
|
|
1160
|
+
results: dataList,
|
|
1161
|
+
totalItems: dataList.length,
|
|
1162
|
+
};
|
|
1119
1163
|
} catch (error) {
|
|
1120
1164
|
throw new DyFM_Error({
|
|
1121
1165
|
...this._getDefaultErrorSettings('searchData', error),
|
|
@@ -1125,6 +1169,180 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
|
|
|
1125
1169
|
}
|
|
1126
1170
|
}
|
|
1127
1171
|
|
|
1172
|
+
private getFilterFunctionForKey<T>(
|
|
1173
|
+
key: string,
|
|
1174
|
+
searchValue: T | T[] | DyFM_RangeValue<T>,
|
|
1175
|
+
): (dataProperty) => boolean {
|
|
1176
|
+
if (!this.dataParams.properties[key]) {
|
|
1177
|
+
throw new DyFM_Error({
|
|
1178
|
+
...this._getDefaultErrorSettings(
|
|
1179
|
+
'getFilterFunctionForKey',
|
|
1180
|
+
new Error(
|
|
1181
|
+
`getFilterFunctionForKey failed, key not found in dataParams ` +
|
|
1182
|
+
`(${this.dataParams.dataName})`
|
|
1183
|
+
)
|
|
1184
|
+
),
|
|
1185
|
+
|
|
1186
|
+
errorCode: 'NTS-DS0-GFF1',
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
if (searchValue === undefined) {
|
|
1191
|
+
throw new DyFM_Error({
|
|
1192
|
+
...this._getDefaultErrorSettings(
|
|
1193
|
+
'getFilterFunctionForKey',
|
|
1194
|
+
new Error(
|
|
1195
|
+
`getFilterFunctionForKey failed, searchValue is missing! ` +
|
|
1196
|
+
`(${this.dataParams.dataName})`
|
|
1197
|
+
)
|
|
1198
|
+
),
|
|
1199
|
+
|
|
1200
|
+
errorCode: 'NTS-DS0-GFF2',
|
|
1201
|
+
});
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
switch (this.dataParams.properties[key].type) {
|
|
1205
|
+
case 'String':
|
|
1206
|
+
return (dataProperty): boolean => dataProperty.includes(searchValue);
|
|
1207
|
+
|
|
1208
|
+
case 'Date':
|
|
1209
|
+
if ((searchValue as DyFM_RangeValue).isRange) {
|
|
1210
|
+
const rangeAsNumber = new DyFM_RangeValue<number>(
|
|
1211
|
+
+new Date((searchValue as DyFM_RangeValue).from),
|
|
1212
|
+
+new Date((searchValue as DyFM_RangeValue).to)
|
|
1213
|
+
);
|
|
1214
|
+
|
|
1215
|
+
return (dataProperty): boolean => DyFM_RangeValue.isInRange(
|
|
1216
|
+
+new Date(dataProperty), rangeAsNumber
|
|
1217
|
+
);
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
if (Array.isArray(searchValue)) {
|
|
1221
|
+
const searchValueAsDateArray = (searchValue as Date[]).map(
|
|
1222
|
+
(date: Date): Date => new Date(date)
|
|
1223
|
+
);
|
|
1224
|
+
|
|
1225
|
+
return (dataProperty): boolean => searchValueAsDateArray.includes(new Date(dataProperty));
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
const searchValueAsDate: Date = new Date(searchValue as Date);
|
|
1229
|
+
|
|
1230
|
+
return (dataProperty): boolean => new Date(dataProperty) === searchValueAsDate;
|
|
1231
|
+
|
|
1232
|
+
case 'Number':
|
|
1233
|
+
if ((searchValue as DyFM_RangeValue).isRange) {
|
|
1234
|
+
return (dataProperty): boolean => DyFM_RangeValue.isInRange(
|
|
1235
|
+
dataProperty, searchValue as DyFM_RangeValue<number>
|
|
1236
|
+
);
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
if (Array.isArray(searchValue)) {
|
|
1240
|
+
return (dataProperty): boolean => (searchValue as number[]).includes(dataProperty);
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
return (dataProperty): boolean => dataProperty === searchValue;
|
|
1244
|
+
|
|
1245
|
+
case 'Boolean':
|
|
1246
|
+
return (dataProperty): boolean => dataProperty === searchValue;
|
|
1247
|
+
|
|
1248
|
+
default:
|
|
1249
|
+
if ((searchValue as DyFM_RangeValue).isRange) {
|
|
1250
|
+
throw new DyFM_Error({
|
|
1251
|
+
...this._getDefaultErrorSettings(
|
|
1252
|
+
'getFilterFunctionForKey',
|
|
1253
|
+
new Error(
|
|
1254
|
+
`getFilterFunctionForKey failed, range search not implemented for this type ` +
|
|
1255
|
+
`(${this.dataParams.dataName})`
|
|
1256
|
+
)
|
|
1257
|
+
),
|
|
1258
|
+
|
|
1259
|
+
errorCode: 'NTS-DS0-GFF3',
|
|
1260
|
+
});
|
|
1261
|
+
}
|
|
1262
|
+
|
|
1263
|
+
if (Array.isArray(searchValue)) {
|
|
1264
|
+
return (dataProperty): boolean => (searchValue as number[]).includes(dataProperty);
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1267
|
+
return (dataProperty): boolean => dataProperty === searchValue;
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
private getSortFunctionForKey<T>(
|
|
1272
|
+
key: string,
|
|
1273
|
+
sortDirection: 1 | -1 | 'asc' | 'desc' | 'ascending' | 'descending'
|
|
1274
|
+
): (a: T, b: T) => number {
|
|
1275
|
+
if (!this.dataParams.properties[key]) {
|
|
1276
|
+
throw new DyFM_Error({
|
|
1277
|
+
...this._getDefaultErrorSettings(
|
|
1278
|
+
'getSortFunctionForKey',
|
|
1279
|
+
new Error(
|
|
1280
|
+
`getSortFunctionForKey failed, key not found in dataParams ` +
|
|
1281
|
+
`(${this.dataParams.dataName})`
|
|
1282
|
+
)
|
|
1283
|
+
),
|
|
1284
|
+
|
|
1285
|
+
errorCode: 'NTS-DS0-GSF1',
|
|
1286
|
+
});
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
const sortValue: 1 | -1 = (
|
|
1290
|
+
sortDirection === 1 || sortDirection === 'asc' || sortDirection === 'ascending'
|
|
1291
|
+
) ? 1 : -1;
|
|
1292
|
+
|
|
1293
|
+
switch (this.dataParams.properties[key].type) {
|
|
1294
|
+
case 'String':
|
|
1295
|
+
return (a: T, b: T): number => (a as string).localeCompare(b as string) * sortValue;
|
|
1296
|
+
|
|
1297
|
+
case 'Date':
|
|
1298
|
+
return (a: T, b: T): number => {
|
|
1299
|
+
if (+new Date(a[key]) < +new Date(b[key])) {
|
|
1300
|
+
return -sortValue;
|
|
1301
|
+
} else if (+new Date(a[key]) > +new Date(b[key])) {
|
|
1302
|
+
return sortValue;
|
|
1303
|
+
} else {
|
|
1304
|
+
return 0;
|
|
1305
|
+
}
|
|
1306
|
+
};
|
|
1307
|
+
|
|
1308
|
+
case 'Number':
|
|
1309
|
+
return (a: T, b: T): number => {
|
|
1310
|
+
if (a[key] < b[key]) {
|
|
1311
|
+
return -sortValue;
|
|
1312
|
+
} else if (a[key] > b[key]) {
|
|
1313
|
+
return sortValue;
|
|
1314
|
+
} else {
|
|
1315
|
+
return 0;
|
|
1316
|
+
}
|
|
1317
|
+
};
|
|
1318
|
+
|
|
1319
|
+
case 'Boolean':
|
|
1320
|
+
return (a: T, b: T): number => {
|
|
1321
|
+
if (a[key] === b[key]) {
|
|
1322
|
+
return 0;
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
if (a[key]) {
|
|
1326
|
+
return sortValue;
|
|
1327
|
+
}
|
|
1328
|
+
|
|
1329
|
+
return -sortValue;
|
|
1330
|
+
};
|
|
1331
|
+
|
|
1332
|
+
default:
|
|
1333
|
+
throw new DyFM_Error({
|
|
1334
|
+
...this._getDefaultErrorSettings(
|
|
1335
|
+
'getSortFunctionForKey',
|
|
1336
|
+
new Error(
|
|
1337
|
+
`getSortFunctionForKey failed, sorting not implemented for this type ` +
|
|
1338
|
+
`(${this.dataParams.dataName}, ${this.dataParams.properties[key].type})`
|
|
1339
|
+
)
|
|
1340
|
+
),
|
|
1341
|
+
|
|
1342
|
+
errorCode: 'NTS-DS0-GSF2',
|
|
1343
|
+
});
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1128
1346
|
|
|
1129
1347
|
/**
|
|
1130
1348
|
* setting up dependency dataHook by DynamoBEDataModelParams
|
|
@@ -104,7 +104,10 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
104
104
|
throw new DyFM_Error({
|
|
105
105
|
...this._getDefaultErrorSettings('createData', error, issuer),
|
|
106
106
|
errorCode: 'NTS-DBS-CD0',
|
|
107
|
-
additionalContent: {
|
|
107
|
+
additionalContent: {
|
|
108
|
+
data: data,
|
|
109
|
+
dataModel: this.dataModel,
|
|
110
|
+
},
|
|
108
111
|
message:
|
|
109
112
|
`createData failed, Create new "${this.dataParams.dbName}" was unsuccessful (NTS DB)`,
|
|
110
113
|
issuer,
|
|
@@ -707,6 +710,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
707
710
|
/**
|
|
708
711
|
* #MONGOOSE FUNCTION
|
|
709
712
|
* Find the data first by any of its parameters
|
|
713
|
+
* WARNING: This function will not gives you back the total number of data in the database!
|
|
710
714
|
*
|
|
711
715
|
* @param filterBy if you can, use unique parameters for find!
|
|
712
716
|
*
|
|
@@ -743,9 +747,9 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
743
747
|
pageSize: number,
|
|
744
748
|
sort?: DyFM_DBSort<T>
|
|
745
749
|
): Promise<T[]> {
|
|
746
|
-
if (filterBy['_deleted'] === undefined) {
|
|
750
|
+
/* if (filterBy['_deleted'] === undefined) {
|
|
747
751
|
filterBy['_deleted'] = null;
|
|
748
|
-
}
|
|
752
|
+
} */
|
|
749
753
|
|
|
750
754
|
const dataList: T[] = await this.dataModel
|
|
751
755
|
.find(filterBy)
|
|
@@ -1004,17 +1008,17 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
1004
1008
|
* @returns schema
|
|
1005
1009
|
*/
|
|
1006
1010
|
private getSchema(): mongoose.Schema {
|
|
1007
|
-
|
|
1011
|
+
this.dataParams.properties = this.addMetadataToProperties(this.dataParams.properties);
|
|
1012
|
+
|
|
1013
|
+
let schema: any = this.buildMongooseSchemaByModelParams(this.dataParams.properties);
|
|
1008
1014
|
|
|
1009
|
-
schema = this.addMetadataToSchema(schema);
|
|
1015
|
+
/* schema = this.addMetadataToSchema(schema); */
|
|
1010
1016
|
|
|
1011
1017
|
if (this.dataParams.dataName.includes(DyNTS_archiveSuffix)) {
|
|
1012
1018
|
schema = this.addArchiveMetadataToSchema(schema);
|
|
1013
1019
|
}
|
|
1014
1020
|
|
|
1015
|
-
// tslint:disable-next-line: no-string-literal
|
|
1016
1021
|
if (schema['_id']) {
|
|
1017
|
-
// tslint:disable-next-line: no-string-literal
|
|
1018
1022
|
delete schema['_id'];
|
|
1019
1023
|
}
|
|
1020
1024
|
|
|
@@ -1026,14 +1030,20 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
1026
1030
|
* @param properties DynamoBEDataPropertyParams
|
|
1027
1031
|
* @returns mongoose schema object
|
|
1028
1032
|
*/
|
|
1029
|
-
private buildMongooseSchemaByModelParams(properties
|
|
1033
|
+
private buildMongooseSchemaByModelParams(properties: DyFM_DataProperties<T>): any {
|
|
1030
1034
|
const schemaSettingsObj = {};
|
|
1031
1035
|
|
|
1032
|
-
if (!properties) {
|
|
1036
|
+
/* if (!properties) {
|
|
1033
1037
|
properties = this.dataParams.properties;
|
|
1034
|
-
}
|
|
1038
|
+
} */
|
|
1035
1039
|
|
|
1036
1040
|
Object.values(properties).forEach((property: DyFM_DataProperty_Params<any>): void => {
|
|
1041
|
+
if (!property) {
|
|
1042
|
+
DyFM_Log.warn(`property is undefined on ${this.dataParams.dbName} (NTS DB)`);
|
|
1043
|
+
|
|
1044
|
+
return;
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1037
1047
|
const beType = this.getBEType(property.type);
|
|
1038
1048
|
|
|
1039
1049
|
if (
|
|
@@ -1076,7 +1086,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
1076
1086
|
|
|
1077
1087
|
private getBEType(
|
|
1078
1088
|
type: string
|
|
1079
|
-
):
|
|
1089
|
+
): string | number | boolean | object | Function | Array<any> | Date {
|
|
1080
1090
|
switch (type.toLocaleLowerCase()) {
|
|
1081
1091
|
|
|
1082
1092
|
case 'string':
|
|
@@ -1110,7 +1120,7 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
1110
1120
|
* @param schema schema to update
|
|
1111
1121
|
* @returns updated schema
|
|
1112
1122
|
*/
|
|
1113
|
-
private addMetadataToSchema(schema: any): any {
|
|
1123
|
+
/* private addMetadataToSchema(schema: any): any {
|
|
1114
1124
|
schema.__created = { type: Date };
|
|
1115
1125
|
schema.__createdBy = { type: String };
|
|
1116
1126
|
schema.__lastModified = { type: Date };
|
|
@@ -1120,6 +1130,34 @@ export class DyNTS_DBService<T extends DyFM_Metadata> {
|
|
|
1120
1130
|
schema._deletedBy = { type: String };
|
|
1121
1131
|
|
|
1122
1132
|
return schema;
|
|
1133
|
+
} */
|
|
1134
|
+
|
|
1135
|
+
private addMetadataToProperties(properties: DyFM_DataProperties<T>): DyFM_DataProperties<T> {
|
|
1136
|
+
if (!properties.__created) {
|
|
1137
|
+
properties.__created = { type: 'Date' };
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
if (!properties.__createdBy) {
|
|
1141
|
+
properties.__createdBy = { type: 'String' };
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
if (!properties.__lastModified) {
|
|
1145
|
+
properties.__lastModified = { type: 'Date' };
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
if (!properties.__lastModifiedBy) {
|
|
1149
|
+
properties.__lastModifiedBy = { type: 'String' };
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
if (!properties._deleted) {
|
|
1153
|
+
properties._deleted = { type: 'Date' };
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
if (!properties._deletedBy) {
|
|
1157
|
+
properties._deletedBy = { type: 'String' };
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
return properties;
|
|
1123
1161
|
}
|
|
1124
1162
|
|
|
1125
1163
|
private addArchiveMetadataToSchema(schema: any): any {
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
|
|
2
|
+
import { DyNTS_ApiService, DyNTS_ApiCallInput_Params } from './api.service';
|
|
3
|
+
import { DyNTS_ApiCall_Params } from '../../_models/control-models/api-call-params.control-model';
|
|
4
|
+
import { DyNTS_HttpCallType } from '../../_enums/http/http-call-type.enum';
|
|
5
|
+
import { DyNTS_HttpResponseType } from '../../_enums/http/http-response-type.enum';
|
|
6
|
+
import { DyFM_Error } from '@futdevpro/fsm-dynamo';
|
|
7
|
+
import Axios from 'axios';
|
|
8
|
+
|
|
9
|
+
describe('DyNTS_ApiService', () => {
|
|
10
|
+
let callParams: DyNTS_ApiCall_Params;
|
|
11
|
+
let inputParams: DyNTS_ApiCallInput_Params;
|
|
12
|
+
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
callParams = {
|
|
15
|
+
baseUrl: 'http://example.com',
|
|
16
|
+
endPoint: '/api/test',
|
|
17
|
+
type: DyNTS_HttpCallType.get,
|
|
18
|
+
httpOptions: {
|
|
19
|
+
headers: {},
|
|
20
|
+
responseType: DyNTS_HttpResponseType.json,
|
|
21
|
+
},
|
|
22
|
+
name: 'Test API Call',
|
|
23
|
+
getFullResponse: false,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
inputParams = {
|
|
27
|
+
pathParams: { id: '123' },
|
|
28
|
+
body: { key: 'value' },
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should make a GET request successfully', async () => {
|
|
33
|
+
callParams.type = DyNTS_HttpCallType.get;
|
|
34
|
+
const response = { data: { success: true } };
|
|
35
|
+
spyOn(Axios, 'create').and.returnValue({
|
|
36
|
+
get: jasmine.createSpy().and.returnValue(Promise.resolve(response)),
|
|
37
|
+
} as any);
|
|
38
|
+
|
|
39
|
+
const result = await DyNTS_ApiService.startApiCall(callParams, inputParams);
|
|
40
|
+
expect(result).toEqual(response.data);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should handle a POST request successfully', async () => {
|
|
44
|
+
callParams.type = DyNTS_HttpCallType.post;
|
|
45
|
+
const response = { data: { success: true } };
|
|
46
|
+
spyOn(Axios, 'create').and.returnValue({
|
|
47
|
+
post: jasmine.createSpy().and.returnValue(Promise.resolve(response)),
|
|
48
|
+
} as any);
|
|
49
|
+
|
|
50
|
+
const result = await DyNTS_ApiService.startApiCall(callParams, inputParams);
|
|
51
|
+
expect(result).toEqual(response.data);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('should throw an error for unsupported HTTP method', async () => {
|
|
55
|
+
callParams.type = 'unsupported' as DyNTS_HttpCallType;
|
|
56
|
+
|
|
57
|
+
await expectAsync(DyNTS_ApiService.startApiCall(callParams, inputParams)).toBeRejectedWith(
|
|
58
|
+
jasmine.any(DyFM_Error)
|
|
59
|
+
);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('should handle error response with DYNAMO flag', async () => {
|
|
63
|
+
const errorResponse = {
|
|
64
|
+
response: { data: { flag: 'DYNAMO', message: 'Error' } },
|
|
65
|
+
};
|
|
66
|
+
spyOn(Axios, 'create').and.returnValue({
|
|
67
|
+
get: jasmine.createSpy().and.returnValue(Promise.reject(errorResponse)),
|
|
68
|
+
} as any);
|
|
69
|
+
|
|
70
|
+
await expectAsync(DyNTS_ApiService.startApiCall(callParams, inputParams)).toBeRejectedWith(
|
|
71
|
+
jasmine.any(DyFM_Error)
|
|
72
|
+
);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should handle DNS error', async () => {
|
|
76
|
+
const error = { code: 'ENOTFOUND' };
|
|
77
|
+
spyOn(Axios, 'create').and.returnValue({
|
|
78
|
+
get: jasmine.createSpy().and.returnValue(Promise.reject(error)),
|
|
79
|
+
} as any);
|
|
80
|
+
|
|
81
|
+
await expectAsync(DyNTS_ApiService.startApiCall(callParams, inputParams)).toBeRejectedWith(
|
|
82
|
+
jasmine.any(DyFM_Error)
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('should handle connection refused error', async () => {
|
|
87
|
+
const error = { code: 'ECONNREFUSED' };
|
|
88
|
+
spyOn(Axios, 'create').and.returnValue({
|
|
89
|
+
get: jasmine.createSpy().and.returnValue(Promise.reject(error)),
|
|
90
|
+
} as any);
|
|
91
|
+
|
|
92
|
+
await expectAsync(DyNTS_ApiService.startApiCall(callParams, inputParams)).toBeRejectedWith(
|
|
93
|
+
jasmine.any(DyFM_Error)
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
});
|