http-request-manager 15.0.24 → 15.0.26

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 (232) hide show
  1. package/ng-package.json +8 -0
  2. package/package.json +1 -14
  3. package/src/lib/http-request-manager.module.ts +101 -0
  4. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.html +3 -0
  5. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.scss +0 -0
  6. package/src/lib/http-request-services-demo/database-data-demo/database-data-demo.component.ts +105 -0
  7. package/src/lib/http-request-services-demo/http-request-services-demo.component.html +64 -0
  8. package/src/lib/http-request-services-demo/http-request-services-demo.component.scss +6 -0
  9. package/src/lib/http-request-services-demo/http-request-services-demo.component.ts +34 -0
  10. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.html +195 -0
  11. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.scss +17 -0
  12. package/src/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.ts +205 -0
  13. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.html +59 -0
  14. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.scss +60 -0
  15. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.ts +71 -0
  16. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.ts +28 -0
  17. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.html +10 -0
  18. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.scss +29 -0
  19. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.ts +99 -0
  20. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.ts +22 -0
  21. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.html +8 -0
  22. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.scss +19 -0
  23. package/src/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.ts +25 -0
  24. package/src/lib/http-request-services-demo/request-manager-demo/models/app-session.model.ts +30 -0
  25. package/src/lib/http-request-services-demo/request-manager-demo/models/app.model.ts +19 -0
  26. package/src/lib/http-request-services-demo/request-manager-demo/models/get-sample.model.ts +25 -0
  27. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.ts +19 -0
  28. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-details.ts +24 -0
  29. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.ts +30 -0
  30. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-client.model.ts +49 -0
  31. package/src/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.ts +33 -0
  32. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.html +336 -0
  33. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.scss +24 -0
  34. package/src/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.ts +403 -0
  35. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.html +328 -0
  36. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.scss +24 -0
  37. package/src/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.ts +347 -0
  38. package/src/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.ts +88 -0
  39. package/src/lib/index.ts +3 -0
  40. package/src/lib/interceptors/credentials.interceptor.ts +18 -0
  41. package/{lib/interceptors/index.d.ts → src/lib/interceptors/index.ts} +2 -0
  42. package/src/lib/interceptors/models/error-settings.model.ts +22 -0
  43. package/src/lib/interceptors/proxy-debugger.interceptor.ts +46 -0
  44. package/src/lib/interceptors/request-error.interceptor.ts +65 -0
  45. package/src/lib/interceptors/request-header.interceptor.ts +58 -0
  46. package/src/lib/models/config-http-options.model.ts +42 -0
  47. package/src/lib/models/config-local-storage-options.model.ts +27 -0
  48. package/src/lib/models/config-options.model.ts +27 -0
  49. package/{lib/models/config-token.model.d.ts → src/lib/models/config-token.model.ts} +2 -1
  50. package/src/lib/models/data-type.enum.ts +5 -0
  51. package/src/lib/models/database-storage.model.ts +24 -0
  52. package/src/lib/models/index.ts +9 -0
  53. package/src/lib/models/retry-options.model.ts +22 -0
  54. package/src/lib/services/database-manager-services/database.manager.service.ts +193 -0
  55. package/src/lib/services/database-manager-services/db.storage.service.ts +191 -0
  56. package/{lib/services/database-manager-services/index.d.ts → src/lib/services/database-manager-services/index.ts} +1 -0
  57. package/src/lib/services/database-manager-services/models/table-schema.ts +35 -0
  58. package/{lib/services/index.d.ts → src/lib/services/index.ts} +4 -0
  59. package/src/lib/services/local-storage-manager-service/index.ts +2 -0
  60. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.spec.ts +71 -0
  61. package/src/lib/services/local-storage-manager-service/local-storage-manager.service.ts +421 -0
  62. package/src/lib/services/local-storage-manager-service/models/global-store-options.model.ts +30 -0
  63. package/{lib/services/local-storage-manager-service/models/index.d.ts → src/lib/services/local-storage-manager-service/models/index.ts} +2 -1
  64. package/src/lib/services/local-storage-manager-service/models/setting-options.model.ts +30 -0
  65. package/src/lib/services/local-storage-manager-service/models/storage-data.model.ts +24 -0
  66. package/src/lib/services/local-storage-manager-service/models/storage-option.model.ts +29 -0
  67. package/src/lib/services/local-storage-manager-service/models/storage-type.enum.ts +5 -0
  68. package/src/lib/services/request-manager-services/README.md +268 -0
  69. package/src/lib/services/request-manager-services/http-manager.service.spec.ts +230 -0
  70. package/src/lib/services/request-manager-services/http-manager.service.ts +274 -0
  71. package/{lib/services/request-manager-services/index.d.ts → src/lib/services/request-manager-services/index.ts} +2 -0
  72. package/src/lib/services/request-manager-services/request.service.ts +261 -0
  73. package/src/lib/services/request-manager-services/rxjs-operators/countdown.ts +17 -0
  74. package/src/lib/services/request-manager-services/rxjs-operators/delay-retry.ts +16 -0
  75. package/src/lib/services/request-manager-services/rxjs-operators/request-polling.ts +21 -0
  76. package/src/lib/services/request-manager-services/rxjs-operators/request-streaming.ts +32 -0
  77. package/src/lib/services/request-manager-state-service/http-manager-state.store.ts +402 -0
  78. package/{lib/services/request-manager-state-service/index.d.ts → src/lib/services/request-manager-state-service/index.ts} +1 -0
  79. package/src/lib/services/request-manager-state-service/models/api-request.model.ts +50 -0
  80. package/{lib/services/request-manager-state-service/models/index.d.ts → src/lib/services/request-manager-state-service/models/index.ts} +1 -0
  81. package/src/lib/services/request-manager-state-service/models/request-options.model.ts +22 -0
  82. package/src/lib/services/utils/app.service.spec.ts +25 -0
  83. package/src/lib/services/utils/app.service.ts +21 -0
  84. package/src/lib/services/utils/encryption/README.md +79 -0
  85. package/src/lib/services/utils/encryption/asymmetrical-encryption.service.ts +282 -0
  86. package/src/lib/services/utils/encryption/encryption-test.service.ts +39 -0
  87. package/{lib/services/utils/encryption/index.d.ts → src/lib/services/utils/encryption/index.ts} +2 -0
  88. package/src/lib/services/utils/encryption/random.ts +69 -0
  89. package/src/lib/services/utils/encryption/symmetrical-encryption.service.ts +93 -0
  90. package/src/lib/services/utils/headers.service.spec.ts +80 -0
  91. package/src/lib/services/utils/headers.service.ts +18 -0
  92. package/{lib/services/utils/index.d.ts → src/lib/services/utils/index.ts} +2 -0
  93. package/src/lib/services/utils/object-merger.service.spec.ts +16 -0
  94. package/src/lib/services/utils/object-merger.service.ts +60 -0
  95. package/src/lib/services/utils/path-query.service.spec.ts +117 -0
  96. package/src/lib/services/utils/path-query.service.ts +69 -0
  97. package/src/lib/services/utils/utils.service.spec.ts +164 -0
  98. package/src/lib/services/utils/utils.service.ts +192 -0
  99. package/{public-api.d.ts → src/public-api.ts} +7 -0
  100. package/tsconfig.lib.json +32 -0
  101. package/tsconfig.lib.prod.json +10 -0
  102. package/tsconfig.spec.json +14 -0
  103. package/esm2022/http-request-manager.mjs +0 -5
  104. package/esm2022/lib/http-request-manager.module.mjs +0 -146
  105. package/esm2022/lib/http-request-services-demo/database-data-demo/database-data-demo.component.mjs +0 -71
  106. package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +0 -41
  107. package/esm2022/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.mjs +0 -173
  108. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.mjs +0 -80
  109. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.mjs +0 -42
  110. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.mjs +0 -88
  111. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.mjs +0 -11
  112. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.mjs +0 -29
  113. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.mjs +0 -9
  114. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.mjs +0 -12
  115. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.mjs +0 -14
  116. package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +0 -315
  117. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.mjs +0 -270
  118. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.mjs +0 -67
  119. package/esm2022/lib/index.mjs +0 -4
  120. package/esm2022/lib/interceptors/credentials.interceptor.mjs +0 -14
  121. package/esm2022/lib/interceptors/index.mjs +0 -5
  122. package/esm2022/lib/interceptors/models/error-settings.model.mjs +0 -10
  123. package/esm2022/lib/interceptors/proxy-debugger.interceptor.mjs +0 -47
  124. package/esm2022/lib/interceptors/request-error.interceptor.mjs +0 -49
  125. package/esm2022/lib/interceptors/request-header.interceptor.mjs +0 -41
  126. package/esm2022/lib/models/config-http-options.model.mjs +0 -18
  127. package/esm2022/lib/models/config-local-storage-options.model.mjs +0 -12
  128. package/esm2022/lib/models/config-options.model.mjs +0 -12
  129. package/esm2022/lib/models/config-token.model.mjs +0 -8
  130. package/esm2022/lib/models/data-type.enum.mjs +0 -7
  131. package/esm2022/lib/models/database-storage.model.mjs +0 -10
  132. package/esm2022/lib/models/index.mjs +0 -7
  133. package/esm2022/lib/models/retry-options.model.mjs +0 -10
  134. package/esm2022/lib/services/database-manager-services/database.manager.service.mjs +0 -119
  135. package/esm2022/lib/services/database-manager-services/db.storage.service.mjs +0 -143
  136. package/esm2022/lib/services/database-manager-services/index.mjs +0 -4
  137. package/esm2022/lib/services/database-manager-services/models/table-schema.mjs +0 -20
  138. package/esm2022/lib/services/index.mjs +0 -6
  139. package/esm2022/lib/services/local-storage-manager-service/index.mjs +0 -3
  140. package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +0 -302
  141. package/esm2022/lib/services/local-storage-manager-service/models/global-store-options.model.mjs +0 -13
  142. package/esm2022/lib/services/local-storage-manager-service/models/index.mjs +0 -6
  143. package/esm2022/lib/services/local-storage-manager-service/models/setting-options.model.mjs +0 -13
  144. package/esm2022/lib/services/local-storage-manager-service/models/storage-data.model.mjs +0 -10
  145. package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +0 -12
  146. package/esm2022/lib/services/local-storage-manager-service/models/storage-type.enum.mjs +0 -7
  147. package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +0 -207
  148. package/esm2022/lib/services/request-manager-services/index.mjs +0 -5
  149. package/esm2022/lib/services/request-manager-services/request.service.mjs +0 -189
  150. package/esm2022/lib/services/request-manager-services/rxjs-operators/countdown.mjs +0 -9
  151. package/esm2022/lib/services/request-manager-services/rxjs-operators/delay-retry.mjs +0 -10
  152. package/esm2022/lib/services/request-manager-services/rxjs-operators/index.mjs +0 -5
  153. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-polling.mjs +0 -14
  154. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +0 -19
  155. package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +0 -267
  156. package/esm2022/lib/services/request-manager-state-service/index.mjs +0 -3
  157. package/esm2022/lib/services/request-manager-state-service/models/api-request.model.mjs +0 -20
  158. package/esm2022/lib/services/request-manager-state-service/models/index.mjs +0 -3
  159. package/esm2022/lib/services/request-manager-state-service/models/request-options.model.mjs +0 -10
  160. package/esm2022/lib/services/utils/app.service.mjs +0 -26
  161. package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +0 -186
  162. package/esm2022/lib/services/utils/encryption/encryption-test.service.mjs +0 -35
  163. package/esm2022/lib/services/utils/encryption/index.mjs +0 -4
  164. package/esm2022/lib/services/utils/encryption/random.mjs +0 -52
  165. package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +0 -77
  166. package/esm2022/lib/services/utils/headers.service.mjs +0 -21
  167. package/esm2022/lib/services/utils/index.mjs +0 -6
  168. package/esm2022/lib/services/utils/object-merger.service.mjs +0 -50
  169. package/esm2022/lib/services/utils/path-query.service.mjs +0 -54
  170. package/esm2022/lib/services/utils/utils.service.mjs +0 -155
  171. package/esm2022/public-api.mjs +0 -11
  172. package/fesm2022/http-request-manager.mjs +0 -3444
  173. package/fesm2022/http-request-manager.mjs.map +0 -1
  174. package/http-request-manager-15.0.24.tgz +0 -0
  175. package/index.d.ts +0 -5
  176. package/lib/http-request-manager.module.d.ts +0 -33
  177. package/lib/http-request-services-demo/database-data-demo/database-data-demo.component.d.ts +0 -19
  178. package/lib/http-request-services-demo/http-request-services-demo.component.d.ts +0 -24
  179. package/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.d.ts +0 -56
  180. package/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.d.ts +0 -26
  181. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.d.ts +0 -13
  182. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.d.ts +0 -27
  183. package/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.d.ts +0 -12
  184. package/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.d.ts +0 -16
  185. package/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.d.ts +0 -8
  186. package/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.d.ts +0 -14
  187. package/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.d.ts +0 -14
  188. package/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.d.ts +0 -107
  189. package/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.d.ts +0 -122
  190. package/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.d.ts +0 -15
  191. package/lib/index.d.ts +0 -3
  192. package/lib/interceptors/credentials.interceptor.d.ts +0 -8
  193. package/lib/interceptors/models/error-settings.model.d.ts +0 -10
  194. package/lib/interceptors/proxy-debugger.interceptor.d.ts +0 -12
  195. package/lib/interceptors/request-error.interceptor.d.ts +0 -10
  196. package/lib/interceptors/request-header.interceptor.d.ts +0 -15
  197. package/lib/models/config-http-options.model.d.ts +0 -21
  198. package/lib/models/config-local-storage-options.model.d.ts +0 -13
  199. package/lib/models/config-options.model.d.ts +0 -12
  200. package/lib/models/data-type.enum.d.ts +0 -5
  201. package/lib/models/database-storage.model.d.ts +0 -10
  202. package/lib/models/index.d.ts +0 -6
  203. package/lib/models/retry-options.model.d.ts +0 -10
  204. package/lib/services/database-manager-services/database.manager.service.d.ts +0 -31
  205. package/lib/services/database-manager-services/db.storage.service.d.ts +0 -26
  206. package/lib/services/database-manager-services/models/table-schema.d.ts +0 -11
  207. package/lib/services/local-storage-manager-service/index.d.ts +0 -2
  208. package/lib/services/local-storage-manager-service/local-storage-manager.service.d.ts +0 -86
  209. package/lib/services/local-storage-manager-service/models/global-store-options.model.d.ts +0 -15
  210. package/lib/services/local-storage-manager-service/models/setting-options.model.d.ts +0 -15
  211. package/lib/services/local-storage-manager-service/models/storage-data.model.d.ts +0 -10
  212. package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +0 -13
  213. package/lib/services/local-storage-manager-service/models/storage-type.enum.d.ts +0 -5
  214. package/lib/services/request-manager-services/http-manager.service.d.ts +0 -41
  215. package/lib/services/request-manager-services/request.service.d.ts +0 -27
  216. package/lib/services/request-manager-services/rxjs-operators/countdown.d.ts +0 -2
  217. package/lib/services/request-manager-services/rxjs-operators/delay-retry.d.ts +0 -2
  218. package/lib/services/request-manager-services/rxjs-operators/request-polling.d.ts +0 -7
  219. package/lib/services/request-manager-services/rxjs-operators/request-streaming.d.ts +0 -2
  220. package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +0 -51
  221. package/lib/services/request-manager-state-service/models/api-request.model.d.ts +0 -27
  222. package/lib/services/request-manager-state-service/models/request-options.model.d.ts +0 -10
  223. package/lib/services/utils/app.service.d.ts +0 -8
  224. package/lib/services/utils/encryption/asymmetrical-encryption.service.d.ts +0 -17
  225. package/lib/services/utils/encryption/encryption-test.service.d.ts +0 -10
  226. package/lib/services/utils/encryption/random.d.ts +0 -7
  227. package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +0 -14
  228. package/lib/services/utils/headers.service.d.ts +0 -10
  229. package/lib/services/utils/object-merger.service.d.ts +0 -12
  230. package/lib/services/utils/path-query.service.d.ts +0 -11
  231. package/lib/services/utils/utils.service.d.ts +0 -24
  232. /package/{lib/services/request-manager-services/rxjs-operators/index.d.ts → src/lib/services/request-manager-services/rxjs-operators/index.ts} +0 -0
@@ -0,0 +1,402 @@
1
+ import { inject, Inject, Injectable, InjectionToken } from '@angular/core';
2
+ import { ComponentStore } from '@ngrx/component-store';
3
+
4
+ import { BehaviorSubject, of } from 'rxjs';
5
+ import { tap, switchMap, concatMap, scan, delay } from 'rxjs/operators';
6
+ import { DatabaseStorage } from '../../models/database-storage.model';
7
+ import { HTTPManagerService, DataType } from '../request-manager-services';
8
+ import { ApiRequest, RequestOptions } from './models';
9
+
10
+
11
+ const API_OPTS = new InjectionToken<ApiRequest>('API_OPTS');
12
+
13
+ export interface APIStateManagerData<T> {
14
+ data: T[]
15
+ dataObject: T | null
16
+ }
17
+
18
+ const defaultState: APIStateManagerData<any> = {
19
+ data: [],
20
+ dataObject: null,
21
+ };
22
+
23
+ @Injectable()
24
+ export class HTTPManagerStateService<T extends { id: number }> extends ComponentStore<APIStateManagerData<T>> {
25
+
26
+ httpManagerService = inject(HTTPManagerService)
27
+
28
+ error$ = this.httpManagerService.error$
29
+ isPending$ = this.httpManagerService.isPending$.pipe(delay(1))
30
+
31
+ // PAGINATION
32
+ private page = new BehaviorSubject<number>(0)
33
+ page$ = this.page.asObservable()
34
+
35
+ private totalPages = new BehaviorSubject<number>(0)
36
+ totalPages$ = this.totalPages.asObservable()
37
+
38
+ private percentage = new BehaviorSubject<number>(0)
39
+ percentage$ = this.percentage.asObservable()
40
+ // ----------
41
+
42
+ private hasDatabase = false
43
+
44
+ streamedResponse = []
45
+
46
+ constructor(
47
+ @Inject(API_OPTS) private apiOptions = ApiRequest.adapt(),
48
+ @Inject("dataType") private dataType: DataType | undefined,
49
+ @Inject("database") private database?: DatabaseStorage | undefined
50
+ ) {
51
+ super(defaultState);
52
+ this.setApiRequestOptions(apiOptions, dataType, database)
53
+ }
54
+
55
+ setApiRequestOptions(apiOptions?: ApiRequest, dataType?: DataType, database?: DatabaseStorage) {
56
+
57
+ this.apiOptions = ApiRequest.adapt(apiOptions)
58
+ this.dataType = (dataType) ? dataType : DataType.ARRAY
59
+
60
+ this.hasDatabase = this.database?.table === "" ? false : true
61
+ this.database = (this.hasDatabase) ? DatabaseStorage.adapt(database) : undefined
62
+
63
+ }
64
+
65
+ get ApiRequestOptions() {
66
+ return this.apiOptions
67
+ }
68
+
69
+ initStorage() {
70
+ // if(this.otherOptions.database) {
71
+ // console.log('Has Database Option:', this.otherOptions.database.table)
72
+ // const schema = (this.otherOptions.adapters?.incoming) ? Object.keys(this.otherOptions.adapters.incoming({})).join() : '++id'
73
+ // this.apiService.initDB(this.otherOptions.database.expiresIn, this.otherOptions.database.table, schema)
74
+ // }
75
+ }
76
+
77
+ initializeState(data: any) {
78
+ this.setData$(data)
79
+ }
80
+
81
+ // --------------------------------------------------------------------------------------------------
82
+ // SELECTORS
83
+
84
+ readonly data$ = this.select(({ data, dataObject }) => {
85
+ const isArray =( this.dataType === DataType.ARRAY) ? true : false
86
+ return (isArray) ? data : dataObject
87
+ })
88
+
89
+ readonly selectRecord$ = (id: number) => this.select(
90
+ this.data$,
91
+ (data) => {
92
+ if (this.dataType === DataType.ARRAY && Array.isArray(data)) {
93
+ return data.find(item => item.id === id) as T | null
94
+ } else {
95
+ return (data as T).id === id ? data : null
96
+ }
97
+ }
98
+ );
99
+
100
+ // --------------------------------------------------------------------------------------------------
101
+
102
+ // UPDATERS
103
+
104
+ private readonly setData$ = this.updater((state: APIStateManagerData<T>, data: T | T[] | any) => {
105
+
106
+ if (!data) return state;
107
+
108
+ if (this.dataType === DataType.ARRAY) {
109
+
110
+ const dataArray = Array.isArray(data) ? data : [data]
111
+
112
+ const stateDataSample = (state.data.length > 0) ? Object.keys(state.data[0]) : []
113
+ const newDataSample = (dataArray.length > 0) ? Object.keys(dataArray[0]) : []
114
+
115
+ const isSame = (state.data.length === 0) ? false : stateDataSample.every((value, index) => value === newDataSample[index])
116
+ const updatedData = (!isSame && dataArray.length !== 0) ? this.updateArrayState([], dataArray) : this.updateArrayState(state.data, dataArray)
117
+
118
+ return { ...state, data: updatedData, dataObject: null } as APIStateManagerData<T>;
119
+
120
+ } else {
121
+ const dataObject = this.isEmpty(data) ? null : data;
122
+ return { ...state, data: [], dataObject: dataObject } as APIStateManagerData<T>;
123
+ }
124
+
125
+ });
126
+
127
+ private updateArrayState(currentData: any[], newData: any[]): any[] {
128
+
129
+ const filterCurrentData = () => {
130
+ const ids = this.streamedResponse.map((obj: any) => obj.id)
131
+ return currentData.filter(obj => (obj.id) ? ids.includes(obj.id) : obj)
132
+ }
133
+
134
+ const filteredCurrentData = (this.httpManagerService.isPending.value) ? currentData : filterCurrentData()
135
+
136
+ const updatedData = filteredCurrentData.map(item => {
137
+ const newItem = newData.find(newItem => {
138
+ const hasId = (newItem?.id && item?.id) ? true : false
139
+ return (hasId) ? newItem.id === item.id : JSON.stringify(newItem) === JSON.stringify(item)
140
+ })
141
+ return (newItem) ? { ...item, ...newItem } : item
142
+ })
143
+
144
+ const addedData = newData.filter(newItem => {
145
+ return !filteredCurrentData.some(item => {
146
+ const hasId = (newItem?.id && item?.id) ? true : false
147
+ return (hasId) ? item.id === newItem.id : JSON.stringify(newItem) === JSON.stringify(item)
148
+ })
149
+ })
150
+
151
+ return [...updatedData, ...addedData]
152
+
153
+ }
154
+
155
+ private readonly addData$ = this.updater((state: APIStateManagerData<T>, data: T) => {
156
+
157
+ if (this.dataType === DataType.ARRAY) {
158
+ const newState = [...state.data, data];
159
+ return { ...state, ...{ data: newState } }
160
+ } else {
161
+ return { ...state, ...{ dataObject: data } }
162
+ }
163
+
164
+ })
165
+
166
+ private readonly deleteData$ = this.updater((state: APIStateManagerData<T>, data: T & { id: number }) => {
167
+ if (this.dataType === DataType.ARRAY) {
168
+ const newState = state.data.filter(item => item.id !== data.id)
169
+ return { ...state, ...{ data: newState } }
170
+ } else {
171
+ return { ...state, ...{ dataObject: null } }
172
+ }
173
+ })
174
+
175
+ private readonly updateData$ = this.updater((state: APIStateManagerData<T>, data: T) => {
176
+
177
+ if (this.dataType === DataType.ARRAY) {
178
+
179
+ const objIndex = state.data.findIndex(item => item.id === data.id)
180
+
181
+ if (objIndex > -1) {
182
+ const newState = [...state.data]
183
+ newState[objIndex] = data
184
+ return { ...state, ...{ data: newState } }
185
+ }
186
+
187
+ return state
188
+
189
+ } else {
190
+ return { ...state, ...{ dataObject: data } }
191
+ }
192
+
193
+ })
194
+
195
+ // --------------------------------------------------------------------------------------------------
196
+ // EFFECTS
197
+
198
+ readonly clearRecords = this.effect(data =>
199
+ data.pipe(
200
+ tap(() => {
201
+ if (this.dataType === DataType.ARRAY) {
202
+ this.setData$([])
203
+ } else {
204
+ this.setData$({})
205
+ }
206
+ })
207
+ ))
208
+
209
+ readonly refreshData = this.effect(data =>
210
+ data.pipe(
211
+ tap(() => {
212
+ // this.apiService.flushDatabase(this.otherOptions.database?.table)
213
+ this.fetchRecords()
214
+ })
215
+ ))
216
+
217
+ // --------------------------------------------------------------------------------------------------
218
+ // CRUD OPERATIONS
219
+
220
+ // FETCH RECORDS
221
+ readonly fetchRecords = (options?: RequestOptions) =>
222
+ this.effect<any>(() =>
223
+ of(RequestOptions.adapt(options)).pipe(
224
+ switchMap(() => {
225
+
226
+ this.streamedResponse = []
227
+ const requestOptions = this.updateRequestOptions(options?.headers)
228
+
229
+ return this.httpManagerService.getRequest(requestOptions, options?.path)
230
+ .pipe(
231
+ tap((data: any) => {
232
+ data = (!data) ? (this.dataType === DataType.ARRAY) ? [] : {} : data
233
+ this.setData$(data)
234
+ })
235
+ )
236
+
237
+ })
238
+ )
239
+ )
240
+
241
+ // CREATE RECORD
242
+ readonly createRecord = (data: any|null, options?: RequestOptions) =>
243
+ this.effect<any>(() =>
244
+ of(data).pipe(
245
+ switchMap((data: any) => {
246
+
247
+ this.streamedResponse = []
248
+ const requestOptions = this.updateRequestOptions(options?.headers)
249
+
250
+ return this.httpManagerService.postRequest(data, requestOptions, options?.path)
251
+ .pipe(
252
+ tap((data: any) => {
253
+ data = (!data) ? (this.dataType === DataType.ARRAY) ? [] : {} : data
254
+ this.addData$(data)
255
+ }),
256
+ )
257
+
258
+ })
259
+ )
260
+ )
261
+
262
+ // UPDATE RECORD
263
+ readonly updateRecord = (data: any|null, options?: RequestOptions) =>
264
+ this.effect<any>(() =>
265
+ of(data).pipe(
266
+ concatMap((data: any) => {
267
+
268
+ this.streamedResponse = []
269
+ const requestOptions = this.updateRequestOptions(options?.headers)
270
+
271
+ return this.httpManagerService.putRequest(data, requestOptions, options?.path)
272
+ .pipe(
273
+ tap((data: any) => {
274
+ data = (!data) ? (this.dataType === DataType.ARRAY) ? [] : {} : data
275
+ this.updateData$(data)
276
+ }),
277
+ )
278
+
279
+ })
280
+ )
281
+ )
282
+
283
+ // DELETE RECORD
284
+ readonly deleteRecord = (options?: RequestOptions) =>
285
+ this.effect<any>(() =>
286
+ of(options).pipe(
287
+ concatMap((data: any) => {
288
+
289
+ this.streamedResponse = []
290
+ const requestOptions = this.updateRequestOptions(options?.headers)
291
+
292
+ return this.httpManagerService.deleteRequest(requestOptions, options?.path)
293
+ .pipe(
294
+ tap((data: any) => {
295
+ data = (!data) ? (this.dataType === DataType.ARRAY) ? [] : {} : data
296
+ this.deleteData$(data)
297
+ }),
298
+ )
299
+
300
+ })
301
+ )
302
+ )
303
+
304
+ // --------------------------------------------------------------------------------------------------
305
+ // FETCH STREAM
306
+
307
+ readonly createStream = (data: any|null, options?: RequestOptions) =>
308
+ this.effect<any>(() =>
309
+ of(data).pipe(
310
+ tap(() => this.httpManagerService.isPending.next(true)),
311
+ switchMap((data: any) => {
312
+
313
+ const requestOptions = this.updateRequestOptions(options?.headers)
314
+
315
+ return this.httpManagerService.postRequest(data, requestOptions, options?.path)
316
+ .pipe(
317
+ tap((res: any) => {
318
+ if(res.length > 0) this.setData$(res)
319
+ this.streamedResponse = res
320
+ }),
321
+ scan((acc, res: any) => {
322
+
323
+ const previous = acc.current
324
+ const current = res
325
+ return { previous, current };
326
+
327
+ }, { previous: null, current: null }),
328
+ tap(({ previous, current }) => {
329
+
330
+ if(previous && JSON.stringify(previous) === JSON.stringify(current)) {
331
+ this.httpManagerService.isPending.next(false)
332
+ this.setData$([])
333
+ } else {
334
+ this.httpManagerService.isPending.next(true)
335
+ }
336
+
337
+ })
338
+ )
339
+
340
+ })
341
+ )
342
+
343
+ )
344
+
345
+ readonly fetchStream = (options?: RequestOptions) =>
346
+ this.effect<any>(() =>
347
+ of(options).pipe(
348
+ tap(() => this.httpManagerService.isPending.next(true)),
349
+ switchMap((options: any) => {
350
+
351
+ const requestOptions = this.updateRequestOptions(options?.headers)
352
+ requestOptions.stream = true
353
+
354
+ return this.httpManagerService.getRequest(requestOptions, options?.path)
355
+ .pipe(
356
+ tap((res: any) => {
357
+
358
+ if(res.length > 0) this.setData$(res)
359
+ this.streamedResponse = res
360
+ }),
361
+ scan((acc, res: any) => {
362
+
363
+ const previous = acc.current
364
+ const current = res
365
+ return { previous, current }
366
+
367
+ }, { previous: null, current: null }),
368
+ tap(({ previous, current }) => {
369
+
370
+ if(previous && JSON.stringify(previous) === JSON.stringify(current)) {
371
+ this.httpManagerService.isPending.next(false)
372
+ this.setData$([])
373
+ } else {
374
+ this.httpManagerService.isPending.next(true)
375
+ }
376
+
377
+ })
378
+ )
379
+
380
+ }),
381
+ )
382
+ )
383
+
384
+ // --------------------------------------------------------------------------------------------------
385
+ // MISC
386
+
387
+ private isEmpty(obj: any) {
388
+ return Object.keys(obj).length === 0
389
+ }
390
+
391
+ private updateRequestOptions(headers?: any): ApiRequest {
392
+
393
+ const options = ApiRequest.adapt({ ...this.apiOptions })
394
+
395
+ options.headers = (headers)
396
+ ? { ...options.headers, ...headers }
397
+ : { ...options.headers }
398
+
399
+ return options
400
+ }
401
+
402
+ }
@@ -1,2 +1,3 @@
1
1
  export * from "./http-manager-state.store";
2
+
2
3
  export * from "./models/index";
@@ -0,0 +1,50 @@
1
+ import { RetryOptions } from "../../request-manager-services"
2
+
3
+ export interface ApiRequestInterface {
4
+ server: string
5
+ path?: any[]
6
+ headers?: any
7
+ adapter?: any
8
+ mapper?: any
9
+ polling?: number // seconds (undefined | 0 = none)
10
+ retry?: RetryOptions
11
+ stream?: boolean
12
+ displayError?: boolean
13
+ saveAs?: string
14
+ }
15
+
16
+ export class ApiRequest implements ApiRequestInterface {
17
+
18
+ constructor(
19
+ public server = '',
20
+ public path?: any[],
21
+ public headers?: any,
22
+ public adapter?: any,
23
+ public mapper?: any,
24
+ public polling?: number,
25
+ public retry?: RetryOptions,
26
+ public stream?: boolean,
27
+ public displayError?: boolean,
28
+ public saveAs?: string,
29
+ ) {}
30
+
31
+ static adapt(item?: any): ApiRequest {
32
+
33
+ const server = Array.isArray(item?.server) ? item.server.join('/') : item?.server || '';
34
+
35
+ return new ApiRequest(
36
+ server,
37
+ (item?.path) ? item.path : [],
38
+ (item?.headers) ? item.headers : {},
39
+ item?.adapter,
40
+ item?.mapper,
41
+ item?.polling ? Math.floor(item.polling) : 0,
42
+ item?.retry ? RetryOptions.adapt(item.retry) : RetryOptions.adapt(),
43
+ (item?.stream) ? item.stream : false,
44
+ (item?.displayError) ? item.displayError : false,
45
+ item?.saveAs,
46
+ )
47
+
48
+ }
49
+
50
+ }
@@ -1,2 +1,3 @@
1
1
  export * from "./api-request.model";
2
2
  export * from "./request-options.model";
3
+
@@ -0,0 +1,22 @@
1
+ export interface RequestOptionsInterface {
2
+ path: any[],
3
+ headers: any,
4
+ }
5
+
6
+ export class RequestOptions implements RequestOptionsInterface {
7
+
8
+ constructor(
9
+ public path: any[] = [],
10
+ public headers = {},
11
+ ) {}
12
+
13
+ static adapt(item?: any): RequestOptions {
14
+
15
+ return new RequestOptions(
16
+ item?.path,
17
+ item?.headers,
18
+ )
19
+
20
+ }
21
+
22
+ }
@@ -0,0 +1,25 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { APP_ID } from '@angular/core';
3
+ import { AppService } from './app.service';
4
+
5
+ describe('AppService', () => {
6
+ let service: AppService;
7
+
8
+ beforeEach(() => {
9
+ TestBed.configureTestingModule({
10
+ providers: [
11
+ AppService,
12
+ { provide: APP_ID, useValue: 'test-app-id' }
13
+ ]
14
+ });
15
+ service = TestBed.inject(AppService);
16
+ });
17
+
18
+ it('should be created', () => {
19
+ expect(service).toBeTruthy();
20
+ });
21
+
22
+ it('should have appID assigned from APP_ID', () => {
23
+ expect(service.appID).toBe('test-app-id');
24
+ });
25
+ });
@@ -0,0 +1,21 @@
1
+ import { APP_ID, Inject, Injectable } from '@angular/core';
2
+
3
+ // Must provide a value for APP_ID in AppModule->Providers
4
+ // providers: [
5
+ // {
6
+ // provide: APP_ID,
7
+ // useValue: "056991ac-3537-43ab-b5b9-83edf6554eff",
8
+ // },
9
+
10
+ @Injectable({
11
+ providedIn: 'root'
12
+ })
13
+ export class AppService {
14
+
15
+ appID: string
16
+
17
+ constructor(@Inject(APP_ID) private id: string) {
18
+ this.appID = this.id
19
+ }
20
+
21
+ }
@@ -0,0 +1,79 @@
1
+ # Generate a Key Pair on Mac
2
+
3
+ To generate a key pair on a Mac, you can use the built-in openssl command-line tool. This tool is available on most Unix-like operating systems, including macOS. Below are the steps to generate an RSA key pair using openssl:
4
+
5
+ ### Step 1: Open Terminal
6
+
7
+ Open the Terminal application on your Mac. You can find it in the Utilities folder within the Applications folder, or you can use Spotlight to search for "Terminal".
8
+
9
+ ### Step 2: Generate the Private Key
10
+
11
+ Run the following command to generate a 2048-bit RSA private key:
12
+
13
+ ```sh
14
+ openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
15
+ ```
16
+
17
+ ### Step 3: Generate the Public Key
18
+
19
+ Run the following command to extract the public key from the private key:
20
+
21
+ ```sh
22
+ openssl rsa -pubout -in private_key.pem -out public_key.pem
23
+ ```
24
+
25
+ ### Step 4: View the Keys (Optional)
26
+
27
+ You can view the contents of the generated key files using the cat command:
28
+
29
+ To view the private key:
30
+
31
+ ```sh
32
+ cat private_key.pem
33
+ ```
34
+
35
+ To view the public key:
36
+
37
+ ```sh
38
+ cat public_key.pem
39
+ ```
40
+
41
+ -----BEGIN PRIVATE KEY-----
42
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC2mvvEWn/aMikX
43
+ A8+/Po2R4+PHwC9wxa10fr75sR9Wbuq8NY/yY174JHR4rRmyV8EnKEfyoTzfsvTO
44
+ 858lPD4DuUKESh+NDKiLNUdY4isrR060rxzJn+30OzKkZIHWhIZY3jqEw7C+glMV
45
+ Fmphtci4WQqPYwi1rX3YswE0MJhF/a+HCZ5erDmET/PFZJtTSsx47zbeck2Mnfta
46
+ KpF/wS9jYtpUFrf/vSuTo4Q0libauiFwPgCeYTGEBGGbKVnbAbM71qqmjOxT0ItW
47
+ TbsrGWG54G6vTxg/mnzxpJfMNlVOogv9u2YcG0lEQ/xo9P88WBWPdE0TK5V37GOq
48
+ 3twvUruHAgMBAAECggEAThZZqr6OpQbFRofFO8GqtaQQAJghUWbfRY176ngBcCtP
49
+ azu2ek9fSdsBCafwcLERMscJeWrVBs5W3PcWa8xmsp3zIXI3KtCqdJlMkOhq0H+W
50
+ WzL1Kw2eqs3z2pP2Z/9VGkSyHps2hklh8QccZ/teQeMl3mpZy6NMyTHHRoOvYmIg
51
+ TBhDPL+WWJXPVlgKle3RRDVeD1JVo5XmsOW4I8FRyp5f7BZE1IwPTNDUATAtwC8u
52
+ dHHo1rTkWIk2gxVPRcH61w8ceij4VPv7Sk7iFobcLkscTwbTzondU3YssSYEmayW
53
+ 5+qhIbHXWnn4FVMPVrDUORVAW8naCrVVBCYGWFDnQQKBgQDcsQ07EaYWDnRQ0xcq
54
+ 5hTQUnd137CKNQcLXJ8T+ghuj5v0ZhPpu3YZDjm+rX52mrFN4+kEMKkCjFJAeKaI
55
+ omqKb/i57t7tcQKsbGdtUyRt7PirnHed7dlEo0ElwBWr58hTcUuTnoIiQM3sgmpn
56
+ VrlntlWpVWr0hoJMxRS6Pb6xQQKBgQDT0gVdNm0+ZrBKDWWKkeaQHHyxdva8Dt6C
57
+ NEjP+uU16hF6CsPGCvDuNA9PMIqGHR914aeEwYWtma6/zI1T74jhlUiyAHkpW373
58
+ +xNWmruq8k3UlVBK8JIjH/LOXNV5Gw85yLJwokhl6A8m4DSMkDJZTLVXfYQ24su1
59
+ TMDz0yhyxwKBgA/jNx6fgKNp2vnOmIZgFfOBXFRCDEWG18D7pAAeKek7sXCAwMI8
60
+ 2p2nJoURnF8Rd94xoB7LGf+y9mDpzqNbfewFb5SDG81gK18aVr/KEn9PZf+Evh/C
61
+ dbe5QQFkuKqtfwBy0YwJBzlMDQcPxHU4CxTqTXRpT8/Wtx6ruXhG5amBAoGANXmC
62
+ 8ypHYAaKoNdK+DWnMGCQtjijR4y1bceHTkI31WmXKelHzVp7wpcP+lz1y6/Ufm0O
63
+ XnyAo/f1XuRkFXmWY+TNKmrmK6O2pSIUmruLfzeWoIFleNXM/uMU6DYVinJjYKIj
64
+ Mj416swv7w+RFJ9epp6v9Ttxwm11IfsThzqarocCgYAPbtk6kqJwxq5I49NoC3Nm
65
+ WozUs31UywHJLS4JeudityA7ZTD8kULyhCig+Mrupiu3qLAmFtJzYFFIoP4msIOC
66
+ xMQ2qHvUyX9BwpONDwZ6fjwQYa8/kt22MelVICKqDpyYlOipV/YRKMNXsaQJd6xB
67
+ pkaCFGUW4xoRwTR/So/RnQ==
68
+ -----END PRIVATE KEY-----
69
+ (base) mike.boni@Mikes-MacBook-Pro ~ % cat public_key.pem
70
+
71
+ -----BEGIN PUBLIC KEY-----
72
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtpr7xFp/2jIpFwPPvz6N
73
+ kePjx8AvcMWtdH6++bEfVm7qvDWP8mNe+CR0eK0ZslfBJyhH8qE837L0zvOfJTw+
74
+ A7lChEofjQyoizVHWOIrK0dOtK8cyZ/t9DsypGSB1oSGWN46hMOwvoJTFRZqYbXI
75
+ uFkKj2MIta192LMBNDCYRf2vhwmeXqw5hE/zxWSbU0rMeO823nJNjJ37WiqRf8Ev
76
+ Y2LaVBa3/70rk6OENJYm2rohcD4AnmExhARhmylZ2wGzO9aqpozsU9CLVk27Kxlh
77
+ ueBur08YP5p88aSXzDZVTqIL/btmHBtJREP8aPT/PFgVj3RNEyuVd+xjqt7cL1K7
78
+ hwIDAQAB
79
+ -----END PUBLIC KEY-----