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.
Files changed (198) hide show
  1. package/ARCHITECTURE.md +483 -0
  2. package/DATABASE_README.md +1176 -0
  3. package/HTTP_MANAGER_README.md +579 -0
  4. package/HTTP_SINGNALS_MANAGER_README.md +654 -0
  5. package/HTTP_STATE_MANAGER_README.md +948 -0
  6. package/INTERCEPTOR_README.md +549 -0
  7. package/LOCAL_STORAGE_README.md +1056 -0
  8. package/STORE_STATE_MANAGER_README.md +1322 -0
  9. package/UTILS_README.md +1186 -0
  10. package/WS_MANAGER_README.md +613 -0
  11. package/ng-package.json +8 -0
  12. package/package.json +1 -12
  13. package/src/lib/http-request-manager.module.ts +132 -0
  14. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +65 -0
  15. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  16. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +224 -0
  17. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +114 -0
  18. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  19. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +52 -0
  20. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  21. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  22. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +206 -0
  23. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.html +200 -0
  24. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.scss +17 -0
  25. package/src/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.ts +212 -0
  26. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  27. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  28. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  29. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  30. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  31. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  32. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  33. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  34. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  35. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  36. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  37. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  38. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  39. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  40. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  41. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  42. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  43. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  44. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  45. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +392 -0
  46. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +24 -0
  47. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +461 -0
  48. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +393 -0
  49. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  50. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +421 -0
  51. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +87 -0
  52. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/services/state-data-request.service.ts +120 -0
  53. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.css +0 -0
  54. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.html +3 -0
  55. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-ai-messaging/ws-ai-messaging.component.ts +16 -0
  56. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.css +0 -0
  57. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.html +3 -0
  58. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-chats/ws-chats.component.ts +16 -0
  59. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.css +31 -0
  60. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.html +72 -0
  61. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.scss +41 -0
  62. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.spec.ts +205 -0
  63. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-data-control/ws-data-control.component.ts +77 -0
  64. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.css +11 -0
  65. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.html +96 -0
  66. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.spec.ts +31 -0
  67. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-messaging/ws-messaging.component.ts +229 -0
  68. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.css +30 -0
  69. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.html +172 -0
  70. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.spec.ts +31 -0
  71. package/src/lib/http-request-services-demo/request-manager-ws-demo/components/ws-notifications/ws-notifications.component.ts +239 -0
  72. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.ts +31 -0
  73. package/src/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.ts +32 -0
  74. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.css +0 -0
  75. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.html +84 -0
  76. package/src/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.ts +41 -0
  77. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/index.ts +3 -0
  78. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/message-service-demo.service.ts +83 -0
  79. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/notification-service-demo.service.ts +147 -0
  80. package/src/lib/http-request-services-demo/request-manager-ws-demo/services/state-service-demo.service.ts +158 -0
  81. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.html +53 -0
  82. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  83. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/download-file/download-file.component.ts +72 -0
  84. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-download.module.ts +28 -0
  85. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.html +10 -0
  86. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  87. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/file-downloader.component.ts +100 -0
  88. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  89. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  90. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  91. package/src/lib/http-request-services-demo/request-signals-manager-demo/file-downloader/spinner/spinner.component.ts +26 -0
  92. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app-session.model.ts +30 -0
  93. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/app.model.ts +19 -0
  94. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/get-sample.model.ts +25 -0
  95. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.ts +19 -0
  96. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-details.ts +24 -0
  97. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.ts +30 -0
  98. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client.model.ts +49 -0
  99. package/src/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.ts +33 -0
  100. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.html +380 -0
  101. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.scss +24 -0
  102. package/src/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.ts +410 -0
  103. package/src/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.ts +28 -0
  104. package/src/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.ts +48 -0
  105. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.css +0 -0
  106. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.html +23 -0
  107. package/src/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.ts +36 -0
  108. package/src/lib/index.ts +3 -0
  109. package/src/lib/interceptors/credentials.interceptor.ts +16 -0
  110. package/src/lib/interceptors/index.ts +6 -0
  111. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  112. package/src/lib/interceptors/models/index.ts +2 -0
  113. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  114. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  115. package/src/lib/interceptors/request-header.interceptor.ts +53 -0
  116. package/src/lib/models/config-http-options.model.ts +42 -0
  117. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  118. package/src/lib/models/config-options.model.ts +27 -0
  119. package/src/lib/models/config-token.model.ts +9 -0
  120. package/src/lib/models/data-type.enum.ts +5 -0
  121. package/src/lib/models/database-storage.model.ts +24 -0
  122. package/src/lib/models/index.ts +12 -0
  123. package/src/lib/models/retry-options.model.ts +22 -0
  124. package/src/lib/services/database-manager-service/database.manager.service.ts +262 -0
  125. package/src/lib/services/database-manager-service/db.storage.service.ts +207 -0
  126. package/src/lib/services/database-manager-service/index.ts +4 -0
  127. package/src/lib/services/database-manager-service/models/index.ts +2 -0
  128. package/src/lib/services/database-manager-service/models/table-schema.ts +33 -0
  129. package/src/lib/services/index.ts +12 -0
  130. package/src/lib/services/local-storage-manager-service/index.ts +4 -0
  131. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  132. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +426 -0
  133. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.spec.ts +67 -0
  134. package/src/lib/services/local-storage-manager-service/local-storage-signals-manager.service.ts +345 -0
  135. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  136. package/src/lib/services/local-storage-manager-service/models/index.ts +6 -0
  137. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +35 -0
  138. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  139. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +32 -0
  140. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  141. package/src/lib/services/request-manager-services/README.md +268 -0
  142. package/src/lib/services/request-manager-services/http-manager-signals.service.ts +246 -0
  143. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +232 -0
  144. package/src/lib/services/request-manager-services/http-manager.service.ts +274 -0
  145. package/src/lib/services/request-manager-services/index.ts +8 -0
  146. package/src/lib/services/request-manager-services/request-signals.service.ts +214 -0
  147. package/src/lib/services/request-manager-services/request.service.ts +309 -0
  148. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  149. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  150. package/src/lib/services/request-manager-services/rxjs-operators/index.ts +4 -0
  151. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +35 -0
  152. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +436 -0
  153. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +1321 -0
  154. package/src/lib/services/request-manager-state-service/index.ts +3 -0
  155. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +61 -0
  156. package/src/lib/services/request-manager-state-service/models/index.ts +6 -0
  157. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +22 -0
  158. package/src/lib/services/request-manager-state-service/models/stream-type.enum.ts +13 -0
  159. package/src/lib/services/request-manager-state-service/models/ws-options.model.ts +39 -0
  160. package/src/lib/services/store-state-manager-service/index.ts +3 -0
  161. package/src/lib/services/store-state-manager-service/models/index.ts +2 -0
  162. package/src/lib/services/store-state-manager-service/models/state-storage-options.model.ts +24 -0
  163. package/src/lib/services/store-state-manager-service/store-state-manager.service.ts +88 -0
  164. package/src/lib/services/utils/app.service.spec.ts +25 -0
  165. package/src/lib/services/utils/app.service.ts +21 -0
  166. package/src/lib/services/utils/encryption/README.md +79 -0
  167. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  168. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  169. package/src/lib/services/utils/encryption/index.ts +5 -0
  170. package/src/lib/services/utils/encryption/random.ts +81 -0
  171. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +93 -0
  172. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  173. package/src/lib/services/utils/headers.service.ts +18 -0
  174. package/src/lib/services/utils/index.ts +7 -0
  175. package/src/lib/services/utils/object-merger.service.spec.ts +18 -0
  176. package/src/lib/services/utils/object-merger.service.ts +78 -0
  177. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  178. package/src/lib/services/utils/path-query.service.ts +69 -0
  179. package/src/lib/services/utils/random-color.utils.ts +83 -0
  180. package/src/lib/services/utils/utils.service.spec.ts +165 -0
  181. package/src/lib/services/utils/utils.service.ts +192 -0
  182. package/src/lib/services/ws-manager-service/index.ts +4 -0
  183. package/src/lib/services/ws-manager-service/models/channel-info.model.ts +24 -0
  184. package/src/lib/services/ws-manager-service/models/channel-message-data.model.ts +24 -0
  185. package/src/lib/services/ws-manager-service/models/channel-message.model.ts +24 -0
  186. package/src/lib/services/ws-manager-service/models/communication-type.enum.ts +5 -0
  187. package/src/lib/services/ws-manager-service/models/index.ts +5 -0
  188. package/src/lib/services/ws-manager-service/models/ws-user.model.ts +38 -0
  189. package/src/lib/services/ws-manager-service/services/index.ts +3 -0
  190. package/src/lib/services/ws-manager-service/services/websocket.service.ts +392 -0
  191. package/src/public-api.ts +14 -0
  192. package/tsconfig.lib.json +32 -0
  193. package/tsconfig.lib.prod.json +10 -0
  194. package/tsconfig.spec.json +14 -0
  195. package/fesm2022/http-request-manager.mjs +0 -7634
  196. package/fesm2022/http-request-manager.mjs.map +0 -1
  197. package/http-request-manager-18.7.19.tgz +0 -0
  198. package/types/http-request-manager.d.ts +0 -2278
@@ -0,0 +1,65 @@
1
+ import { inject, Injectable } from '@angular/core'
2
+ import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpErrorResponse } from '@angular/common/http'
3
+ import { Observable, catchError, throwError } from 'rxjs'
4
+
5
+ import { ToastMessageDisplayService, ToastDisplay, ToastColors } from 'toast-message-display'
6
+
7
+ @Injectable()
8
+ export class RequestErrorInterceptor implements HttpInterceptor {
9
+
10
+ toastMessage = inject(ToastMessageDisplayService)
11
+
12
+ intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
13
+
14
+ return next.handle(req).pipe(
15
+
16
+ catchError((error: HttpErrorResponse) => {
17
+
18
+ const displayError = ToastDisplay.adapt({
19
+ message: 'This is a toast message. This is an Error!!',
20
+ action: 'OK',
21
+ color: ToastColors.SUCCESS,
22
+ icon: 'info',
23
+ duration: 5 * 1000, //5 seconds
24
+ })
25
+
26
+ if (error.status >= 400 && error.status < 500) {
27
+
28
+ displayError.color = ToastColors.WARN
29
+ displayError.message = error.error || `${error.status}: ${error.statusText}`
30
+
31
+ console.error('Client Error:', {
32
+ status: error.status,
33
+ message: error.message,
34
+ error: error.error,
35
+ text: error.statusText,
36
+ })
37
+
38
+ this.toastMessage.toastMessage(displayError)
39
+
40
+ } else if (error.status >= 500) {
41
+
42
+ displayError.color = ToastColors.ERROR
43
+ displayError.message = error.error || `${error.status}: ${error.statusText}`
44
+
45
+ console.error('Server Error:', {
46
+ status: error.status,
47
+ message: error.message,
48
+ error: error.error,
49
+ text: error.statusText,
50
+ })
51
+
52
+ this.toastMessage.toastMessage(displayError)
53
+
54
+ }
55
+
56
+ return throwError(() => error)
57
+
58
+ })
59
+
60
+ )
61
+ }
62
+
63
+ }
64
+
65
+
@@ -0,0 +1,53 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
3
+ import { Observable, Subscription } from 'rxjs';
4
+ import { LangChangeEvent, TranslateService } from '@ngx-translate/core';
5
+
6
+ @Injectable()
7
+ export class RequestHeadersInterceptor implements HttpInterceptor {
8
+
9
+ subscriptions = new Subscription()
10
+ language = 'en-CA'
11
+
12
+ get currentDate() {
13
+
14
+ const date = new Date()
15
+
16
+ const year = date.getFullYear()
17
+ const month = String(date.getMonth() + 1).padStart(2, '0')
18
+ const day = String(date.getDate()).padStart(2, '0')
19
+
20
+ return `${year}-${month}-${day}`
21
+
22
+ }
23
+
24
+ constructor(
25
+ private translate: TranslateService
26
+ ) {
27
+ this.subscriptions.add(
28
+ this.translate.onLangChange
29
+ .subscribe((params: LangChangeEvent) => {
30
+ this.language = `${params.lang}-CA`
31
+ })
32
+ )
33
+ }
34
+
35
+ intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
36
+
37
+ request = request.clone({
38
+ setHeaders: {
39
+ 'Content-Type': 'application/json',
40
+ 'Accept-Language': this.language || 'en-CA',
41
+ 'Current-Date': this.currentDate
42
+ }
43
+ })
44
+
45
+ return next.handle(request)
46
+
47
+ }
48
+
49
+ ngOnDestroy() {
50
+ this.subscriptions.unsubscribe()
51
+ }
52
+ }
53
+
@@ -0,0 +1,42 @@
1
+ import { RetryOptions } from "./retry-options.model"
2
+
3
+ export interface ConfigHTTPOptionsInterface {
4
+ server: string
5
+ path?: any[]
6
+ headers?: any
7
+ polling?: number // seconds (undefined | 0 = none)
8
+ retry?: RetryOptions
9
+ stream?: boolean
10
+ displayError?: boolean
11
+ }
12
+
13
+ export class ConfigHTTPOptions implements ConfigHTTPOptionsInterface {
14
+
15
+ constructor(
16
+ public server = '',
17
+ public path?: any[],
18
+ public headers?: any,
19
+ public polling?: number,
20
+ public retry?: RetryOptions,
21
+ public stream?: boolean,
22
+ public displayError?: boolean,
23
+ ) {}
24
+
25
+ static adapt(item?: any): ConfigHTTPOptions {
26
+
27
+ const server = Array.isArray(item?.server) ? item.server.join('/') : item?.server || '';
28
+ const retryOptions = item?.retry ? RetryOptions.adapt(item.retry) : RetryOptions.adapt();
29
+
30
+ return new ConfigHTTPOptions(
31
+ server,
32
+ (item?.path) ? item.path : [],
33
+ (item?.headers) ? item.headers : {},
34
+ item?.polling ? Math.floor(item.polling) : 0,
35
+ retryOptions,
36
+ (item?.stream) ? item.stream : false,
37
+ (item?.displayError) ? item.displayError : false,
38
+ )
39
+
40
+ }
41
+
42
+ }
@@ -0,0 +1,27 @@
1
+ import { SettingOptions } from "../services"
2
+
3
+ export interface LocalStorageOptionsInterface {
4
+ storageName?: string
5
+ storageSettingsName?: string
6
+ options?: SettingOptions,
7
+ }
8
+
9
+ export class LocalStorageOptions implements LocalStorageOptionsInterface {
10
+
11
+ constructor(
12
+ public storageName?: string,
13
+ public storageSettingsName?: string,
14
+ public options?: SettingOptions,
15
+ ) {}
16
+
17
+ static adapt(item?: any): LocalStorageOptions {
18
+
19
+ return new LocalStorageOptions(
20
+ (item?.storageName) ? item.storageName : 'storage',
21
+ (item?.storageSettingsName) ? item.storageSettingsName : 'global-storage',
22
+ (item?.options) ? SettingOptions.adapt(item.options) : SettingOptions.adapt(),
23
+ )
24
+
25
+ }
26
+
27
+ }
@@ -0,0 +1,27 @@
1
+ import { ConfigHTTPOptions } from "./config-http-options.model";
2
+ import { LocalStorageOptions } from "./config-local-storage-options.model";
3
+
4
+ export interface ConfigOptionsInterface {
5
+ httpRequestOptions?: ConfigHTTPOptions
6
+ LocalStorageOptions?: LocalStorageOptions
7
+ // DatabaseOptions: any
8
+ }
9
+
10
+ export class ConfigOptions implements ConfigOptionsInterface {
11
+
12
+ constructor(
13
+ public httpRequestOptions?: ConfigHTTPOptions,
14
+ public LocalStorageOptions?: LocalStorageOptions,
15
+ // public DatabaseOptions?: any,
16
+ ) {}
17
+
18
+ static adapt(item?: any): ConfigOptions {
19
+ return new ConfigOptions(
20
+ (item?.httpRequestOptions) ? ConfigHTTPOptions.adapt(item.httpRequestOptions) : undefined,
21
+ (item?.LocalStorageOptions) ? LocalStorageOptions.adapt(item.LocalStorageOptions) : undefined,
22
+ // item?.DatabaseOptions,
23
+ )
24
+
25
+ }
26
+
27
+ }
@@ -0,0 +1,9 @@
1
+ import { InjectionToken } from "@angular/core";
2
+ import { ConfigOptions } from "./config-options.model";
3
+
4
+ /**
5
+ * An injection token that provides the configuration settings for the application.
6
+ * This token can be used to inject the `ConfigSettings` instance into components or services
7
+ * that require access to the application configuration.
8
+ */
9
+ export const CONFIG_SETTINGS_TOKEN = new InjectionToken<ConfigOptions>('http.config');
@@ -0,0 +1,5 @@
1
+ export enum DataType {
2
+ ANY = 0,
3
+ ARRAY,
4
+ OBJECT
5
+ }
@@ -0,0 +1,24 @@
1
+ export interface DatabaseStorageInterface {
2
+ table: string
3
+ expiresIn: string
4
+ }
5
+
6
+ export class DatabaseStorage implements DatabaseStorageInterface {
7
+
8
+ constructor(
9
+ public table = '',
10
+ public expiresIn: '',
11
+ ) {}
12
+
13
+ static adapt(item?: any): any {
14
+
15
+ if(!item?.table) return
16
+
17
+ return new DatabaseStorage(
18
+ item?.table,
19
+ item?.expiresIn,
20
+ )
21
+
22
+ }
23
+
24
+ }
@@ -0,0 +1,12 @@
1
+ export * from './database-storage.model'
2
+ export * from './retry-options.model'
3
+
4
+ export * from './data-type.enum'
5
+
6
+ export * from './config-token.model'
7
+ export * from './config-http-options.model'
8
+ export * from './config-local-storage-options.model'
9
+ export * from './config-options.model'
10
+
11
+ export * from '../http-request-services-demo/request-manager-ws-demo/models/user-data.model'
12
+
@@ -0,0 +1,22 @@
1
+ export interface RetryOptionsInterface {
2
+ times?: number // total request to be made including initial request
3
+ delay?: number // seconds (<= 3 default 3 seconds)
4
+ }
5
+
6
+ export class RetryOptions implements RetryOptionsInterface {
7
+
8
+ constructor(
9
+ public times = 0,
10
+ public delay = 3,
11
+ ) {}
12
+
13
+ static adapt(item?: any): RetryOptions {
14
+
15
+ return new RetryOptions(
16
+ item?.times,
17
+ item?.delay
18
+ )
19
+
20
+ }
21
+
22
+ }
@@ -0,0 +1,262 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { DbService } from './db.storage.service';
3
+
4
+ import { TableSchemaDef } from './models/table-schema';
5
+ import { EMPTY, from, Observable } from 'rxjs';
6
+ import { map, switchMap } from 'rxjs/operators';
7
+
8
+ @Injectable({
9
+ providedIn: 'root'
10
+ })
11
+ export class DatabaseManagerService extends DbService {
12
+
13
+ constructor() {
14
+ super()
15
+ }
16
+
17
+ getDatabaseTables() {
18
+ return from(this.DBOpened()).pipe(
19
+ map(() => this.tables.map((item: any) => item.name))
20
+ )
21
+ }
22
+
23
+ databaseExists(): Observable<boolean> {
24
+ return from(this.hasDatabase());
25
+ }
26
+
27
+ hasDatabaseTable(table: string): Observable<boolean> {
28
+ const tableName = this.cleanTableName(table);
29
+ return from(this.DBOpened()).pipe(
30
+ map(() => {
31
+ return this.tableExists(tableName)
32
+ })
33
+ )
34
+ }
35
+
36
+ getDatabaseTable(table: string): Observable<any> {
37
+ const tableName = this.cleanTableName(table);
38
+ return from(this.DBOpened()).pipe(
39
+ map(() => {
40
+ const found = this.getTable(tableName);
41
+ if(!found) {
42
+ console.warn('No Such Table:', tableName)
43
+ return null;
44
+ }
45
+ return found;
46
+ })
47
+ )
48
+ }
49
+
50
+ getDatabaseTableSchema(table: string): Observable<string[]> {
51
+ const tableName = this.cleanTableName(table);
52
+ return this.getDatabaseTable(tableName).pipe(
53
+ map((dbTable: any) => {
54
+ if(!dbTable) return []
55
+ const cols = dbTable.schema.indexes.map((col: any) => col.name)
56
+ const pri = dbTable.schema.primKey.name
57
+ return [pri, ...cols]
58
+ })
59
+ )
60
+ }
61
+
62
+ createDatabaseTable(tableDef: TableSchemaDef) {
63
+ return from(this.createTable(tableDef.table, tableDef.schema)).pipe(
64
+ switchMap(() => this.DBOpened())
65
+ )
66
+ }
67
+
68
+ updateDatabaseTableSchema(tableDef: TableSchemaDef) {
69
+ return from(this.createTable(tableDef.table, tableDef.schema)).pipe(
70
+ switchMap(() => this.getDatabaseTable(tableDef.table))
71
+ )
72
+ }
73
+
74
+ // CRUD
75
+ findTableRecords(table: string, column: string, value: any) {
76
+ const tableName = this.cleanTableName(table);
77
+ return this.getDatabaseTable(tableName).pipe(
78
+ switchMap((tableData: any) => {
79
+ if (!tableData) {
80
+ console.warn(`findTableRecords: Table '${tableName}' not found`);
81
+ return from([]);
82
+ }
83
+ return from(tableData.where(column).equals(value).toArray());
84
+ })
85
+ );
86
+ }
87
+
88
+ findTableRecord(table: string, column: string, value: any) {
89
+ const tableName = this.cleanTableName(table);
90
+ return this.findTableRecords(tableName, column, value).pipe(
91
+ map((records: any) => records && records.length > 0 ? records[0] : null)
92
+ );
93
+ }
94
+
95
+ getTableRecords(table: string) {
96
+ const tableName = this.cleanTableName(table);
97
+ return this.getDatabaseTable(tableName).pipe(
98
+ switchMap((tableData: any) => {
99
+ if (!tableData) {
100
+ console.warn(`getTableRecords: Table '${tableName}' not found`);
101
+ return from([]);
102
+ }
103
+ return from(tableData.toArray());
104
+ })
105
+ );
106
+ }
107
+
108
+ getTableRecord(table: string, id: number) {
109
+ const tableName = this.cleanTableName(table);
110
+ return this.getDatabaseTable(tableName).pipe(
111
+ switchMap((tableData: any) => {
112
+ if (!tableData) {
113
+ console.warn(`getTableRecord: Table '${tableName}' not found`);
114
+ return from([null]);
115
+ }
116
+ return from(tableData.get(id)).pipe(
117
+ map((record: any) => record || null)
118
+ );
119
+ })
120
+ );
121
+ }
122
+
123
+ createTableRecord(table: string, record: any) {
124
+ const tableName = this.cleanTableName(table);
125
+ return this.createTableRecords(tableName, [record])
126
+ .pipe(
127
+ map((item: any) => item ? item[0] : null))
128
+ }
129
+
130
+ createTableRecords(table: string, records: any[]) {
131
+ const tableName = this.cleanTableName(table);
132
+ return from(this.DBOpened()).pipe(
133
+ switchMap(() => {
134
+ if (!this.tables.some(t => t.name === tableName)) {
135
+ console.error(`createTableRecords: Table '${tableName}' does not exist in DB version ${this.verno}. Available:`, this.tables.map(t => t.name));
136
+ return EMPTY;
137
+ }
138
+
139
+ const tableInstance = this.table(tableName);
140
+
141
+ // Extract schema fields directly from the table instance
142
+ const schema = tableInstance.schema;
143
+ const validFields = [
144
+ schema.primKey.name,
145
+ ...schema.indexes.map(idx => idx.name)
146
+ ];
147
+
148
+ const insertRecords = records.map((record: any) => {
149
+ const objectFromSchema: { [key: string]: any } = {};
150
+ validFields.forEach((field: string) => {
151
+ if (field) {
152
+ objectFromSchema[field] = (record as any)[field] ?? null;
153
+ }
154
+ });
155
+ return objectFromSchema;
156
+ });
157
+
158
+ console.log(`createTableRecords: Bulk putting ${insertRecords.length} records into ${tableName}`);
159
+
160
+ return from(tableInstance.bulkPut(insertRecords)).pipe(
161
+ map(() => insertRecords)
162
+ );
163
+ })
164
+ );
165
+ }
166
+
167
+ updateTableRecord(table: string, record: any) {
168
+ const tableName = this.cleanTableName(table);
169
+ return this.updateTableRecords(tableName, [record])
170
+ .pipe(
171
+ map(item => item.length > 0 ? item[0] : null)
172
+ )
173
+ }
174
+
175
+ updateTableRecords(table: string, records: any[]) {
176
+
177
+ const tableName = this.cleanTableName(table);
178
+
179
+ return this.getDatabaseTable(tableName).pipe(
180
+
181
+ switchMap((tableData: any) => {
182
+
183
+ return this.getDatabaseTableSchema(tableName).pipe(
184
+
185
+ switchMap((schema: string[]) => {
186
+
187
+ const insertRecords = records.map((record: any) => {
188
+
189
+ const objectFromSchema: { [key: string]: any } = {}
190
+
191
+ schema.forEach((field: string) => {
192
+ const data = (record as any)[field] ?? null
193
+ objectFromSchema[field] = data
194
+ })
195
+
196
+ return objectFromSchema
197
+
198
+ })
199
+
200
+ return from(tableData.bulkPut(insertRecords)).pipe(
201
+ map(() => insertRecords)
202
+ );
203
+
204
+ })
205
+
206
+ )
207
+
208
+ })
209
+
210
+ )
211
+
212
+ }
213
+
214
+ deleteTableRecord<T>(table: string, id: number) {
215
+ const tableName = this.cleanTableName(table);
216
+ return this.deleteTableRecords(tableName, [id])
217
+ .pipe(
218
+ map(item => item.length > 0 ? item[0] : null)
219
+ )
220
+ }
221
+
222
+ deleteTableRecords(table: string, ids: number[]) {
223
+ const tableName = this.cleanTableName(table);
224
+ return this.getDatabaseTable(tableName).pipe(
225
+
226
+ switchMap((tableData: any) => {
227
+
228
+ return this.getDatabaseTableSchema(tableName).pipe(
229
+
230
+ switchMap((schema: string[]) => {
231
+
232
+ console.log(`deleteTableRecords: Starting delete of ${ids.length} records from ${table}. IDs:`, ids);
233
+
234
+ return from(tableData.bulkDelete(ids)).pipe(
235
+ map(() => ids)
236
+ );
237
+
238
+ })
239
+
240
+ )
241
+
242
+ })
243
+
244
+ )
245
+
246
+ }
247
+
248
+ clearTable(table: string) {
249
+ const tableName = this.cleanTableName(table);
250
+ return this.getDatabaseTable(tableName).pipe(
251
+ switchMap((tableData: any) => {
252
+ if (!tableData) {
253
+ console.warn(`clearTable: Table '${tableName}' not found`);
254
+ return from([]);
255
+ }
256
+ console.log(`clearTable: Clearing all records from ${tableName}`);
257
+ return from(tableData.clear());
258
+ })
259
+ );
260
+ }
261
+
262
+ }