http-request-manager 18.7.19 → 18.7.21
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/ARCHITECTURE.md +483 -0
- package/DATABASE_README.md +1176 -0
- package/HTTP_MANAGER_README.md +579 -0
- package/HTTP_SINGNALS_MANAGER_README.md +654 -0
- package/HTTP_STATE_MANAGER_README.md +948 -0
- package/INTERCEPTOR_README.md +549 -0
- package/LOCAL_STORAGE_README.md +1056 -0
- package/STORE_STATE_MANAGER_README.md +1322 -0
- package/UTILS_README.md +1186 -0
- package/WS_MANAGER_README.md +613 -0
- package/ng-package.json +8 -0
- package/package.json +1 -12
- package/src/lib/http-request-manager.module.ts +132 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +65 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
- package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +224 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.html +114 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
- package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +52 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
- package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +206 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
- package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +212 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +392 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +461 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +393 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +421 -0
- package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +87 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +120 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +72 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +205 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +77 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +96 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +229 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +41 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
- package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +158 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
- package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +48 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
- package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
- package/src/lib/index.ts +3 -0
- package/src/lib/interceptors/credentials.interceptor.ts +16 -0
- package/src/lib/interceptors/index.ts +6 -0
- package/src/lib/interceptors/models/error-settings.model.ts +22 -0
- package/src/lib/interceptors/models/index.ts +2 -0
- package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
- package/src/lib/interceptors/request-error.interceptor.ts +65 -0
- package/src/lib/interceptors/request-header.interceptor.ts +53 -0
- package/src/lib/models/config-http-options.model.ts +42 -0
- package/src/lib/models/config-local-storage-options.model.ts +27 -0
- package/src/lib/models/config-options.model.ts +27 -0
- package/src/lib/models/config-token.model.ts +9 -0
- package/src/lib/models/data-type.enum.ts +5 -0
- package/src/lib/models/database-storage.model.ts +24 -0
- package/src/lib/models/index.ts +12 -0
- package/src/lib/models/retry-options.model.ts +22 -0
- package/src/lib/services/database-manager-service/database.manager.service.ts +262 -0
- package/src/lib/services/database-manager-service/db.storage.service.ts +207 -0
- package/src/lib/services/database-manager-service/index.ts +4 -0
- package/src/lib/services/database-manager-service/models/index.ts +2 -0
- package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
- package/src/lib/services/index.ts +12 -0
- package/src/lib/services/local-storage-manager-service/index.ts +4 -0
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
- package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +426 -0
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
- package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +345 -0
- package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
- package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
- package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
- package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
- package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
- package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
- package/src/lib/services/request-manager-services/README.md +268 -0
- package/src/lib/services/request-manager-services/http-manager-signals.service.ts +246 -0
- package/src/lib/services/request-manager-services/http-manager.service.spec.ts +232 -0
- package/src/lib/services/request-manager-services/http-manager.service.ts +274 -0
- package/src/lib/services/request-manager-services/index.ts +8 -0
- package/src/lib/services/request-manager-services/request-signals.service.ts +214 -0
- package/src/lib/services/request-manager-services/request.service.ts +309 -0
- package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
- package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
- package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
- package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
- package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +436 -0
- package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +1321 -0
- package/src/lib/services/request-manager-state-service/index.ts +3 -0
- package/src/lib/services/request-manager-state-service/models/api-request.model.ts +61 -0
- package/src/lib/services/request-manager-state-service/models/index.ts +6 -0
- package/src/lib/services/request-manager-state-service/models/request-options.model.ts +22 -0
- package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
- package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +39 -0
- package/src/lib/services/store-state-manager-service/index.ts +3 -0
- package/src/lib/services/store-state-manager-service/models/index.ts +2 -0
- package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
- package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +88 -0
- package/src/lib/services/utils/app.service.spec.ts +25 -0
- package/src/lib/services/utils/app.service.ts +21 -0
- package/src/lib/services/utils/encryption/README.md +79 -0
- package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
- package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
- package/src/lib/services/utils/encryption/index.ts +5 -0
- package/src/lib/services/utils/encryption/random.ts +81 -0
- package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +93 -0
- package/src/lib/services/utils/headers.service.spec.ts +80 -0
- package/src/lib/services/utils/headers.service.ts +18 -0
- package/src/lib/services/utils/index.ts +7 -0
- package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
- package/src/lib/services/utils/object-merger.service.ts +78 -0
- package/src/lib/services/utils/path-query.service.spec.ts +117 -0
- package/src/lib/services/utils/path-query.service.ts +69 -0
- package/src/lib/services/utils/random-color.utils.ts +83 -0
- package/src/lib/services/utils/utils.service.spec.ts +165 -0
- package/src/lib/services/utils/utils.service.ts +192 -0
- package/src/lib/services/ws-manager-service/index.ts +4 -0
- package/src/lib/services/ws-manager-service/models/channel-info.model.ts +24 -0
- package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
- package/src/lib/services/ws-manager-service/models/channel-message.model.ts +24 -0
- package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
- package/src/lib/services/ws-manager-service/models/index.ts +5 -0
- package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
- package/src/lib/services/ws-manager-service/services/index.ts +3 -0
- package/src/lib/services/ws-manager-service/services/websocket.service.ts +392 -0
- package/src/public-api.ts +14 -0
- package/tsconfig.lib.json +32 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +14 -0
- package/fesm2022/http-request-manager.mjs +0 -7634
- package/fesm2022/http-request-manager.mjs.map +0 -1
- package/http-request-manager-18.7.19.tgz +0 -0
- package/types/http-request-manager.d.ts +0 -2278
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
@Injectable({
|
|
4
|
+
providedIn: 'root'
|
|
5
|
+
})
|
|
6
|
+
export class EncryptionTestService {
|
|
7
|
+
|
|
8
|
+
constructor() { }
|
|
9
|
+
|
|
10
|
+
private isBase64(str: string): boolean {
|
|
11
|
+
const base64Pattern = /^(?:[A-Z0-9+/]{4})*(?:[A-Z0-9+/]{2}==|[A-Z0-9+/]{3}=)?$/i;
|
|
12
|
+
return base64Pattern.test(str);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
private isHexadecimal(str: string): boolean {
|
|
16
|
+
const hexPattern = /^[0-9a-fA-F]+$/;
|
|
17
|
+
return hexPattern.test(str) && (str.length % 2 === 0);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
private hasHighEntropy(str: string): boolean {
|
|
21
|
+
const uniqueChars = new Set(str).size;
|
|
22
|
+
return uniqueChars > str.length * 0.6;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
isEncrypted(str: string): boolean {
|
|
26
|
+
|
|
27
|
+
if (typeof str !== 'string') {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (this.isBase64(str) || this.isHexadecimal(str)) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return this.hasHighEntropy(str);
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export const Random = () => {
|
|
2
|
+
const typedArray = new Uint8Array(1)
|
|
3
|
+
const randomValue = crypto.getRandomValues(typedArray)[0]
|
|
4
|
+
const randomFloat = randomValue / Math.pow(2, 8)
|
|
5
|
+
return randomFloat
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const RandomNumber = (min: number, max: number) => {
|
|
9
|
+
return Math.floor(Random() * max) + min
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const RandomNumbers = (min: number, max: number, length: number) => {
|
|
13
|
+
const numbers: number[] = []
|
|
14
|
+
for (let i = 0; i < length; i++) numbers.push(Math.floor(Random() * max) + min)
|
|
15
|
+
return numbers
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const RandomNumbersUnique = (min: number, max: number, length: number) => {
|
|
19
|
+
let count = 0;
|
|
20
|
+
|
|
21
|
+
// Adjust the length if it exceeds the number of unique numbers possible in the range
|
|
22
|
+
if (length > (max - min + 1)) {
|
|
23
|
+
console.error('error encountered');
|
|
24
|
+
length = max - min + 1;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
console.log('length', length);
|
|
28
|
+
const numbers: number[] = [];
|
|
29
|
+
const maxAttempts = length * 100 ; // Safeguard to prevent infinite loops
|
|
30
|
+
|
|
31
|
+
while (numbers.length < length && count < maxAttempts) {
|
|
32
|
+
|
|
33
|
+
const num = Math.floor(Random() * max) + min;
|
|
34
|
+
|
|
35
|
+
if (!numbers.includes(num)) {
|
|
36
|
+
numbers.push(num);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (count >= maxAttempts) {
|
|
41
|
+
throw new Error('Maximum attempts exceeded while generating unique numbers');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return numbers;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export const RandomStr = () => {
|
|
48
|
+
|
|
49
|
+
const typedArray = new Uint8Array(8)
|
|
50
|
+
const array = new Uint32Array(1)
|
|
51
|
+
crypto.getRandomValues(array)
|
|
52
|
+
return array[0].toString(36)
|
|
53
|
+
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const RandomSignature = () => {
|
|
57
|
+
|
|
58
|
+
const typedArray = new Uint8Array(8)
|
|
59
|
+
const array = new Uint32Array(1)
|
|
60
|
+
crypto.getRandomValues(array)
|
|
61
|
+
return array[0]
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const UUID = () => {
|
|
66
|
+
return self.crypto.randomUUID()
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Generate a UUID string (legacy format)
|
|
71
|
+
*/
|
|
72
|
+
export const UUID_STR = (): string => {
|
|
73
|
+
const s4 = () => {
|
|
74
|
+
return Math.floor((1 + Random()) * 0x10000)
|
|
75
|
+
.toString(16)
|
|
76
|
+
.substring(1);
|
|
77
|
+
};
|
|
78
|
+
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import * as CryptoJS from 'crypto-js';
|
|
3
|
+
|
|
4
|
+
import { RandomSignature } from './random';
|
|
5
|
+
import { AppService } from '../app.service';
|
|
6
|
+
|
|
7
|
+
@Injectable({
|
|
8
|
+
providedIn: 'root'
|
|
9
|
+
})
|
|
10
|
+
export class SymmetricalEncryptionService {
|
|
11
|
+
|
|
12
|
+
appID: string; // APP SERVICE TO MANAGER ENCRYPTION KEY
|
|
13
|
+
|
|
14
|
+
private appService = inject(AppService)
|
|
15
|
+
|
|
16
|
+
constructor() {
|
|
17
|
+
// TODO: The APP ID is not a string, it is a function
|
|
18
|
+
this.appID = (this.appService.appID) ? this.appService.appID : ''
|
|
19
|
+
if(this.appID === '') console.warn('No App Key has been define')
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
generateCipherKey() {
|
|
23
|
+
return (RandomSignature().toString() + RandomSignature().toString()).substring(0, 8)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
encrypt(str: any, key = this.appID) {
|
|
27
|
+
|
|
28
|
+
if(!str || key === '') return ''
|
|
29
|
+
|
|
30
|
+
let _key = CryptoJS.enc.Utf8.parse(key)
|
|
31
|
+
let _iv = CryptoJS.enc.Utf8.parse(key)
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
|
|
35
|
+
const encrypted = CryptoJS.AES.encrypt(
|
|
36
|
+
JSON.stringify(str), _key, {
|
|
37
|
+
keySize: 16,
|
|
38
|
+
iv: _iv,
|
|
39
|
+
mode: CryptoJS.mode.ECB,
|
|
40
|
+
padding: CryptoJS.pad.Pkcs7
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
return encrypted.toString()
|
|
44
|
+
|
|
45
|
+
} catch(error: any) {
|
|
46
|
+
console.log(error)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
decrypt(str: string, key = this.appID) {
|
|
53
|
+
|
|
54
|
+
if(!str || key === '') return
|
|
55
|
+
|
|
56
|
+
let _key = CryptoJS.enc.Utf8.parse(key)
|
|
57
|
+
let _iv = CryptoJS.enc.Utf8.parse(key)
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
|
|
61
|
+
return CryptoJS.AES.decrypt(
|
|
62
|
+
str, _key, {
|
|
63
|
+
keySize: 16,
|
|
64
|
+
iv: _iv,
|
|
65
|
+
mode: CryptoJS.mode.ECB,
|
|
66
|
+
padding: CryptoJS.pad.Pkcs7
|
|
67
|
+
}).toString(CryptoJS.enc.Utf8);
|
|
68
|
+
|
|
69
|
+
} catch(error: any) {
|
|
70
|
+
console.log(error)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
createSignature(url: string, len = 16) {
|
|
77
|
+
const sig = CryptoJS.SHA256(url).toString(CryptoJS.enc.Hex)
|
|
78
|
+
return sig.substring(0, len).toUpperCase()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
normalizeURL(url: string) {
|
|
82
|
+
const normalizedURL = url.replace(/(https?:\/\/)?(www\.)?/, '').replace(/\/+$/, '');
|
|
83
|
+
return normalizedURL;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
generateSignature(url: string) {
|
|
87
|
+
const normalizedURL = this.normalizeURL(url)
|
|
88
|
+
const hash = CryptoJS.SHA256(normalizedURL)
|
|
89
|
+
const signature = hash.toString(CryptoJS.enc.Hex)
|
|
90
|
+
return signature;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { TestBed } from '@angular/core/testing';
|
|
2
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
+
import { HeadersService } from './headers.service';
|
|
4
|
+
|
|
5
|
+
describe('HeadersService', () => {
|
|
6
|
+
let service: HeadersService;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
TestBed.configureTestingModule({
|
|
10
|
+
providers: [HeadersService]
|
|
11
|
+
});
|
|
12
|
+
service = TestBed.inject(HeadersService);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should be created', () => {
|
|
16
|
+
expect(service).toBeTruthy();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it('should generate headers correctly', () => {
|
|
20
|
+
service.headers = { 'Content-Type': 'application/json' };
|
|
21
|
+
const customHeaders = { 'Authorization': 'Bearer token' };
|
|
22
|
+
const result = service.generateHeaders(customHeaders);
|
|
23
|
+
expect(result.headers.get('Content-Type')).toBe('application/json');
|
|
24
|
+
expect(result.headers.get('Authorization')).toBe('Bearer token');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('should override default headers with custom headers', () => {
|
|
28
|
+
service.headers = { 'Content-Type': 'application/json' };
|
|
29
|
+
const customHeaders = { 'Content-Type': 'text/plain' };
|
|
30
|
+
const result = service.generateHeaders(customHeaders);
|
|
31
|
+
expect(result.headers.get('Content-Type')).toBe('text/plain');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('should handle empty custom headers', () => {
|
|
35
|
+
service.headers = { 'Content-Type': 'application/json' };
|
|
36
|
+
const customHeaders = {};
|
|
37
|
+
const result = service.generateHeaders(customHeaders);
|
|
38
|
+
expect(result.headers.get('Content-Type')).toBe('application/json');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should handle empty default headers', () => {
|
|
42
|
+
service.headers = {};
|
|
43
|
+
const customHeaders = { 'Content-Type': 'text/plain' };
|
|
44
|
+
const result = service.generateHeaders(customHeaders);
|
|
45
|
+
expect(result.headers.get('Content-Type')).toBe('text/plain');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should merge multiple headers correctly', () => {
|
|
49
|
+
service.headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' };
|
|
50
|
+
const customHeaders = { 'Authorization': 'Bearer token', 'Accept': 'text/plain' };
|
|
51
|
+
const result = service.generateHeaders(customHeaders);
|
|
52
|
+
expect(result.headers.get('Content-Type')).toBe('application/json');
|
|
53
|
+
expect(result.headers.get('Authorization')).toBe('Bearer token');
|
|
54
|
+
expect(result.headers.get('Accept')).toBe('text/plain');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should handle no headers', () => {
|
|
58
|
+
service.headers = {};
|
|
59
|
+
const customHeaders = {};
|
|
60
|
+
const result = service.generateHeaders(customHeaders);
|
|
61
|
+
expect(result.headers.keys().length).toBe(0);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should prioritize custom headers over default headers', () => {
|
|
65
|
+
service.headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer defaultToken' };
|
|
66
|
+
const customHeaders = { 'Authorization': 'Bearer customToken' };
|
|
67
|
+
const result = service.generateHeaders(customHeaders);
|
|
68
|
+
expect(result.headers.get('Content-Type')).toBe('application/json');
|
|
69
|
+
expect(result.headers.get('Authorization')).toBe('Bearer customToken');
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('should add new custom headers to default headers', () => {
|
|
73
|
+
service.headers = { 'Content-Type': 'application/json' };
|
|
74
|
+
const customHeaders = { 'Authorization': 'Bearer token', 'Accept': 'application/xml' };
|
|
75
|
+
const result = service.generateHeaders(customHeaders);
|
|
76
|
+
expect(result.headers.get('Content-Type')).toBe('application/json');
|
|
77
|
+
expect(result.headers.get('Authorization')).toBe('Bearer token');
|
|
78
|
+
expect(result.headers.get('Accept')).toBe('application/xml');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
@Injectable({
|
|
5
|
+
providedIn: 'root'
|
|
6
|
+
})
|
|
7
|
+
export class HeadersService {
|
|
8
|
+
|
|
9
|
+
headers = {}
|
|
10
|
+
|
|
11
|
+
generateHeaders(headers?: Record<string, string>): { headers: HttpHeaders } {
|
|
12
|
+
|
|
13
|
+
const allHeaders = headers ? { ...this.headers, ...headers } : {}
|
|
14
|
+
return { headers: new HttpHeaders(allHeaders) }
|
|
15
|
+
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* tslint:disable:no-unused-variable */
|
|
2
|
+
|
|
3
|
+
import { TestBed, inject } from '@angular/core/testing';
|
|
4
|
+
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
|
5
|
+
import { ObjectMergerService } from './object-merger.service';
|
|
6
|
+
|
|
7
|
+
describe('Service: ObjectMerger', () => {
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
TestBed.configureTestingModule({
|
|
10
|
+
imports: [HttpClientTestingModule],
|
|
11
|
+
providers: [ObjectMergerService]
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should ...', inject([ObjectMergerService], (service: ObjectMergerService) => {
|
|
16
|
+
expect(service).toBeTruthy();
|
|
17
|
+
}));
|
|
18
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Inject, Injectable, Optional, inject } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
import { ApiRequest } from '../request-manager-state-service/models';
|
|
4
|
+
import { SettingOptions } from '../local-storage-manager-service';
|
|
5
|
+
import { UtilsService } from './utils.service';
|
|
6
|
+
|
|
7
|
+
import { CONFIG_SETTINGS_TOKEN } from '../../models/config-token.model';
|
|
8
|
+
import { ConfigHTTPOptions, ConfigOptions, LocalStorageOptions } from '../request-manager-services';
|
|
9
|
+
|
|
10
|
+
@Injectable({
|
|
11
|
+
providedIn: 'root'
|
|
12
|
+
})
|
|
13
|
+
export class ObjectMergerService {
|
|
14
|
+
|
|
15
|
+
utils = inject(UtilsService);
|
|
16
|
+
|
|
17
|
+
constructor(@Inject(CONFIG_SETTINGS_TOKEN) @Optional() private configOptions?: ConfigOptions) {
|
|
18
|
+
if (!this.configOptions) this.configOptions = ConfigOptions.adapt()
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
mergeOptions(options = ApiRequest.adapt()) {
|
|
22
|
+
|
|
23
|
+
const configForRoot = (this.configOptions?.httpRequestOptions) ? this.configOptions.httpRequestOptions : ConfigHTTPOptions.adapt()
|
|
24
|
+
const mergedOptions = ApiRequest.adapt(options)
|
|
25
|
+
|
|
26
|
+
mergedOptions.server = (options && options.server === '') ? configForRoot?.server || '' : options.server
|
|
27
|
+
|
|
28
|
+
mergedOptions.path = [ ...options.path || [], ...configForRoot?.path || [] ]
|
|
29
|
+
|
|
30
|
+
mergedOptions.headers = { ...options.headers || {}, ...configForRoot?.headers || {} }
|
|
31
|
+
|
|
32
|
+
mergedOptions.retry = (options && (options?.retry?.times !== 0 || options?.retry?.delay !== 3)) ? options.retry : configForRoot?.retry || { times: 0, delay: 3 };
|
|
33
|
+
|
|
34
|
+
mergedOptions.polling = (options && options?.polling !== 0) ? options.polling : configForRoot?.polling || 0;
|
|
35
|
+
|
|
36
|
+
mergedOptions.displayError = (options && options?.displayError) ? options.displayError : configForRoot?.displayError || false;
|
|
37
|
+
|
|
38
|
+
mergedOptions.stream = (options && options?.stream) ? options.stream : configForRoot?.stream || false;
|
|
39
|
+
|
|
40
|
+
return mergedOptions;
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
mergeStorageOptions(options = SettingOptions.adapt()) {
|
|
45
|
+
|
|
46
|
+
const configForRoot = (this.configOptions?.LocalStorageOptions) ? this.configOptions.LocalStorageOptions : LocalStorageOptions.adapt()
|
|
47
|
+
const configForRootOptions = configForRoot.options || LocalStorageOptions.adapt().options
|
|
48
|
+
|
|
49
|
+
const mergedOptions = SettingOptions.adapt(options)
|
|
50
|
+
|
|
51
|
+
// storage type
|
|
52
|
+
mergedOptions.storage = (options && (typeof options.storage !== 'undefined')) ? options.storage : (configForRootOptions?.storage ?? 0)
|
|
53
|
+
|
|
54
|
+
// expires: prefer explicit numeric expires; if not provided, compute from expiresIn string; otherwise use config default
|
|
55
|
+
// if an explicit, non-zero numeric expires is provided, use it
|
|
56
|
+
if (options && (typeof options.expires !== 'undefined') && options.expires !== null && Number(options.expires) > 0) {
|
|
57
|
+
mergedOptions.expires = Number(options.expires);
|
|
58
|
+
} else if (options && options.expiresIn) {
|
|
59
|
+
// compute numeric epoch from expiresIn string using UtilsService if available
|
|
60
|
+
try {
|
|
61
|
+
mergedOptions.expires = this.utils ? this.utils.expires(options.expiresIn) : 0;
|
|
62
|
+
} catch {
|
|
63
|
+
mergedOptions.expires = 0;
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
mergedOptions.expires = configForRootOptions?.expires ?? 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// keep expiresIn string if explicitly provided, otherwise use config default
|
|
70
|
+
mergedOptions.expiresIn = (options && (typeof options.expiresIn !== 'undefined')) ? options.expiresIn : (configForRootOptions?.expiresIn || '')
|
|
71
|
+
|
|
72
|
+
mergedOptions.encrypted = (options && (typeof options.encrypted !== 'undefined')) ? options.encrypted : (configForRootOptions?.encrypted || false)
|
|
73
|
+
|
|
74
|
+
return mergedOptions;
|
|
75
|
+
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { TestBed } from '@angular/core/testing';
|
|
2
|
+
import { PathQueryService } from './path-query.service';
|
|
3
|
+
|
|
4
|
+
describe('PathQueryService', () => {
|
|
5
|
+
let service: PathQueryService;
|
|
6
|
+
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
TestBed.configureTestingModule({
|
|
9
|
+
providers: [PathQueryService]
|
|
10
|
+
});
|
|
11
|
+
service = TestBed.inject(PathQueryService);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('should be created', () => {
|
|
15
|
+
expect(service).toBeTruthy();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('should build API path with only server', () => {
|
|
19
|
+
const result = service.buildAPIPath('http://example.com');
|
|
20
|
+
expect(result).toBe('http://example.com');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('should build API path with server and path params', () => {
|
|
24
|
+
const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource']);
|
|
25
|
+
expect(result).toBe('http://example.com/path/to/resource');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('should build API path with server, path params, and query params', () => {
|
|
29
|
+
const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', { query: 'value' }]);
|
|
30
|
+
expect(result).toBe('http://example.com/path/to/resource?query=value');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should build API path with server and query params', () => {
|
|
34
|
+
const result = service.buildAPIPath('http://example.com', [{ query: 'value' }]);
|
|
35
|
+
expect(result).toBe('http://example.com?query=value');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should handle empty query params', () => {
|
|
39
|
+
const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', {}]);
|
|
40
|
+
expect(result).toBe('http://example.com/path/to/resource');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should remove empty query params', () => {
|
|
44
|
+
const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', { query: '' }]);
|
|
45
|
+
expect(result).toBe('http://example.com/path/to/resource');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should clean URL path', () => {
|
|
49
|
+
const result = service.buildAPIPath('http://example.com', ['path', '', 'to', 'resource']);
|
|
50
|
+
expect(result).toBe('http://example.com/path/to/resource');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should handle null query params', () => {
|
|
54
|
+
const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', null]);
|
|
55
|
+
expect(result).toBe('http://example.com/path/to/resource');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('should handle undefined query params', () => {
|
|
59
|
+
const result = service.buildAPIPath('http://example.com', ['path', 'to', 'resource', undefined]);
|
|
60
|
+
expect(result).toBe('http://example.com/path/to/resource');
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('should build API path with server as string array and path params', () => {
|
|
64
|
+
const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource']);
|
|
65
|
+
expect(result).toBe('http://example.com/api/v1/path/to/resource');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('should build API path with server as string array, path params, and query params', () => {
|
|
69
|
+
const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query: 'value' }]);
|
|
70
|
+
expect(result).toBe('http://example.com/api/v1/path/to/resource?query=value');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('should build API path with server as string array and query params', () => {
|
|
74
|
+
const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], [{ query: 'value' }]);
|
|
75
|
+
expect(result).toBe('http://example.com/api/v1?query=value');
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('should handle empty query params with server as string array', () => {
|
|
79
|
+
const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', {}]);
|
|
80
|
+
expect(result).toBe('http://example.com/api/v1/path/to/resource');
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('should remove empty query params with server as string array', () => {
|
|
84
|
+
const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query: '' }]);
|
|
85
|
+
expect(result).toBe('http://example.com/api/v1/path/to/resource');
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('should clean URL path with server as string array', () => {
|
|
89
|
+
const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', '', 'to', 'resource']);
|
|
90
|
+
expect(result).toBe('http://example.com/api/v1/path/to/resource');
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('should handle null query params with server as string array', () => {
|
|
94
|
+
const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', null]);
|
|
95
|
+
expect(result).toBe('http://example.com/api/v1/path/to/resource');
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('should handle undefined query params with server as string array', () => {
|
|
99
|
+
const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', undefined]);
|
|
100
|
+
expect(result).toBe('http://example.com/api/v1/path/to/resource');
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('should handle multiple query params with server as string array', () => {
|
|
104
|
+
const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query1: 'value1', query2: 'value2' }]);
|
|
105
|
+
expect(result).toBe('http://example.com/api/v1/path/to/resource?query1=value1&query2=value2');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should handle array query params with server as string array', () => {
|
|
109
|
+
const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', 'to', 'resource', { query: ['value1', 'value2'] }]);
|
|
110
|
+
expect(result).toBe('http://example.com/api/v1/path/to/resource?query=value1%2Cvalue2');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('should handle mixed path and query params with server as string array', () => {
|
|
114
|
+
const result = service.buildAPIPath(['http://example.com', 'api', 'v1'], ['path', { query: 'value' }, 'to', 'resource']);
|
|
115
|
+
expect(result).toBe('http://example.com/api/v1/path/to/resource?query=value');
|
|
116
|
+
});
|
|
117
|
+
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
|
|
3
|
+
@Injectable({
|
|
4
|
+
providedIn: 'root'
|
|
5
|
+
})
|
|
6
|
+
export class PathQueryService {
|
|
7
|
+
|
|
8
|
+
buildAPIPath(server: string|string[], params?: any[]|any) {
|
|
9
|
+
|
|
10
|
+
server = (Array.isArray(server)) ? server.join('/') : server
|
|
11
|
+
|
|
12
|
+
const pathObjects = (params) ? params.filter((path:any) => (!this.isObject(path))) : []
|
|
13
|
+
const queryObjects = (params) ? params.filter((path:any) => (this.isObject(path))) : []
|
|
14
|
+
|
|
15
|
+
const query = this.removeEmptyParams(queryObjects.reduce((r: any, c: any) => {
|
|
16
|
+
Object.entries(c).forEach(([key, value]) => {
|
|
17
|
+
r[key] = Array.isArray(value) ? value.join(',') : value
|
|
18
|
+
})
|
|
19
|
+
return r
|
|
20
|
+
}, {}))
|
|
21
|
+
|
|
22
|
+
let path = this.buildRestPath(server, pathObjects)
|
|
23
|
+
|
|
24
|
+
return(Object.keys(query).length > 0) ? path + '?' + this.buildQueryPath(query) : path
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
private buildRestPath(server: string, params: any[]): string {
|
|
29
|
+
server = (server) ? server : ''
|
|
30
|
+
server = (server.charAt(0) === '/') ? server.substring(1) : server
|
|
31
|
+
return this.cleanUrlPath(server +'/'+ params.join('/'))
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
private buildQueryPath(params: any): string {
|
|
35
|
+
|
|
36
|
+
const searchParams = new URLSearchParams()
|
|
37
|
+
|
|
38
|
+
for (const key in params) {
|
|
39
|
+
|
|
40
|
+
if (Array.isArray(params[key])) {
|
|
41
|
+
params[key].forEach((value: any) => searchParams.append(key, value));
|
|
42
|
+
} else {
|
|
43
|
+
searchParams.append(key, params[key]);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return searchParams.toString()
|
|
49
|
+
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private cleanUrlPath(str: string) {
|
|
53
|
+
return str.replace(/([^:]\/)\/+/g, "$1").replace(/\/$/,'')
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private isObject(val: any): boolean {
|
|
57
|
+
return (val === null) ? false : ( (typeof val === 'function') || (typeof val === 'object') )
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private removeEmptyParams = (obj: any): Record<string, any> =>
|
|
61
|
+
Object.fromEntries(
|
|
62
|
+
Object.entries(obj)
|
|
63
|
+
.map(([key, value]) =>
|
|
64
|
+
[key, value && typeof value === 'object' ? this.removeEmptyParams(value) : value]
|
|
65
|
+
)
|
|
66
|
+
.filter(([_, value]) => value !== undefined && value !== "")
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
}
|