@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
|
-
#
|
|
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:
|
|
3
|
+
> Abstract base class cung cấp toàn bộ infrastructure cho HTTP requests trong Angular: chuẩn hóa response, xử lý lỗi tự động, caching IndexedDB, upload file với progress tracking và 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 đủ:
|
|
8
|
-
- ✅ URL-encoded form: `postUrlEndCode`, `patchUrlEndCode` (
|
|
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ợ
|
|
11
|
-
- ✅ Pagination
|
|
12
|
-
- ✅ Error handling: 401 → auto redirect, phân biệt 4xx vs 5xx
|
|
13
|
-
- ✅ Caching với IndexedDB (`cacheIndexDB`) — phân
|
|
14
|
-
- ✅ Page zero conversion (`isStartZeroPage`) — UI 1-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
|
-
##
|
|
44
|
+
## Ví dụ sử dụng
|
|
29
45
|
|
|
30
|
-
###
|
|
46
|
+
### Ví 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
|
-
|
|
60
|
+
private readonly router = inject(Router);
|
|
61
|
+
|
|
62
|
+
constructor() {
|
|
44
63
|
super();
|
|
45
|
-
|
|
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 =
|
|
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
|
-
###
|
|
102
|
+
### Ví 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
|
|
84
|
-
|
|
85
|
-
return this.get<
|
|
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
|
-
|
|
89
|
-
return this.
|
|
144
|
+
create(body: T_user_create_body) {
|
|
145
|
+
return this.post<T_user>('/users', body);
|
|
90
146
|
}
|
|
91
147
|
|
|
92
|
-
|
|
93
|
-
return this.
|
|
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
|
-
|
|
97
|
-
return this.
|
|
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
|
-
|
|
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
|
-
###
|
|
162
|
+
### Ví dụ 3 — Caching dữ liệu với IndexedDB
|
|
107
163
|
|
|
108
164
|
```typescript
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
###
|
|
194
|
+
### Ví dụ 4 — Upload file với progress tracking
|
|
124
195
|
|
|
125
196
|
```typescript
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
237
|
+
### Ví 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
|
-
|
|
274
|
+
### Ví dụ 6 — Form URL-encoded (postUrlEndCode)
|
|
140
275
|
|
|
141
|
-
|
|
276
|
+
Dùng khi backend yêu cầu `Content-Type: application/x-www-form-urlencoded`:
|
|
142
277
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
283
|
+
export type T_login_body = { username: string; password: string };
|
|
284
|
+
export type T_auth_response = { accessToken: string; refreshToken: string };
|
|
150
285
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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 vì JSON
|
|
290
|
+
return this.postUrlEndCode<T_auth_response>('/auth/login', body);
|
|
291
|
+
}
|
|
164
292
|
|
|
165
|
-
|
|
293
|
+
refreshToken(refreshToken: string) {
|
|
294
|
+
return this.postUrlEndCode<T_auth_response>('/auth/refresh', { refreshToken });
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
```
|
|
166
298
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
|
172
|
-
|
|
173
|
-
| `
|
|
299
|
+
## Methods
|
|
300
|
+
|
|
301
|
+
### Abstract Methods (bắt buộc implement trong subclass)
|
|
302
|
+
|
|
303
|
+
| Method | Signature | Mô 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
|
-
|
|
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
|
-
|
|
179
|
-
|
|
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?:
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
|
|
208
|
-
|
|
209
|
-
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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,
|
|
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":";;;;;;AAAA;MAYsB,gCAAgC,CAAA;IAC1C,2BAA2B,GAAG,EAAE,CAAC;AACjC,IAAA,OAAO,CAAU;AACjB,IAAA,iBAAiB,CAAW;AAC5B,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1B,eAAe,GAAG,KAAK,CAAC;IACxB,sCAAsC,GAAG,KAAK,CAAC;IAC/C,eAAe,GAA0B,MAAM,CAAC;IAM1D,GAAG,CAAiC,IAAY,EAAE,MAA2C,EAAA;AAC3F,QAAA,MAAM,GAAG,8BAA8B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAa,MAAM,CAAC,CAAC;AAC1E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAa,GAAG,IAAI,CAAC,OAAO,CAAA,EAAG,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAE5F,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA8B,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAS,CAAC,CAAC,IAAI,CACvI,GAAG,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,eAAe,CAAe,GAAG,EAAE,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EACpG,UAAU,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,iBAAiB,CAAe,GAAG,CAAC,CAAC,CACpE,CAAC;KACH;AAED,IAAA,IAAI,CAAiD,IAAY,EAAE,IAAc,EAAE,MAA2C,EAAA;AAC5H,QAAA,MAAM,GAAG,8BAA8B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAa,MAAM,CAAC,CAAC;AAC1E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAa,GAAG,IAAI,CAAC,OAAO,CAAA,EAAG,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAE5F,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAA8B,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAS,CAAC,CAAC,IAAI,CAC9I,GAAG,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,eAAe,CAAe,GAAG,EAAE,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EACpG,UAAU,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,iBAAiB,CAAe,GAAG,CAAC,CAAC,CACpE,CAAC;KACH;AAED,IAAA,cAAc,CAAiD,IAAY,EAAE,IAAc,EAAE,MAA2C,EAAA;AACtI,QAAA,MAAM,GAAG,8BAA8B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAa,MAAM,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,UAAU,CAAC,IAAmB,EAAE,IAAI,CAAC,CAAC;AACxD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAa,GAAG,IAAI,CAAC,OAAO,CAAA,EAAG,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAE5F,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAA8B,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,mCAAmC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAS,CAAC,CAAC,IAAI,CACrM,GAAG,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,eAAe,CAAe,GAAG,EAAE,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EACpG,UAAU,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,iBAAiB,CAAe,GAAG,CAAC,CAAC,CACpE,CAAC;KACH;AAED,IAAA,GAAG,CAAiD,IAAY,EAAE,IAAc,EAAE,MAA2C,EAAA;AAC3H,QAAA,MAAM,GAAG,8BAA8B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAa,MAAM,CAAC,CAAC;AAC1E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAa,GAAG,IAAI,CAAC,OAAO,CAAA,EAAG,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAE5F,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAA8B,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAS,CAAC,CAAC,IAAI,CAC1J,GAAG,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,eAAe,CAAe,GAAG,EAAE,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EACpG,UAAU,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,iBAAiB,CAAe,GAAG,CAAC,CAAC,CACpE,CAAC;KACH;AAED,IAAA,KAAK,CAAiC,IAAY,EAAE,IAAa,EAAE,MAA2C,EAAA;AAC5G,QAAA,MAAM,GAAG,8BAA8B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAa,MAAM,CAAC,CAAC;AAC1E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAa,GAAG,IAAI,CAAC,OAAO,CAAA,EAAG,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAE5F,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAA8B,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAS,CAAC,CAAC,IAAI,CAC/I,GAAG,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,eAAe,CAAe,GAAG,EAAE,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EACpG,UAAU,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,iBAAiB,CAAe,GAAG,CAAC,CAAC,CACpE,CAAC;KACH;AAED,IAAA,eAAe,CAAiC,IAAY,EAAE,IAAa,EAAE,MAA2C,EAAA;AACtH,QAAA,MAAM,GAAG,8BAA8B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAa,MAAM,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,UAAU,CAAC,IAAmB,EAAE,IAAI,CAAC,CAAC;AACxD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAa,GAAG,IAAI,CAAC,OAAO,CAAA,EAAG,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAE5F,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAA8B,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,mCAAmC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAS,CAAC,CAAC,IAAI,CACzL,GAAG,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,eAAe,CAAe,GAAG,EAAE,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EACpG,UAAU,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,iBAAiB,CAAe,GAAG,CAAC,CAAC,CACpE,CAAC;KACH;IAED,MAAM,CAAiC,IAAY,EAAE,MAA2C,EAAA;AAC9F,QAAA,MAAM,GAAG,8BAA8B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAa,MAAM,CAAC,CAAC;AAC1E,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAa,GAAG,IAAI,CAAC,OAAO,CAAA,EAAG,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAE5F,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAA8B,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAS,CAAC,CAAC,IAAI,CAC1I,GAAG,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,eAAe,CAAe,GAAG,EAAE,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EACpG,UAAU,CAAC,CAAC,GAAQ,KAAK,IAAI,CAAC,iBAAiB,CAAe,GAAG,CAAC,CAAC,CACpE,CAAC;KACH;AAEM,IAAA,YAAY,CACjB,IAAY,EACZ,MAA0C,EAC1C,cAAsK,EAAA;QAEtK,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,cAAc,CAAC;AACjF,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAsB,cAAc,CAAC,QAAe,EAAE,CAAC,QAAa,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEjH,QAAA,MAAM,GAAG,8BAA8B,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAa,MAAM,CAAC,CAAC;QAE1E,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAa,CAAA,EAAG,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAE,CAAA,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAChH,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAE/C,QAAA,OAAO,IAAI,UAAU,CAAC,CAAC,QAA+C,KAAI;AACxE,YAAA,MAAM,QAAQ,GAAa,cAAc,CAAC,QAAQ,YAAY,QAAQ,GAAG,cAAc,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;AAClH,YAAA,MAAM,GAAG,GAAmB,IAAI,cAAc,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC5C,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAEhC,IAAI,aAAa,EAAE;gBACjB,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,KAAI;AAC5B,oBAAA,aAAa,CAAC;wBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;wBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,GAAG;AACpC,qBAAA,CAAC,CAAC;AACL,iBAAC,CAAC;aACH;YAED,IAAI,EAAE,cAAc,CAAC,QAAQ,YAAY,QAAQ,CAAC,EAAE;AAClD,gBAAA,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE;AAC/B,oBAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;iBAC9F;aACF;AACD,YAAA,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAI,CAAA,EAAA,SAAS,CAAE,CAAA,GAAG,EAAE,CAAC;AAClD,YAAA,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAE,EAAE,IAAI,CAAC,CAAC;AAC5C,YAAA,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,GAAW,KAAK,GAAG,CAAC,iBAAiB,EAAE,KAAK,cAAc,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACzI,YAAA,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACnB,YAAA,GAAG,CAAC,kBAAkB,GAAG,MAAK;AAC5B,gBAAA,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,EAAE;oBACxB,OAAO;iBACR;AACD,gBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;oBACtB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAe,IAAI,CAAC,kBAAkB,CAAe,GAAG,CAAC,EAAE,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvI,oBAAA,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;iBAC5B;gBACD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAe,GAAG,CAAC,CAAC,CAAC;AAE3D,gBAAA,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAC7B,aAAC,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;IAEO,eAAe,CAAW,KAAe,EAAE,IAAc,EAAE,IAAY,EAAE,cAAwB,EAAE,cAAwB,EAAA;QACjI,IAAI,cAAc,EAAE;YAClB,IAAI,IAAI,YAAY,IAAI,IAAI,IAAI,YAAY,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,eAAe,EAAE;gBAC5G,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAY,CAAC,CAAC;gBAErD,OAAO;aACR;AACD,YAAA,IAAI,IAAI,YAAY,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE;AACnE,gBAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;oBACvB,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC9C;gBAED,OAAO;aACR;SACF;AACD,QAAA,IAAI,cAAc,IAAI,IAAI,YAAY,KAAK,EAAE;AAC3C,YAAA,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAEzC,OAAO;SACR;AACD,QAAA,IAAI,QAAQ,KAAK,OAAO,IAAI,EAAE;AAC5B,YAAA,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAEzC,OAAO;SACR;AACD,QAAA,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAW,CAAC,CAAC;KACjC;AAEO,IAAA,oBAAoB,CAAC,QAAkB,EAAE,IAAY,EAAE,IAAU,EAAA;QACvE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;KACxC;AAEO,IAAA,kBAAkB,CAAe,IAAoB,EAAA;QAC3D,MAAM,WAAW,GAAG,cAAc,CAAC;AACnC,QAAA,IAAI,IAAI,GAAW,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;AAC5D,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;QAC9B,IAAI,IAAI,GAAQ,IAAI,CAAC;AAErB,QAAA,IAAI,IAAI,KAAK,GAAG,EAAE;AAChB,YAAA,IAAI,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC;AAChF,YAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBAC5B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;aACtC;SACF;AAED,QAAA,IAAI,IAAI,KAAK,CAAC,EAAE;YACd,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;SACvB;QACD,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxB,YAAA,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;AACxB,YAAA,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;SACnC;AAED,QAAA,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC;QAE1B,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;KACnC;AAEM,IAAA,cAAc,CAAC,GAAQ,EAAA;AAC5B,QAAA,IAAI,aAAa,IAAI,GAAG,EAAE;YACxB,OAAO,GAAG,CAAC,WAAW,CAAC;SACxB;QACD,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,EAAE;AACxD,YAAA,OAAO,GAAG,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;SAC/C;AAED,QAAA,OAAO,EAAE,CAAC;KACX;AAES,IAAA,oBAAoB,CAAa,MAA2C,EAAA;QACpF,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,EAAE,MAAM,EAAE,IAAI,sBAAsB,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;SACrE;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE;AAC5D,YAAA,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAElE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE;gBAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;aAC/C;YACD,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;YAE7B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;SAC9C;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;KAC/C;AAES,IAAA,eAAe,CAAe,GAAQ,EAAE,eAAwB,EAAE,OAA4B,EAAA;AACtG,QAAA,MAAM,UAAU,GAAQ;AACtB,YAAA,IAAI,EAAE,GAAG;SACV,CAAC;AACF,QAAA,IAAI,OAAO,KAAK,UAAU,EAAE;AAC1B,YAAA,UAAU,CAAC,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC;AACvC,YAAA,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;SAChB;QACD,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AACnC,QAAA,IAAI,CAAG,EAAA,IAAI,CAAE,CAAA,KAAK,KAAK,IAAI,CAAG,EAAA,IAAI,CAAE,CAAA,KAAK,KAAK,EAAE;AAC9C,YAAA,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC;SAC/B;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;AAC3C,YAAA,UAAU,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;AACzB,YAAA,OAAO,UAAU,CAAC;SACnB;AAED,QAAA,MAAM,MAAM,GAAY;AACtB,YAAA,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC;AACtD,YAAA,QAAQ,EAAE,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC;AAC9D,YAAA,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE,oBAAoB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,oBAAoB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,mBAAmB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC;AAChJ,YAAA,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE,oBAAoB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,mBAAmB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,mBAAmB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,mBAAmB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,CAAC;AAC7K,YAAA,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,uBAAuB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,qBAAqB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,6BAA6B,CAAC;AAClL,YAAA,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,sBAAsB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,oBAAoB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,4BAA4B,CAAC;YAC5K,QAAQ,EAAE,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,yBAAyB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC;YAC5G,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,qBAAqB,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC;SAC7H,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEvC,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAW,KAAI;YACjC,IAAI,KAAK,CAAE,MAAc,CAAC,GAAG,CAAC,CAAC,EAAE;AAC/B,gBAAA,OAAQ,MAAc,CAAC,GAAG,CAAC,CAAC;aAC7B;AACH,SAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE;AAC9B,YAAA,IAAI,eAAe,IAAI,CAAC,IAAI,CAAC,sCAAsC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AAC1F,gBAAA,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;aAClB;YACD,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE;AAC/G,gBAAA,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;aAClC;AACD,YAAA,IAAI,UAAU,CAAC,IAAI,YAAY,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE;gBAC/D,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;aACvC;AACD,YAAA,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;SAC5B;AACD,QAAA,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AAEjG,QAAA,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;AACtB,gBAAA,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;aACnB;AACH,SAAC,CAAC,CAAC;AACH,QAAA,MAAM,mBAAmB,GAAG,CAAC,MAAM,CAAC,CAAC;AAErC,QAAA,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;gBACtB,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;AAC/B,gBAAA,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;aACnB;AACH,SAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE9B,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SACxD;AACD,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;;YAEnB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;SAC5E;AAED,QAAA,OAAO,UAAU,CAAC;KACnB;AAES,IAAA,iBAAiB,CAAe,GAAsB,EAAA;AAC9D,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,cAAc,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACzE,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;AACD,QAAA,MAAM,IAAI,GAAG,GAAG,CAAM,GAAG,EAAE,YAAY,EAAE,GAAG,CAAM,GAAG,EAAE,QAAQ,EAAE,CAAQ,CAAC,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,iCAAiC,GAAG,iCAAiC,CAAC;QACzJ,MAAM,IAAI,GAAG,GAAG,CAAM,GAAG,EAAE,YAAY,EAAE,EAAS,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAM,GAAG,EAAE,cAAc,EAAE,GAAG,CAAM,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;AAC9M,QAAA,MAAM,QAAQ,CAAC;KAChB;AAED;;;;;;;;AAQG;AACI,IAAA,YAAY,CAAI,UAAwC,EAAE,GAAW,EAAE,MAAkB,EAAE,SAAS,GAAG,UAAU,CAAC,yBAAyB,EAAE,WAAW,GAAG,KAAK,EAAA;QACrK,OAAO,KAAK,CAAC,MAAK;YAChB,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACvE,YAAA,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAEhE,MAAM,WAAW,GAAoB,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AAEvG,YAAA,OAAO,WAAW,CAAC,IAAI,CACrB,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EACrE,SAAS,CAAC,CAAC,IAAI,KAAI;gBACjB,IAAI,IAAI,EAAE;AACR,oBAAA,OAAO,EAAE,CAAC,IAAwB,CAAC,CAAC;iBACrC;gBAED,OAAO,UAAU,CAAC,IAAI,CACpB,GAAG,CAAC,CAAC,MAAM,KAAI;AACb,oBAAA,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;;AAEzB,wBAAA,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;qBACnE;iBACF,CAAC,CACH,CAAC;aACH,CAAC,CACH,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AAED;;;AAGG;AACI,IAAA,iBAAiB,CAAI,UAAwC,EAAE,GAAW,EAAE,MAAkB,EAAE,SAAS,GAAG,UAAU,CAAC,yBAAyB,EAAE,WAAW,GAAG,KAAK,EAAA;AAC1K,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;KAC7F;AAED;;;;;AAKG;IACI,MAAM,wBAAwB,CAAC,GAAW,EAAA;AAC/C,QAAA,OAAO,MAAM,UAAU,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;KACjE;AAEO,IAAA,MAAM,wBAAwB,CAAI,UAAwC,EAAE,GAAW,EAAE,MAAkB,EAAE,SAAS,GAAG,UAAU,CAAC,yBAAyB,EAAE,WAAW,GAAG,KAAK,EAAA;AACxL,QAAA,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;AACnD,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAG,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvD,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;SAC1C;AACD,QAAA,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAElE,IAAI,IAAI,EAAE;AACR,YAAA,OAAO,IAAI,CAAC;SACb;AACD,QAAA,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;AAE/C,QAAA,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;YACzB,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;SACxD;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAEO,IAAA,kBAAkB,CAAC,MAAmC,EAAA;QAC5D,MAAM,qBAAqB,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC5D,IAAI,qBAAqB,EAAE;AACzB,YAAA,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;SAClC;QACD,IAAI,qBAAqB,KAAK,UAAU,IAAI,qBAAqB,KAAK,MAAM,EAAE;AAC5E,YAAA,OAAO,qBAA8C,CAAC;SACvD;QACD,OAAO,IAAI,CAAC,eAAe,CAAC;KAC7B;AACF;;AChbD;;AAEG;;;;"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/services-base-request-abstract",
|
|
3
|
-
"version": "0.2.356-
|
|
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-
|
|
8
|
-
"@libs-ui/utils": "0.2.356-
|
|
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,
|