@libs-ui/services-base-request-abstract 0.2.356-41 → 0.2.356-43

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/README.md CHANGED
@@ -1,17 +1,33 @@
1
- # Base Request Abstract Service
1
+ # @libs-ui/services-base-request-abstract
2
2
 
3
- Abstract base class cung cấp toàn bộ infrastructure cho HTTP requests trong Angular: GET, POST, PUT, PATCH, DELETE, file upload với progress tracking, response normalization, error handling tự động, caching với IndexedDB page zero conversion.
3
+ > Abstract base class cung cấp toàn bộ infrastructure cho HTTP requests trong Angular: chuẩn hóa response, xử lỗi tự động, caching IndexedDB, upload file với progress tracking chuyển đổi page 0-based/1-based.
4
+
5
+ ## Giới thiệu
6
+
7
+ `LibsUiBaseRequestAbstractService` là abstract class trung tâm dùng để xây dựng tầng API service trong ứng dụng Angular. Class này đóng gói toàn bộ logic gọi HTTP (GET, POST, PUT, PATCH, DELETE), chuẩn hóa response từ nhiều format backend khác nhau, tự động redirect khi nhận 401 Unauthorized, hỗ trợ caching IndexedDB phân tầng theo user, và upload file native XHR với progress tracking.
8
+
9
+ Thay vì mỗi service tự viết logic xử lý lỗi và chuẩn hóa response, ta chỉ cần extend class này và implement 3 abstract methods bắt buộc.
4
10
 
5
11
  ## Tính năng
6
12
 
7
- - ✅ HTTP methods đầy đủ: GET, POST, PUT, PATCH, DELETE
8
- - ✅ URL-encoded form: `postUrlEndCode`, `patchUrlEndCode` (content-type `application/x-www-form-urlencoded`)
13
+ - ✅ HTTP methods đầy đủ: `get`, `post`, `put`, `patch`, `delete`
14
+ - ✅ URL-encoded form: `postUrlEndCode`, `patchUrlEndCode` (Content-Type `application/x-www-form-urlencoded`)
9
15
  - ✅ File upload với progress tracking qua XHR native (`sendWithFile`)
10
- - ✅ Response normalization tự động — hỗ trợ nhiều backend format
11
- - ✅ Pagination tự động từ nhiều format (paging, Spring pagination, cursor-based)
12
- - ✅ Error handling: 401 → auto redirect, phân biệt 4xx vs 5xx
13
- - ✅ Caching với IndexedDB (`cacheIndexDB`) — phân biệt theo user
14
- - ✅ Page zero conversion (`isStartZeroPage`) — UI 1-based API 0-based
16
+ - ✅ Response normalization tự động — hỗ trợ REST standard, Spring Boot (`totalElements`, `totalPages`), cursor-based pagination
17
+ - ✅ Pagination chuẩn hóa từ nhiều backend format về `IPaging` thống nhất
18
+ - ✅ Error handling: 401 → auto redirect login, phân biệt lỗi 4xx vs 5xx
19
+ - ✅ Caching với IndexedDB (`cacheIndexDB`) — phân tầng theo user ID
20
+ - ✅ Page zero conversion (`isStartZeroPage`) — UI 1-based tự động chuyển sang API 0-based
21
+ - ✅ URL dynamic segments — thay thế `:id`, `:userId` trong URL tự động qua `replaceURLByPattern`
22
+ - ✅ `observeResponse` — chọn mode nhận full HTTP response hoặc chỉ body
23
+
24
+ ## Khi nào sử dụng
25
+
26
+ - Khi cần tạo một API service mới để gọi backend REST API
27
+ - Khi muốn thống nhất cách xử lý auth token, error handling và response format toàn project
28
+ - Khi cần caching dữ liệu API theo từng user (IndexedDB)
29
+ - Khi cần upload file với progress bar (không dùng được XHR native thuần)
30
+ - Khi backend trả về nhiều format pagination khác nhau (cần chuẩn hóa về `IPaging`)
15
31
 
16
32
  ## Cài đặt
17
33
 
@@ -22,16 +38,17 @@ npm install @libs-ui/services-base-request-abstract
22
38
  ## Import
23
39
 
24
40
  ```typescript
25
- import { LibsUiBaseRequestAbstractService } from '@libs-ui/services-base-request-abstract';
41
+ import { LibsUiBaseRequestAbstractService, TYPE_OBSERVE_RESPONSE } from '@libs-ui/services-base-request-abstract';
26
42
  ```
27
43
 
28
- ## Cách sử dụng
44
+ ## dụ sử dụng
29
45
 
30
- ### Bước 1: Extend implement 3 abstract methods bắt buộc
46
+ ### dụ 1 Tạo ApiService gốc (implement 3 abstract methods bắt buộc)
31
47
 
32
48
  ```typescript
33
49
  import { Injectable } from '@angular/core';
34
50
  import { HttpHeaders, HttpParams } from '@angular/common/http';
51
+ import { inject } from '@angular/core';
35
52
  import { Router } from '@angular/router';
36
53
  import { LibsUiBaseRequestAbstractService } from '@libs-ui/services-base-request-abstract';
37
54
  import { UtilsHttpParamsRequest } from '@libs-ui/utils';
@@ -40,26 +57,32 @@ import { UtilsHttpParamsRequest } from '@libs-ui/utils';
40
57
  export class ApiService extends LibsUiBaseRequestAbstractService {
41
58
  protected override baseUrl = 'https://api.example.com';
42
59
 
43
- constructor(private router: Router) {
60
+ private readonly router = inject(Router);
61
+
62
+ constructor() {
44
63
  super();
45
- this.keyCacheUniqueByIdUserLogin = localStorage.getItem('userId') || '';
64
+ // Gán user ID để phân tầng cache theo từng user login
65
+ this.keyCacheUniqueByIdUserLogin = sessionStorage.getItem('userId') || '';
46
66
  }
47
67
 
68
+ // [1] Inject auth header và content-type cho mọi request
48
69
  protected getOptions<T>(params: UtilsHttpParamsRequest<T>, contentType?: string) {
49
- const token = localStorage.getItem('accessToken');
70
+ const token = sessionStorage.getItem('accessToken');
50
71
  return {
51
72
  headers: new HttpHeaders({
52
73
  'Content-Type': contentType || 'application/json',
53
74
  ...(token ? { Authorization: `Bearer ${token}` } : {}),
54
75
  }),
55
- params,
76
+ params: params as unknown as HttpParams,
56
77
  };
57
78
  }
58
79
 
80
+ // [2] Được gọi tự động khi server trả về 401 Unauthorized
59
81
  protected redirectToLogin(): void {
60
82
  this.router.navigate(['/login']);
61
83
  }
62
84
 
85
+ // [3] Thay thế URL dynamic segments — `:id`, `:userId`, `:orgId`...
63
86
  protected replaceURLByPattern<T>(url: string, params: UtilsHttpParamsRequest<T>) {
64
87
  let resultUrl = url;
65
88
  const pattern = /:([\w]+)/g;
@@ -68,7 +91,7 @@ export class ApiService extends LibsUiBaseRequestAbstractService {
68
91
  const key = match[1];
69
92
  if (params.has(key)) {
70
93
  resultUrl = resultUrl.replace(`:${key}`, params.get(key)!);
71
- params = params.delete(key);
94
+ params = params.delete(key) as UtilsHttpParamsRequest<T>;
72
95
  }
73
96
  }
74
97
  return { url: resultUrl, params };
@@ -76,137 +99,329 @@ export class ApiService extends LibsUiBaseRequestAbstractService {
76
99
  }
77
100
  ```
78
101
 
79
- ### Bước 2: Tạo feature service kế thừa ApiService
102
+ ### dụ 2 Feature service kế thừa ApiService (CRUD đầy đủ)
80
103
 
81
104
  ```typescript
105
+ import { Injectable } from '@angular/core';
106
+ import { UtilsHttpParamsRequest } from '@libs-ui/utils';
107
+ import { ApiService } from './api.service';
108
+
109
+ export type T_user = {
110
+ id: string;
111
+ name: string;
112
+ email: string;
113
+ status: string;
114
+ };
115
+
116
+ export type T_user_list_params = {
117
+ page?: number;
118
+ size?: number;
119
+ search?: string;
120
+ status?: string;
121
+ };
122
+
123
+ export type T_user_create_body = {
124
+ name: string;
125
+ email: string;
126
+ password: string;
127
+ };
128
+
129
+ export type T_user_update_body = {
130
+ name?: string;
131
+ email?: string;
132
+ };
133
+
82
134
  @Injectable({ providedIn: 'root' })
83
- export class UserService extends ApiService {
84
- getUsers(params?: { page?: number; size?: number }) {
85
- return this.get<User[]>('/users', new UtilsHttpParamsRequest(undefined, params));
135
+ export class UserApiService extends ApiService {
136
+ getList(params: T_user_list_params) {
137
+ return this.get<T_user[]>('/users', new UtilsHttpParamsRequest(undefined, { fromObject: params }));
138
+ }
139
+
140
+ getById(id: string) {
141
+ return this.get<T_user>('/users/:id', new UtilsHttpParamsRequest(undefined, { fromObject: { id } }));
86
142
  }
87
143
 
88
- getUserById(id: string) {
89
- return this.get<User>('/users/:id', new UtilsHttpParamsRequest(undefined, { id }));
144
+ create(body: T_user_create_body) {
145
+ return this.post<T_user>('/users', body);
90
146
  }
91
147
 
92
- createUser(body: CreateUserDto) {
93
- return this.post<User>('/users', body);
148
+ update(id: string, body: T_user_update_body) {
149
+ return this.put<T_user>('/users/:id', body, new UtilsHttpParamsRequest(undefined, { fromObject: { id } }));
94
150
  }
95
151
 
96
- updateUser(id: string, body: UpdateUserDto) {
97
- return this.put<User>('/users/:id', body, new UtilsHttpParamsRequest(undefined, { id }));
152
+ partialUpdate(id: string, body: Partial<T_user_update_body>) {
153
+ return this.patch<T_user>('/users/:id', body, new UtilsHttpParamsRequest(undefined, { fromObject: { id } }));
98
154
  }
99
155
 
100
- deleteUser(id: string) {
101
- return this.delete<void>('/users/:id', new UtilsHttpParamsRequest(undefined, { id }));
156
+ remove(id: string) {
157
+ return this.delete<void>('/users/:id', new UtilsHttpParamsRequest(undefined, { fromObject: { id } }));
102
158
  }
103
159
  }
104
160
  ```
105
161
 
106
- ### File Upload với Progress Tracking
162
+ ### dụ 3 — Caching dữ liệu với IndexedDB
107
163
 
108
164
  ```typescript
109
- uploadAvatar(userId: string, file: File, onProgress?: (percent: number) => void) {
110
- return this.sendWithFile<{ url: string }>(
111
- '/users/:userId/avatar',
112
- new UtilsHttpParamsRequest(undefined, { userId }),
113
- {
114
- method: 'POST',
115
- bodyData: { file },
116
- keepFileOfBody: true,
117
- processUpload: onProgress ? ({ percent }) => onProgress(percent) : undefined,
118
- }
119
- );
165
+ import { Injectable } from '@angular/core';
166
+ import { lastValueFrom } from 'rxjs';
167
+ import { UtilsHttpParamsRequest } from '@libs-ui/utils';
168
+ import { ApiService } from './api.service';
169
+ import { T_user, T_user_list_params, T_user_create_body } from './user-api.service';
170
+
171
+ @Injectable({ providedIn: 'root' })
172
+ export class UserCachedApiService extends ApiService {
173
+ // Cache danh sách 5 phút (300000ms)
174
+ getListCached(params: T_user_list_params) {
175
+ const observable = this.get<T_user[]>('/users', new UtilsHttpParamsRequest(undefined, { fromObject: params }));
176
+ return this.cacheIndexDB(observable, 'users-list', [params], 5 * 60 * 1000);
177
+ }
178
+
179
+ // Xóa cache sau khi tạo mới để lần sau lấy dữ liệu mới nhất
180
+ async create(body: T_user_create_body) {
181
+ const result = await lastValueFrom(this.post<T_user>('/users', body));
182
+ await this.deleteCacheKeyStartWidth('users-list');
183
+ return result;
184
+ }
185
+
186
+ // Bắt buộc lấy dữ liệu mới (bỏ qua cache hiện có)
187
+ getListForceRefresh(params: T_user_list_params) {
188
+ const observable = this.get<T_user[]>('/users', new UtilsHttpParamsRequest(undefined, { fromObject: params }));
189
+ return this.cacheIndexDB(observable, 'users-list', [params], 5 * 60 * 1000, true);
190
+ }
120
191
  }
121
192
  ```
122
193
 
123
- ### Caching với IndexedDB
194
+ ### dụ 4 — Upload file với progress tracking
124
195
 
125
196
  ```typescript
126
- getUsersCached(params?: any) {
127
- const observable = this.get<User[]>('/users', new UtilsHttpParamsRequest(undefined, params));
128
- return this.cacheIndexDB(observable, 'users-list', [params], 5 * 60 * 1000);
197
+ import { Injectable } from '@angular/core';
198
+ import { UtilsHttpParamsRequest } from '@libs-ui/utils';
199
+ import { ApiService } from './api.service';
200
+
201
+ export type T_upload_result = { url: string; fileName: string };
202
+
203
+ @Injectable({ providedIn: 'root' })
204
+ export class FileUploadApiService extends ApiService {
205
+ uploadAvatar(userId: string, file: File, onProgress?: (percent: number) => void) {
206
+ return this.sendWithFile<T_upload_result>(
207
+ '/users/:userId/avatar',
208
+ new UtilsHttpParamsRequest(undefined, { fromObject: { userId } }),
209
+ {
210
+ method: 'POST',
211
+ bodyData: { file },
212
+ keepFileOfBody: true,
213
+ processUpload: onProgress
214
+ ? ({ percent }) => onProgress(percent)
215
+ : undefined,
216
+ }
217
+ );
218
+ }
219
+
220
+ uploadMultipleFiles(folderId: string, files: File[], onProgress?: (percent: number) => void) {
221
+ return this.sendWithFile<T_upload_result[]>(
222
+ '/folders/:folderId/files',
223
+ new UtilsHttpParamsRequest(undefined, { fromObject: { folderId } }),
224
+ {
225
+ method: 'POST',
226
+ bodyData: { files },
227
+ keepFileOfBody: true,
228
+ processUpload: onProgress
229
+ ? ({ percent }) => onProgress(percent)
230
+ : undefined,
231
+ }
232
+ );
233
+ }
129
234
  }
235
+ ```
130
236
 
131
- // Xóa cache sau mutation
132
- async createUser(body: CreateUserDto) {
133
- const result = await lastValueFrom(this.post<User>('/users', body));
134
- await this.deleteCacheKeyStartWidth('users-list');
135
- return result;
237
+ ### dụ 5 — API 0-based pagination (isStartZeroPage)
238
+
239
+ Khi backend nhận `page` bắt đầu từ 0 nhưng UI hiển thị bắt đầu từ 1:
240
+
241
+ ```typescript
242
+ import { Injectable } from '@angular/core';
243
+ import { HttpHeaders, HttpParams } from '@angular/common/http';
244
+ import { Router } from '@angular/router';
245
+ import { inject } from '@angular/core';
246
+ import { LibsUiBaseRequestAbstractService } from '@libs-ui/services-base-request-abstract';
247
+ import { UtilsHttpParamsRequest } from '@libs-ui/utils';
248
+
249
+ @Injectable({ providedIn: 'root' })
250
+ export class ApiZeroPageService extends LibsUiBaseRequestAbstractService {
251
+ protected override baseUrl = 'https://api.spring-boot-backend.com';
252
+ // UI gửi page=1 → service tự trừ 1 → backend nhận page=0
253
+ protected override isStartZeroPage = true;
254
+
255
+ private readonly router = inject(Router);
256
+
257
+ protected getOptions<T>(params: UtilsHttpParamsRequest<T>, contentType?: string) {
258
+ return {
259
+ headers: new HttpHeaders({ 'Content-Type': contentType || 'application/json' }),
260
+ params: params as unknown as HttpParams,
261
+ };
262
+ }
263
+
264
+ protected redirectToLogin(): void {
265
+ this.router.navigate(['/auth/login']);
266
+ }
267
+
268
+ protected replaceURLByPattern<T>(url: string, params: UtilsHttpParamsRequest<T>) {
269
+ return { url, params };
270
+ }
136
271
  }
137
272
  ```
138
273
 
139
- ## API
274
+ ### Ví dụ 6 — Form URL-encoded (postUrlEndCode)
140
275
 
141
- ### Abstract Methods (bắt buộc implement)
276
+ Dùng khi backend yêu cầu `Content-Type: application/x-www-form-urlencoded`:
142
277
 
143
- | Method | Returns | Mô tả |
144
- | ----------------------------------------- | --------------------- | ------------------------------------------------ |
145
- | `getOptions<T>(httpParams, contentType?)` | `{ headers, params }` | Inject auth token, Content-Type vào mỗi request |
146
- | `redirectToLogin()` | `void` | Được gọi khi nhận 401 Unauthorized |
147
- | `replaceURLByPattern<T>(url, params)` | `{ url, params }` | Thay thế URL dynamic segments (`:id`, `:userId`) |
278
+ ```typescript
279
+ import { Injectable } from '@angular/core';
280
+ import { UtilsHttpParamsRequest } from '@libs-ui/utils';
281
+ import { ApiService } from './api.service';
148
282
 
149
- ### Public Methods
283
+ export type T_login_body = { username: string; password: string };
284
+ export type T_auth_response = { accessToken: string; refreshToken: string };
150
285
 
151
- | Method | Returns | Mô tả |
152
- | --------------------------------------------------- | ------------------------------ | ------------------------------------ |
153
- | `get<T, P>(path, params?)` | `Observable<IHttpResponse<T>>` | HTTP GET |
154
- | `post<T, P, B>(path, body, params?)` | `Observable<IHttpResponse<T>>` | HTTP POST |
155
- | `postUrlEndCode<T, P, B>(path, body, params?)` | `Observable<IHttpResponse<T>>` | POST URL-encoded form |
156
- | `put<T, P, B>(path, body, params?)` | `Observable<IHttpResponse<T>>` | HTTP PUT |
157
- | `patch<T, P>(path, body, params?)` | `Observable<IHttpResponse<T>>` | HTTP PATCH |
158
- | `patchUrlEndCode<T, P>(path, body, params?)` | `Observable<IHttpResponse<T>>` | PATCH URL-encoded form |
159
- | `delete<T, P>(path, params?)` | `Observable<IHttpResponse<T>>` | HTTP DELETE |
160
- | `sendWithFile<T, P, B>(path, params, args)` | `Observable<IHttpResponse<T>>` | Upload file với progress |
161
- | `cacheIndexDB<T>(obs, key, params, time?, reload?)` | `Observable<IHttpResponse<T>>` | Cache IndexedDB ✅ |
162
- | `deleteCacheKeyStartWidth(key)` | `Promise<void>` | Xóa cache theo prefix |
163
- | `cacheResponseData<T>(...)` | `Observable<IHttpResponse<T>>` | **Deprecated** — dùng `cacheIndexDB` |
286
+ @Injectable({ providedIn: 'root' })
287
+ export class AuthApiService extends ApiService {
288
+ login(body: T_login_body) {
289
+ // Gửi form URL-encoded thay JSON
290
+ return this.postUrlEndCode<T_auth_response>('/auth/login', body);
291
+ }
164
292
 
165
- ### Protected Properties (override trong subclass)
293
+ refreshToken(refreshToken: string) {
294
+ return this.postUrlEndCode<T_auth_response>('/auth/refresh', { refreshToken });
295
+ }
296
+ }
297
+ ```
166
298
 
167
- | Property | Type | Default | Mô tả |
168
- | ----------------------------- | ---------------------- | ----------- | ------------------------------ |
169
- | `baseUrl` | `string` | `''` | Base URL của API |
170
- | `keyCacheUniqueByIdUserLogin` | `string` | `''` | User ID suffix cho cache key |
171
- | `ignoreRedirect401` | `boolean?` | `undefined` | Tắt auto redirect khi 401 |
172
- | `isStartZeroPage` | `boolean` | `false` | Convert page 1-based → 0-based |
173
- | `observeResponse` | `'response' \| 'body'` | `'body'` | Mode nhận HTTP response |
299
+ ## Methods
300
+
301
+ ### Abstract Methods (bắt buộc implement trong subclass)
302
+
303
+ | Method | Signature | tả |
304
+ |---|---|---|
305
+ | `getOptions` | `<T>(httpParams: UtilsHttpParamsRequest<T>, contentType?: string) => { headers: HttpHeaders; params: HttpParams }` | Inject auth token, Content-Type vào mọi request |
306
+ | `redirectToLogin` | `() => void` | Được gọi tự động khi server trả về 401 Unauthorized |
307
+ | `replaceURLByPattern` | `<T>(url: string, params: UtilsHttpParamsRequest<T>) => { url: string; params: UtilsHttpParamsRequest<T> }` | Thay thế URL dynamic segments (`:id`, `:userId`) từ params |
308
+
309
+ ### HTTP Methods
310
+
311
+ | Method | Signature | Trả về | Mô tả |
312
+ |---|---|---|---|
313
+ | `get` | `<TypeResponse, TypeParams>(path, params?)` | `Observable<IHttpResponse<TypeResponse>>` | HTTP GET |
314
+ | `post` | `<TypeResponse, TypeParams, TypeBody>(path, body, params?)` | `Observable<IHttpResponse<TypeResponse>>` | HTTP POST JSON |
315
+ | `postUrlEndCode` | `<TypeResponse, TypeParams, TypeBody>(path, body, params?)` | `Observable<IHttpResponse<TypeResponse>>` | POST `application/x-www-form-urlencoded` |
316
+ | `put` | `<TypeResponse, TypeParams, TypeBody>(path, body, params?)` | `Observable<IHttpResponse<TypeResponse>>` | HTTP PUT JSON |
317
+ | `patch` | `<TypeResponse, TypeParams>(path, body, params?)` | `Observable<IHttpResponse<TypeResponse>>` | HTTP PATCH JSON |
318
+ | `patchUrlEndCode` | `<TypeResponse, TypeParams>(path, body, params?)` | `Observable<IHttpResponse<TypeResponse>>` | PATCH `application/x-www-form-urlencoded` |
319
+ | `delete` | `<TypeResponse, TypeParams>(path, params?)` | `Observable<IHttpResponse<TypeResponse>>` | HTTP DELETE |
320
+ | `sendWithFile` | `<TypeResponse, TypeParams, TypeBody>(path, params, args)` | `Observable<IHttpResponse<TypeResponse>>` | Upload file qua XHR native với progress tracking |
321
+
322
+ ### Cache Methods
323
+
324
+ | Method | Signature | Trả về | Mô tả |
325
+ |---|---|---|---|
326
+ | `cacheIndexDB` | `<T>(observable, key, params, timeCache?, reloadCache?)` | `Observable<IHttpResponse<T>>` | Cache response vào IndexedDB, tự động phân tầng theo user |
327
+ | `deleteCacheKeyStartWidth` | `(key: string)` | `Promise<void>` | Xóa toàn bộ cache có key bắt đầu với prefix cho trước |
328
+ | `cacheResponseData` | `<T>(observable, key, params, timeCache?, reloadCache?)` | `Observable<IHttpResponse<T>>` | **Deprecated** — dùng `cacheIndexDB` thay thế |
329
+
330
+ ### Utility Methods
331
+
332
+ | Method | Signature | Trả về | Mô tả |
333
+ |---|---|---|---|
334
+ | `getResponseURL` | `(xhr: any)` | `string` | Lấy URL thực tế sau redirect từ XHR object |
335
+
336
+ ## Protected Properties (override trong subclass)
337
+
338
+ | Property | Type | Default | Mô tả |
339
+ |---|---|---|---|
340
+ | `baseUrl` | `string` | `''` | Base URL của API (bắt buộc set) |
341
+ | `keyCacheUniqueByIdUserLogin` | `string` | `''` | User ID suffix cho cache key — tránh conflict giữa các user |
342
+ | `ignoreRedirect401` | `boolean \| undefined` | `undefined` | Set `true` để tắt auto redirect khi nhận 401 |
343
+ | `isStartZeroPage` | `boolean` | `false` | Set `true` khi backend dùng page 0-based, UI dùng 1-based |
344
+ | `ignoreAutoIncrementPageIsStartZeroPage` | `boolean` | `false` | Set `true` để tắt auto increment page trong response khi isStartZeroPage = true |
345
+ | `observeResponse` | `'response' \| 'body'` | `'body'` | Mode nhận HTTP response: `'body'` chỉ nhận data, `'response'` nhận full HTTP response |
346
+
347
+ ## Tham số của `sendWithFile`
348
+
349
+ | Tham số | Type | Bắt buộc | Mô tả |
350
+ |---|---|---|---|
351
+ | `path` | `string` | ✅ | Đường dẫn API (có thể chứa dynamic segments) |
352
+ | `params` | `UtilsHttpParamsRequest<TypeParams>` | ✅ | Query params và URL path variables |
353
+ | `args.method` | `'POST' \| 'PATCH' \| 'PUT'` | ✅ | HTTP method cho upload |
354
+ | `args.bodyData` | `TypeBody \| FormData` | ✅ | Dữ liệu body — plain object hoặc FormData có sẵn |
355
+ | `args.keepFileOfBody` | `boolean` | ❌ | Set `true` để giữ nguyên File/Blob thay vì JSON.stringify |
356
+ | `args.keepArrayValue` | `boolean` | ❌ | Set `true` để serialize array thành JSON string thay vì append từng phần tử |
357
+ | `args.processUpload` | `(process: IHttpProcessUpload) => void` | ❌ | Callback nhận tiến độ upload |
358
+
359
+ ## Tham số của `cacheIndexDB`
360
+
361
+ | Tham số | Type | Bắt buộc | Mô tả |
362
+ |---|---|---|---|
363
+ | `observable` | `Observable<IHttpResponse<T>>` | ✅ | Observable HTTP call cần cache |
364
+ | `key` | `string` | ✅ | Cache key prefix (không md5 trước) |
365
+ | `params` | `Array<any>` | ✅ | Mảng tham số để tạo unique key (page, size, filter...) |
366
+ | `timeCache` | `number` | ❌ | Thời gian cache tính bằng ms (mặc định: `UtilsCache.CACHE_EXPIRE_TIME_DEFAULT`) |
367
+ | `reloadCache` | `boolean` | ❌ | Set `true` để xóa cache cũ và lấy dữ liệu mới nhất |
368
+
369
+ ## Types & Interfaces
174
370
 
175
- ## Types
371
+ ```typescript
372
+ import { IHttpResponse, IPaging, IHttpProcessUpload } from '@libs-ui/interfaces-types';
373
+ import { UtilsHttpParamsRequest, TYPE_OBSERVE_RESPONSE } from '@libs-ui/services-base-request-abstract';
374
+ ```
176
375
 
177
376
  ```typescript
178
- interface IHttpResponse<T> {
179
- code: number;
377
+ // Response chuẩn hóa từ mọi HTTP method
378
+ type IHttpResponse<T = any, P = IPaging> = {
379
+ code?: number;
380
+ feCloneCode?: any; // code thực từ backend khi HTTP trả 200 nhưng business code khác
180
381
  message?: string;
181
382
  data?: T;
182
- paging?: IPaging;
183
- feCloneCode?: any;
184
- statusCodeHttp?: number;
185
- }
383
+ paging?: P;
384
+ [key: string]: unknown;
385
+ };
186
386
 
387
+ // Pagination chuẩn hóa từ nhiều backend format
187
388
  interface IPaging {
188
389
  page?: number;
189
390
  per_page?: number;
190
391
  total_items?: number;
191
392
  total_pages?: number;
192
- before?: string;
193
- after?: string;
393
+ before?: string; // cursor-based pagination
394
+ after?: string; // cursor-based pagination
194
395
  previous?: string;
195
396
  next?: string;
397
+ fake?: boolean;
196
398
  }
197
399
 
400
+ // Progress upload
198
401
  interface IHttpProcessUpload {
199
- loaded: number;
200
- total: number;
201
- percent: number;
402
+ loaded: number; // bytes đã upload
403
+ total: number; // tổng bytes
404
+ percent: number; // phần trăm (0-100)
202
405
  }
406
+
407
+ // Mode nhận HTTP response
408
+ type TYPE_OBSERVE_RESPONSE = 'response' | 'body';
203
409
  ```
204
410
 
205
411
  ## Lưu ý quan trọng
206
412
 
207
- - **Không inject trực tiếp** class abstract, phải extend
208
- - **3 abstract methods** phải implement: `getOptions`, `redirectToLogin`, `replaceURLByPattern`
209
- - **`cacheIndexDB` > `cacheResponseData`** `cacheResponseData` đã deprecated
210
- - **`keyCacheUniqueByIdUserLogin`** — set user ID để tránh cache conflict giữa các user
211
- - **`sendWithFile` dùng XHR native** không phải Angular HttpClient (để progress events)
212
- - **Response normalization** hỗ trợ nhiều backend format: REST standard, Spring Boot, cursor-based pagination
413
+ ⚠️ **Class là abstract — không inject trực tiếp**: Phải extend `LibsUiBaseRequestAbstractService` và implement đầy đủ 3 abstract methods: `getOptions`, `redirectToLogin`, `replaceURLByPattern`.
414
+
415
+ ⚠️ **3 abstract methods là bắt buộc**: Thiếu bất kỳ method nào sẽ gây lỗi TypeScript compile-time. Không thể dùng `super()` để bỏ qua.
416
+
417
+ ⚠️ **`cacheIndexDB` thay thế `cacheResponseData`**: Method `cacheResponseData` đã deprecated (dùng `Promise` internally). Luôn dùng `cacheIndexDB` cho code mới Observable-first, không block event loop.
418
+
419
+ ⚠️ **`keyCacheUniqueByIdUserLogin` phải set trước khi dùng cache**: Nếu bỏ trống, cache không phân tầng theo user — user A sẽ thấy data của user B sau khi login. Gán user ID trong constructor của ApiService gốc.
420
+
421
+ ⚠️ **`deleteCacheKeyStartWidth` — không md5 key trước khi truyền**: Method này tự md5 key nội bộ. Truyền vào key thô (cùng string đã dùng khi gọi `cacheIndexDB`).
422
+
423
+ ⚠️ **`sendWithFile` dùng XHR native**: Không phải Angular `HttpClient` — để có `onprogress` event. Interceptor của Angular không áp dụng ở đây. Headers phải được set thủ công từ `getOptions`.
424
+
425
+ ⚠️ **`isStartZeroPage` và response paging**: Khi bật `isStartZeroPage`, service tự trừ 1 trước khi gửi lên API và tự cộng 1 trong response trả về. Component chỉ cần làm việc với page 1-based nhất quán.
426
+
427
+ ⚠️ **`postUrlEndCode` / `patchUrlEndCode`**: Tự động encode body thành URL-encoded format. Không truyền JSON body vào — truyền plain object, class sẽ tự encode.
@@ -1,6 +1,6 @@
1
1
  import { HttpClient, HttpStatusCode } from '@angular/common/http';
2
2
  import { inject } from '@angular/core';
3
- import { UtilsHttpParamsRequestInstance, normalizeUrl, endCodeUrl, omitBy, isNil, UtilsHttpParamsRequest, DEFAULT_START_PAGE_0, get, UtilsCache, getKeyCacheByArrayObject, cloneDeep, md5 } from '@libs-ui/utils';
3
+ import { UtilsHttpParamsRequestInstance, normalizeUrl, endCodeUrl, omitBy, isNil, UtilsHttpParamsRequest, DEFAULT_START_PAGE_0, get, getKeyCacheByArrayObject, UtilsCache, cloneDeep, md5 } from '@libs-ui/utils';
4
4
  import { Observable, defer, from, of, lastValueFrom } from 'rxjs';
5
5
  import { map, catchError, switchMap, tap } from 'rxjs/operators';
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-services-base-request-abstract.mjs","sources":["../../../../../libs-ui/services/base-request-abstract/src/base-request-abstract.service.ts","../../../../../libs-ui/services/base-request-abstract/src/libs-ui-services-base-request-abstract.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpStatusCode } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { IHttpProcessUpload, IHttpResponse, IPaging, TYPE_OBJECT } from '@libs-ui/interfaces-types';\nimport { cloneDeep, DEFAULT_START_PAGE_0, endCodeUrl, get, getKeyCacheByArrayObject, isNil, md5, normalizeUrl, omitBy, UtilsCache, UtilsHttpParamsRequest, UtilsHttpParamsRequestInstance } from '@libs-ui/utils';\nimport { defer, from, lastValueFrom, Observable, of } from 'rxjs';\nimport { Observer } from 'rxjs/internal/types';\nimport { catchError, map, switchMap, tap } from 'rxjs/operators';\ntype TYPE_METHOD = 'POST' | 'PATCH' | 'PUT';\n\nexport type TYPE_OBSERVE_RESPONSE = 'response' | 'body';\n\nexport abstract class LibsUiBaseRequestAbstractService {\n protected keyCacheUniqueByIdUserLogin = '';\n protected baseUrl!: string;\n protected ignoreRedirect401?: boolean;\n protected http = inject(HttpClient);\n protected isStartZeroPage = false;\n protected ignoreAutoIncrementPageIsStartZeroPage = false;\n protected observeResponse: TYPE_OBSERVE_RESPONSE = 'body';\n\n protected abstract getOptions<TypeParams>(httpParams: UtilsHttpParamsRequest<TypeParams>, contentType?: string): { headers: HttpHeaders; params: HttpParams };\n protected abstract redirectToLogin(): void;\n protected abstract replaceURLByPattern<TypeParams>(url: string, params: UtilsHttpParamsRequest<TypeParams>): { url: string; params: UtilsHttpParamsRequest<TypeParams> };\n\n get<TypeResponse, TypeParams = any>(path: string, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.get<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), { ...this.getOptions(params), observe: observe } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n post<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.post<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), body, { ...this.getOptions(params), observe: observe } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n postUrlEndCode<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const bodyValue = endCodeUrl(body as TYPE_OBJECT, true);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.post<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), bodyValue, { ...this.getOptions(params, 'application/x-www-form-urlencoded'), observe: this.observeResponse } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n put<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.put<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), body, { ...this.getOptions(params), observe: this.observeResponse } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n patch<TypeResponse, TypeParams = any>(path: string, body: unknown, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.patch<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), body, { ...this.getOptions(params), observe: observe } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n patchUrlEndCode<TypeResponse, TypeParams = any>(path: string, body: unknown, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const bodyValue = endCodeUrl(body as TYPE_OBJECT, true);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.patch<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), bodyValue, { ...this.getOptions(params, 'application/x-www-form-urlencoded'), observe: observe } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n delete<TypeResponse, TypeParams = any>(path: string, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.delete<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), { ...this.getOptions(params), observe: observe } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n public sendWithFile<TypeResponse, TypeParams = any, TypeBody = any>(\n path: string,\n params: UtilsHttpParamsRequest<TypeParams>,\n argumentsValue: { method: TYPE_METHOD; bodyData: TypeBody; keepFileOfBody?: boolean; keepArrayValue?: boolean; processUpload?: (process: IHttpProcessUpload) => void }\n ): Observable<IHttpResponse<TypeResponse>> {\n const { method, keepFileOfBody, keepArrayValue, processUpload } = argumentsValue;\n const bodyData = omitBy<Record<string, any>>(argumentsValue.bodyData as any, (dataItem: any) => isNil(dataItem));\n\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, resultCheckPageZero.params);\n const url = normalizeUrl(result.url);\n const options = this.getOptions(result.params);\n\n return new Observable((observer: Observer<IHttpResponse<TypeResponse>>) => {\n const formData: FormData = argumentsValue.bodyData instanceof FormData ? argumentsValue.bodyData : new FormData();\n const xhr: XMLHttpRequest = new XMLHttpRequest();\n const paramsStr = options.params.toString();\n const headers = options.headers;\n\n if (processUpload) {\n xhr.upload.onprogress = (e) => {\n processUpload({\n loaded: e.loaded,\n total: e.total,\n percent: (e.loaded / e.total) * 100,\n });\n };\n }\n\n if (!(argumentsValue.bodyData instanceof FormData)) {\n for (const property in bodyData) {\n this.appendRecursive(formData, bodyData[property], property, keepFileOfBody, keepArrayValue);\n }\n }\n const queryStr = paramsStr ? `?${paramsStr}` : '';\n xhr.open(method, `${url}${queryStr}`, true);\n headers.keys().forEach((key: string) => key.toLocaleLowerCase() !== 'content-type' && xhr.setRequestHeader(key, headers.get(key) || ''));\n xhr.send(formData);\n xhr.onreadystatechange = () => {\n if (xhr.readyState !== 4) {\n return;\n }\n if (xhr.status === 200) {\n observer.next(this.handlerResponse<TypeResponse>(this.convertResponseXHR<TypeResponse>(xhr), resultCheckPageZero.isStartZero, 'body'));\n\n return observer.complete();\n }\n observer.error(this.convertResponseXHR<TypeResponse>(xhr));\n\n return observer.complete();\n };\n });\n }\n\n private appendRecursive<TypeBody>(fData: FormData, data: TypeBody, prop: string, keepFileOfBody?: boolean, keepArrayValue?: boolean) {\n if (keepFileOfBody) {\n if (data instanceof File || data instanceof Blob || Object.prototype.toString.call(data) === '[object File]') {\n this.appendFileToFormData(fData, prop, data as File);\n\n return;\n }\n if (data instanceof Array && data.length && data[0] instanceof File) {\n for (const file of data) {\n this.appendFileToFormData(fData, prop, file);\n }\n\n return;\n }\n }\n if (keepArrayValue && data instanceof Array) {\n fData.append(prop, JSON.stringify(data));\n\n return;\n }\n if ('object' === typeof data) {\n fData.append(prop, JSON.stringify(data));\n\n return;\n }\n fData.append(prop, data as any);\n }\n\n private appendFileToFormData(formData: FormData, prop: string, file: File) {\n formData.append(prop, file, file.name);\n }\n\n private convertResponseXHR<TypeResponse>(_xhr: XMLHttpRequest): IHttpResponse<TypeResponse> {\n const XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\n let code: number = _xhr.status === 1223 ? 204 : _xhr.status;\n let message = _xhr.statusText;\n let data: any = null;\n\n if (code !== 204) {\n data = typeof _xhr.response === 'undefined' ? _xhr.responseText : _xhr.response;\n if (typeof data === 'string') {\n data = data.replace(XSSI_PREFIX, '');\n }\n }\n\n if (code === 0) {\n code = data ? 200 : 0;\n }\n if (data) {\n data = JSON.parse(data);\n code = data.code ?? 200;\n message = data.message || message;\n }\n\n message = message ?? 'OK';\n\n return { ...data, code, message };\n }\n\n public getResponseURL(xhr: any): string {\n if ('responseURL' in xhr) {\n return xhr.responseURL;\n }\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL');\n }\n\n return '';\n }\n\n protected checkStartPageIsZero<TypeParams>(params?: UtilsHttpParamsRequest<TypeParams>): { params: UtilsHttpParamsRequest<TypeParams>; isStartZero: boolean } {\n if (!params) {\n return { params: new UtilsHttpParamsRequest(), isStartZero: false };\n }\n if (params.has(DEFAULT_START_PAGE_0) || this.isStartZeroPage) {\n params.delete(DEFAULT_START_PAGE_0);\n const page = params.get('page') ? Number(params.get('page')) : -1;\n\n if (isNil(page) || page === -1) {\n return { params: params, isStartZero: false };\n }\n params.set('page', page - 1);\n\n return { params: params, isStartZero: true };\n }\n\n return { params: params, isStartZero: false };\n }\n\n protected handlerResponse<TypeResponse>(res: any, isPageStartZero: boolean, observe: 'response' | 'body'): IHttpResponse<TypeResponse> {\n const resConvert: any = {\n code: 200,\n };\n if (observe === 'response') {\n resConvert.statusCodeHttp = res.status;\n res = res.body;\n }\n resConvert.message = get(res, 'message');\n const code = get(res, 'code', 200);\n if (`${code}` !== '200' && `${code}` !== '001') {\n resConvert.feCloneCode = code;\n }\n\n if (typeof res !== 'object' || res === null) {\n resConvert['data'] = res;\n return resConvert;\n }\n\n const paging: IPaging = {\n page: get(res, 'paging.page') || get(res, 'page') || 0,\n per_page: get(res, 'paging.per_page') || get(res, 'size') || 0,\n total_items: get(res, 'paging.total_items') || get(res, 'paging.total_count') || get(res, 'paging.total_item') || get(res, 'totalElements') || 0,\n total_pages: get(res, 'paging.total_pages') || get(res, 'paging.total_page') || get(res, 'paging.page_count') || get(res, 'paging.page_count') || get(res, 'totalPages') || 0,\n before: get(res, 'paging.cursors.before') || get(res, 'paging.before') || get(res, 'cursors.before') || get(res, 'paging.before_token') || get(res, 'paging.cursors.before_token'),\n after: get(res, 'paging.cursors.after') || get(res, 'paging.after') || get(res, 'cursors.after') || get(res, 'paging.after_token') || get(res, 'paging.cursors.after_token'),\n previous: get(res, 'paging.previous') || get(res, 'paging.cursors.previous') || get(res, 'cursors.previous'),\n next: get(res, 'paging.next') || get(res, 'paging.next_page') || get(res, 'paging.cursors.next') || get(res, 'cursors.next'),\n };\n const keysPaging = Object.keys(paging);\n\n keysPaging.forEach((key: string) => {\n if (isNil((paging as any)[key])) {\n delete (paging as any)[key];\n }\n });\n\n if (Object.keys(paging).length) {\n if (isPageStartZero && !this.ignoreAutoIncrementPageIsStartZeroPage && !isNil(paging.page)) {\n paging.page += 1;\n }\n if (paging.total_items && paging.page && paging.per_page && paging.page * paging.per_page >= paging.total_items) {\n paging.total_pages = paging.page;\n }\n if (resConvert.data instanceof Array && !resConvert.data.length) {\n paging.total_pages = paging.page || 0;\n }\n resConvert.paging = paging;\n }\n const fieldDelete = ['code', 'message', 'paging', 'totalElements', 'size', 'totalPages', 'page'];\n\n fieldDelete.forEach((field) => {\n if (!isNil(res[field])) {\n delete res[field];\n }\n });\n const fieldNotMergeToData = ['lang'];\n\n fieldNotMergeToData.forEach((field) => {\n if (!isNil(res[field])) {\n resConvert[field] = res[field];\n delete res[field];\n }\n });\n const keys = Object.keys(res);\n\n if (keys.length === 1) {\n resConvert.data = keys[0] === '0' ? res : res[keys[0]];\n }\n if (keys.length > 1) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n isNil(res.data) ? (resConvert.data = res) : Object.assign(resConvert, res);\n }\n\n return resConvert;\n }\n\n protected handlerCatchError<TypeResponse>(err: HttpErrorResponse): Observable<IHttpResponse<TypeResponse>> {\n if (err.status === HttpStatusCode.Unauthorized && !this.ignoreRedirect401) {\n this.redirectToLogin();\n }\n const code = get<any>(err, 'error.code', get<any>(err, 'status', 0 as any));\n const message = code >= 100 && code < 500 ? err?.error?.message || err?.message || 'i18n_alert_connect_server_error' : 'i18n_alert_connect_server_error';\n const data = get<any>(err, 'error.data', '' as any);\n\n const errorObj = Object.assign(new Error(message), { code: code >= 100 && code < 500 ? code : 500, message, subMessage: get<any>(err, 'error.errors', get<any>(err, 'errors')), data: data, rootError: err });\n throw errorObj;\n }\n\n /**\n * Lưu trữ dữ liệu phản hồi vào cache.\n * @param observable - Observable của phản hồi HTTP.\n * @param key - Khóa cache.Lưu ý không md5 key trước khi truyền vào\n * @param params - Các tham số để tạo khóa cache.\n * @param timeCache - Thời gian lưu trữ cache (mặc định là CACHE_EXPIRE_TIME_DEFAULT).\n * @param reloadCache - Nếu true, luôn gọi để lấy giá trị mới. giá trị này có để sử dụng với các nghiệp vụ gọi luôn luôn lấy dữ liệu mới nhất\n * @returns Observable của phản hồi HTTP đã được cache.\n */\n public cacheIndexDB<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false): Observable<IHttpResponse<T>> {\n return defer(() => {\n const paramsNormalize = Array.isArray(params) ? [...params] : [params];\n paramsNormalize.push(this.keyCacheUniqueByIdUserLogin);\n const keyCache = getKeyCacheByArrayObject(key, paramsNormalize);\n\n const deleteCache: Observable<any> = reloadCache ? from(this.deleteCacheKeyStartWidth(key)) : of(null);\n\n return deleteCache.pipe(\n switchMap(() => from(UtilsCache.GetAsync(keyCache, undefined, true))),\n switchMap((data) => {\n if (data) {\n return of(data as IHttpResponse<T>);\n }\n\n return observable.pipe(\n tap((result) => {\n if (result && result.data) {\n // Lưu cache cho kết quả hợp lệ\n UtilsCache.SetAsync(keyCache, cloneDeep(result), timeCache, true);\n }\n })\n );\n })\n );\n });\n }\n\n /**\n * Lưu trữ dữ liệu phản hồi vào cache.\n * @deprecated sử dụng ```cacheIndexDB``` function\n */\n public cacheResponseData<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false): Observable<IHttpResponse<T>> {\n return from(this.promiseCacheResponseData(observable, key, params, timeCache, reloadCache));\n }\n\n /**\n * Xóa các khóa cache bắt đầu với một chuỗi nhất định.\n * Lưu ý: không md5 key trước khi truyền vào.\n * Sử dụng hàm này trong các trường hợp như gọi API update hoặc xóa dữ liệu,khi đó cần xóa cache đi để khi gọi danh sách sẽ lấy được giá trị mới nhất.\n * @param key - Chuỗi khóa cache cần xóa.\n */\n public async deleteCacheKeyStartWidth(key: string) {\n return await UtilsCache.DeleteKeyStartWithAsync(md5(key), true);\n }\n\n private async promiseCacheResponseData<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false): Promise<IHttpResponse<T>> {\n params = Array.isArray(params) ? params : [params];\n params.push(this.keyCacheUniqueByIdUserLogin);\n\n const keyCache = getKeyCacheByArrayObject(key, params);\n if (reloadCache) {\n await this.deleteCacheKeyStartWidth(key);\n }\n const data = await UtilsCache.GetAsync(keyCache, undefined, true);\n\n if (data) {\n return data;\n }\n const result = await lastValueFrom(observable);\n\n if (result && result.data) {\n UtilsCache.SetAsync(keyCache, result, timeCache, true);\n }\n\n return result;\n }\n\n private getObserveResponse(params: UtilsHttpParamsRequest<any>): TYPE_OBSERVE_RESPONSE {\n const observeResponseParams = params.get('observeResponse');\n if (observeResponseParams) {\n params.delete('observeResponse');\n }\n if (observeResponseParams === 'response' || observeResponseParams === 'body') {\n return observeResponseParams as TYPE_OBSERVE_RESPONSE;\n }\n return this.observeResponse;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libs-ui-services-base-request-abstract.mjs","sources":["../../../../../libs-ui/services/base-request-abstract/src/base-request-abstract.service.ts","../../../../../libs-ui/services/base-request-abstract/src/libs-ui-services-base-request-abstract.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpStatusCode } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { IHttpProcessUpload, IHttpResponse, IPaging, TYPE_OBJECT } from '@libs-ui/interfaces-types';\nimport { cloneDeep, DEFAULT_START_PAGE_0, endCodeUrl, get, getKeyCacheByArrayObject, isNil, md5, normalizeUrl, omitBy, UtilsCache, UtilsHttpParamsRequest, UtilsHttpParamsRequestInstance } from '@libs-ui/utils';\nimport { defer, from, lastValueFrom, Observable, of } from 'rxjs';\nimport { Observer } from 'rxjs/internal/types';\nimport { catchError, map, switchMap, tap } from 'rxjs/operators';\ntype TYPE_METHOD = 'POST' | 'PATCH' | 'PUT';\n\nexport type TYPE_OBSERVE_RESPONSE = 'response' | 'body';\n\nexport abstract class LibsUiBaseRequestAbstractService {\n protected keyCacheUniqueByIdUserLogin = '';\n protected baseUrl!: string;\n protected ignoreRedirect401?: boolean;\n protected http = inject(HttpClient);\n protected isStartZeroPage = false;\n protected ignoreAutoIncrementPageIsStartZeroPage = false;\n protected observeResponse: TYPE_OBSERVE_RESPONSE = 'body';\n\n protected abstract getOptions<TypeParams>(httpParams: UtilsHttpParamsRequest<TypeParams>, contentType?: string): { headers: HttpHeaders; params: HttpParams };\n protected abstract redirectToLogin(): void;\n protected abstract replaceURLByPattern<TypeParams>(url: string, params: UtilsHttpParamsRequest<TypeParams>): { url: string; params: UtilsHttpParamsRequest<TypeParams> };\n\n get<TypeResponse, TypeParams = any>(path: string, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.get<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), { ...this.getOptions(params), observe: observe } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n post<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.post<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), body, { ...this.getOptions(params), observe: observe } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n postUrlEndCode<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const bodyValue = endCodeUrl(body as TYPE_OBJECT, true);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.post<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), bodyValue, { ...this.getOptions(params, 'application/x-www-form-urlencoded'), observe: this.observeResponse } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n put<TypeResponse, TypeParams = any, TypeBody = any>(path: string, body: TypeBody, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.put<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), body, { ...this.getOptions(params), observe: this.observeResponse } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n patch<TypeResponse, TypeParams = any>(path: string, body: unknown, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.patch<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), body, { ...this.getOptions(params), observe: observe } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n patchUrlEndCode<TypeResponse, TypeParams = any>(path: string, body: unknown, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const bodyValue = endCodeUrl(body as TYPE_OBJECT, true);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.patch<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), bodyValue, { ...this.getOptions(params, 'application/x-www-form-urlencoded'), observe: observe } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n delete<TypeResponse, TypeParams = any>(path: string, params?: UtilsHttpParamsRequest<TypeParams>) {\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const observe = this.getObserveResponse(params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, params);\n\n return this.http.delete<IHttpResponse<TypeResponse>>(normalizeUrl(result.url), { ...this.getOptions(params), observe: observe } as any).pipe(\n map((res: any) => this.handlerResponse<TypeResponse>(res, resultCheckPageZero.isStartZero, observe)),\n catchError((err: any) => this.handlerCatchError<TypeResponse>(err))\n );\n }\n\n public sendWithFile<TypeResponse, TypeParams = any, TypeBody = any>(\n path: string,\n params: UtilsHttpParamsRequest<TypeParams>,\n argumentsValue: { method: TYPE_METHOD; bodyData: TypeBody; keepFileOfBody?: boolean; keepArrayValue?: boolean; processUpload?: (process: IHttpProcessUpload) => void }\n ): Observable<IHttpResponse<TypeResponse>> {\n const { method, keepFileOfBody, keepArrayValue, processUpload } = argumentsValue;\n const bodyData = omitBy<Record<string, any>>(argumentsValue.bodyData as any, (dataItem: any) => isNil(dataItem));\n\n params = UtilsHttpParamsRequestInstance(undefined, params);\n const resultCheckPageZero = this.checkStartPageIsZero<TypeParams>(params);\n\n const result = this.replaceURLByPattern<TypeParams>(`${this.baseUrl}${path || ''}`, resultCheckPageZero.params);\n const url = normalizeUrl(result.url);\n const options = this.getOptions(result.params);\n\n return new Observable((observer: Observer<IHttpResponse<TypeResponse>>) => {\n const formData: FormData = argumentsValue.bodyData instanceof FormData ? argumentsValue.bodyData : new FormData();\n const xhr: XMLHttpRequest = new XMLHttpRequest();\n const paramsStr = options.params.toString();\n const headers = options.headers;\n\n if (processUpload) {\n xhr.upload.onprogress = (e) => {\n processUpload({\n loaded: e.loaded,\n total: e.total,\n percent: (e.loaded / e.total) * 100,\n });\n };\n }\n\n if (!(argumentsValue.bodyData instanceof FormData)) {\n for (const property in bodyData) {\n this.appendRecursive(formData, bodyData[property], property, keepFileOfBody, keepArrayValue);\n }\n }\n const queryStr = paramsStr ? `?${paramsStr}` : '';\n xhr.open(method, `${url}${queryStr}`, true);\n headers.keys().forEach((key: string) => key.toLocaleLowerCase() !== 'content-type' && xhr.setRequestHeader(key, headers.get(key) || ''));\n xhr.send(formData);\n xhr.onreadystatechange = () => {\n if (xhr.readyState !== 4) {\n return;\n }\n if (xhr.status === 200) {\n observer.next(this.handlerResponse<TypeResponse>(this.convertResponseXHR<TypeResponse>(xhr), resultCheckPageZero.isStartZero, 'body'));\n\n return observer.complete();\n }\n observer.error(this.convertResponseXHR<TypeResponse>(xhr));\n\n return observer.complete();\n };\n });\n }\n\n private appendRecursive<TypeBody>(fData: FormData, data: TypeBody, prop: string, keepFileOfBody?: boolean, keepArrayValue?: boolean) {\n if (keepFileOfBody) {\n if (data instanceof File || data instanceof Blob || Object.prototype.toString.call(data) === '[object File]') {\n this.appendFileToFormData(fData, prop, data as File);\n\n return;\n }\n if (data instanceof Array && data.length && data[0] instanceof File) {\n for (const file of data) {\n this.appendFileToFormData(fData, prop, file);\n }\n\n return;\n }\n }\n if (keepArrayValue && data instanceof Array) {\n fData.append(prop, JSON.stringify(data));\n\n return;\n }\n if ('object' === typeof data) {\n fData.append(prop, JSON.stringify(data));\n\n return;\n }\n fData.append(prop, data as any);\n }\n\n private appendFileToFormData(formData: FormData, prop: string, file: File) {\n formData.append(prop, file, file.name);\n }\n\n private convertResponseXHR<TypeResponse>(_xhr: XMLHttpRequest): IHttpResponse<TypeResponse> {\n const XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\n let code: number = _xhr.status === 1223 ? 204 : _xhr.status;\n let message = _xhr.statusText;\n let data: any = null;\n\n if (code !== 204) {\n data = typeof _xhr.response === 'undefined' ? _xhr.responseText : _xhr.response;\n if (typeof data === 'string') {\n data = data.replace(XSSI_PREFIX, '');\n }\n }\n\n if (code === 0) {\n code = data ? 200 : 0;\n }\n if (data) {\n data = JSON.parse(data);\n code = data.code ?? 200;\n message = data.message || message;\n }\n\n message = message ?? 'OK';\n\n return { ...data, code, message };\n }\n\n public getResponseURL(xhr: any): string {\n if ('responseURL' in xhr) {\n return xhr.responseURL;\n }\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL');\n }\n\n return '';\n }\n\n protected checkStartPageIsZero<TypeParams>(params?: UtilsHttpParamsRequest<TypeParams>): { params: UtilsHttpParamsRequest<TypeParams>; isStartZero: boolean } {\n if (!params) {\n return { params: new UtilsHttpParamsRequest(), isStartZero: false };\n }\n if (params.has(DEFAULT_START_PAGE_0) || this.isStartZeroPage) {\n params.delete(DEFAULT_START_PAGE_0);\n const page = params.get('page') ? Number(params.get('page')) : -1;\n\n if (isNil(page) || page === -1) {\n return { params: params, isStartZero: false };\n }\n params.set('page', page - 1);\n\n return { params: params, isStartZero: true };\n }\n\n return { params: params, isStartZero: false };\n }\n\n protected handlerResponse<TypeResponse>(res: any, isPageStartZero: boolean, observe: 'response' | 'body'): IHttpResponse<TypeResponse> {\n const resConvert: any = {\n code: 200,\n };\n if (observe === 'response') {\n resConvert.statusCodeHttp = res.status;\n res = res.body;\n }\n resConvert.message = get(res, 'message');\n const code = get(res, 'code', 200);\n if (`${code}` !== '200' && `${code}` !== '001') {\n resConvert.feCloneCode = code;\n }\n\n if (typeof res !== 'object' || res === null) {\n resConvert['data'] = res;\n return resConvert;\n }\n\n const paging: IPaging = {\n page: get(res, 'paging.page') || get(res, 'page') || 0,\n per_page: get(res, 'paging.per_page') || get(res, 'size') || 0,\n total_items: get(res, 'paging.total_items') || get(res, 'paging.total_count') || get(res, 'paging.total_item') || get(res, 'totalElements') || 0,\n total_pages: get(res, 'paging.total_pages') || get(res, 'paging.total_page') || get(res, 'paging.page_count') || get(res, 'paging.page_count') || get(res, 'totalPages') || 0,\n before: get(res, 'paging.cursors.before') || get(res, 'paging.before') || get(res, 'cursors.before') || get(res, 'paging.before_token') || get(res, 'paging.cursors.before_token'),\n after: get(res, 'paging.cursors.after') || get(res, 'paging.after') || get(res, 'cursors.after') || get(res, 'paging.after_token') || get(res, 'paging.cursors.after_token'),\n previous: get(res, 'paging.previous') || get(res, 'paging.cursors.previous') || get(res, 'cursors.previous'),\n next: get(res, 'paging.next') || get(res, 'paging.next_page') || get(res, 'paging.cursors.next') || get(res, 'cursors.next'),\n };\n const keysPaging = Object.keys(paging);\n\n keysPaging.forEach((key: string) => {\n if (isNil((paging as any)[key])) {\n delete (paging as any)[key];\n }\n });\n\n if (Object.keys(paging).length) {\n if (isPageStartZero && !this.ignoreAutoIncrementPageIsStartZeroPage && !isNil(paging.page)) {\n paging.page += 1;\n }\n if (paging.total_items && paging.page && paging.per_page && paging.page * paging.per_page >= paging.total_items) {\n paging.total_pages = paging.page;\n }\n if (resConvert.data instanceof Array && !resConvert.data.length) {\n paging.total_pages = paging.page || 0;\n }\n resConvert.paging = paging;\n }\n const fieldDelete = ['code', 'message', 'paging', 'totalElements', 'size', 'totalPages', 'page'];\n\n fieldDelete.forEach((field) => {\n if (!isNil(res[field])) {\n delete res[field];\n }\n });\n const fieldNotMergeToData = ['lang'];\n\n fieldNotMergeToData.forEach((field) => {\n if (!isNil(res[field])) {\n resConvert[field] = res[field];\n delete res[field];\n }\n });\n const keys = Object.keys(res);\n\n if (keys.length === 1) {\n resConvert.data = keys[0] === '0' ? res : res[keys[0]];\n }\n if (keys.length > 1) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n isNil(res.data) ? (resConvert.data = res) : Object.assign(resConvert, res);\n }\n\n return resConvert;\n }\n\n protected handlerCatchError<TypeResponse>(err: HttpErrorResponse): Observable<IHttpResponse<TypeResponse>> {\n if (err.status === HttpStatusCode.Unauthorized && !this.ignoreRedirect401) {\n this.redirectToLogin();\n }\n const code = get<any>(err, 'error.code', get<any>(err, 'status', 0 as any));\n const message = code >= 100 && code < 500 ? err?.error?.message || err?.message || 'i18n_alert_connect_server_error' : 'i18n_alert_connect_server_error';\n const data = get<any>(err, 'error.data', '' as any);\n\n const errorObj = Object.assign(new Error(message), { code: code >= 100 && code < 500 ? code : 500, message, subMessage: get<any>(err, 'error.errors', get<any>(err, 'errors')), data: data, rootError: err });\n throw errorObj;\n }\n\n /**\n * Lưu trữ dữ liệu phản hồi vào cache.\n * @param observable - Observable của phản hồi HTTP.\n * @param key - Khóa cache.Lưu ý không md5 key trước khi truyền vào\n * @param params - Các tham số để tạo khóa cache.\n * @param timeCache - Thời gian lưu trữ cache (mặc định là CACHE_EXPIRE_TIME_DEFAULT).\n * @param reloadCache - Nếu true, luôn gọi để lấy giá trị mới. giá trị này có để sử dụng với các nghiệp vụ gọi luôn luôn lấy dữ liệu mới nhất\n * @returns Observable của phản hồi HTTP đã được cache.\n */\n public cacheIndexDB<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false): Observable<IHttpResponse<T>> {\n return defer(() => {\n const paramsNormalize = Array.isArray(params) ? [...params] : [params];\n paramsNormalize.push(this.keyCacheUniqueByIdUserLogin);\n const keyCache = getKeyCacheByArrayObject(key, paramsNormalize);\n\n const deleteCache: Observable<any> = reloadCache ? from(this.deleteCacheKeyStartWidth(key)) : of(null);\n\n return deleteCache.pipe(\n switchMap(() => from(UtilsCache.GetAsync(keyCache, undefined, true))),\n switchMap((data) => {\n if (data) {\n return of(data as IHttpResponse<T>);\n }\n\n return observable.pipe(\n tap((result) => {\n if (result && result.data) {\n // Lưu cache cho kết quả hợp lệ\n UtilsCache.SetAsync(keyCache, cloneDeep(result), timeCache, true);\n }\n })\n );\n })\n );\n });\n }\n\n /**\n * Lưu trữ dữ liệu phản hồi vào cache.\n * @deprecated sử dụng ```cacheIndexDB``` function\n */\n public cacheResponseData<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false): Observable<IHttpResponse<T>> {\n return from(this.promiseCacheResponseData(observable, key, params, timeCache, reloadCache));\n }\n\n /**\n * Xóa các khóa cache bắt đầu với một chuỗi nhất định.\n * Lưu ý: không md5 key trước khi truyền vào.\n * Sử dụng hàm này trong các trường hợp như gọi API update hoặc xóa dữ liệu,khi đó cần xóa cache đi để khi gọi danh sách sẽ lấy được giá trị mới nhất.\n * @param key - Chuỗi khóa cache cần xóa.\n */\n public async deleteCacheKeyStartWidth(key: string) {\n return await UtilsCache.DeleteKeyStartWithAsync(md5(key), true);\n }\n\n private async promiseCacheResponseData<T>(observable: Observable<IHttpResponse<T>>, key: string, params: Array<any>, timeCache = UtilsCache.CACHE_EXPIRE_TIME_DEFAULT, reloadCache = false): Promise<IHttpResponse<T>> {\n params = Array.isArray(params) ? params : [params];\n params.push(this.keyCacheUniqueByIdUserLogin);\n\n const keyCache = getKeyCacheByArrayObject(key, params);\n if (reloadCache) {\n await this.deleteCacheKeyStartWidth(key);\n }\n const data = await UtilsCache.GetAsync(keyCache, undefined, true);\n\n if (data) {\n return data;\n }\n const result = await lastValueFrom(observable);\n\n if (result && result.data) {\n UtilsCache.SetAsync(keyCache, result, timeCache, true);\n }\n\n return result;\n }\n\n private getObserveResponse(params: UtilsHttpParamsRequest<any>): TYPE_OBSERVE_RESPONSE {\n const observeResponseParams = params.get('observeResponse');\n if (observeResponseParams) {\n params.delete('observeResponse');\n }\n if (observeResponseParams === 'response' || observeResponseParams === 'body') {\n return observeResponseParams as TYPE_OBSERVE_RESPONSE;\n }\n return this.observeResponse;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@libs-ui/services-base-request-abstract",
3
- "version": "0.2.356-41",
3
+ "version": "0.2.356-43",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=18.0.0",
6
6
  "@angular/core": ">=18.0.0",
7
- "@libs-ui/interfaces-types": "0.2.356-41",
8
- "@libs-ui/utils": "0.2.356-41",
7
+ "@libs-ui/interfaces-types": "0.2.356-43",
8
+ "@libs-ui/utils": "0.2.356-43",
9
9
  "rxjs": "~7.8.0"
10
10
  },
11
11
  "sideEffects": false,