@solidev/data 0.0.1-alpha.0
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 +7 -0
- package/esm2020/lib/auth/auth-interceptor.service.mjs +90 -0
- package/esm2020/lib/auth/auth.service.mjs +125 -0
- package/esm2020/lib/auth/jwt.mjs +21 -0
- package/esm2020/lib/data/data-backend.mjs +106 -0
- package/esm2020/lib/data/data-collection.mjs +109 -0
- package/esm2020/lib/data/data-collection.mock.mjs +39 -0
- package/esm2020/lib/data/data-model.mjs +287 -0
- package/esm2020/lib/data/data-parameters.mjs +34 -0
- package/esm2020/lib/data/data-query.mjs +147 -0
- package/esm2020/lib/data/data-query.mock.mjs +46 -0
- package/esm2020/lib/data/fields/base.mjs +142 -0
- package/esm2020/lib/data/fields/boolean.mjs +38 -0
- package/esm2020/lib/data/fields/datetime.mjs +124 -0
- package/esm2020/lib/data/fields/index.mjs +7 -0
- package/esm2020/lib/data/fields/numbers.mjs +38 -0
- package/esm2020/lib/data/fields/primaryfield.mjs +9 -0
- package/esm2020/lib/data/fields/relations.mjs +53 -0
- package/esm2020/lib/data/fields/stringfields.mjs +71 -0
- package/esm2020/lib/dispedit/choice.pipe.mjs +39 -0
- package/esm2020/lib/dispedit/dispedit/dispedit.component.mjs +475 -0
- package/esm2020/lib/dispedit/dispedit/dispedit.constants.mjs +2 -0
- package/esm2020/lib/dispedit/factor.pipe.mjs +48 -0
- package/esm2020/lib/dispedit/factorc.pipe.mjs +50 -0
- package/esm2020/lib/dispedit/fkselect/fkselect.component.mjs +142 -0
- package/esm2020/lib/dispedit/flags/flags.component.mjs +140 -0
- package/esm2020/lib/dispedit/m2mselect/m2mselect.component.mjs +318 -0
- package/esm2020/lib/dispedit/richedit/richedit.component.mjs +94 -0
- package/esm2020/lib/dispedit/sdelete/sdelete.component.mjs +46 -0
- package/esm2020/lib/messages/message-zone/message-zone.component.mjs +57 -0
- package/esm2020/lib/messages/message.service.mjs +151 -0
- package/esm2020/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.mjs +34 -0
- package/esm2020/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.mjs +63 -0
- package/esm2020/lib/modellist/model-list-fields/model-list-fields.mjs +225 -0
- package/esm2020/lib/modellist/model-list-filters/filters/filtertypes.mjs +3 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.mjs +108 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.mjs +28 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.mjs +24 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.mjs +9 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.mjs +40 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.mjs +14 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.mjs +40 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.mjs +14 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.mjs +21 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetimerange-filter.mjs +14 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.mjs +21 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.mjs +14 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/adapters/ban.mjs +24 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.mjs +63 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.mjs +16 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.mjs +46 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.mjs +49 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.mjs +57 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.mjs +35 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.mjs +49 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.mjs +15 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.mjs +40 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.mjs +14 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.mjs +21 -0
- package/esm2020/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.mjs +14 -0
- package/esm2020/lib/modellist/model-list-filters/model-list-filter.mjs +145 -0
- package/esm2020/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.mjs +50 -0
- package/esm2020/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.mjs +30 -0
- package/esm2020/lib/modellist/model-list-filters/model-list-filters.mjs +80 -0
- package/esm2020/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.mjs +70 -0
- package/esm2020/lib/modellist/model-list-paginator/model-list-paginator.mjs +47 -0
- package/esm2020/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.mjs +49 -0
- package/esm2020/lib/modellist/model-list-sorter/model-list-sorter.mjs +116 -0
- package/esm2020/lib/modellist/model-list.service.mjs +135 -0
- package/esm2020/lib/routing/breadcrumb/breadcrumb.component.mjs +142 -0
- package/esm2020/lib/routing/routing.mjs +57 -0
- package/esm2020/lib/uploader/index.mjs +6 -0
- package/esm2020/lib/uploader/interfaces.mjs +8 -0
- package/esm2020/lib/uploader/ng-file-drop.directive.mjs +81 -0
- package/esm2020/lib/uploader/ng-file-select.directive.mjs +51 -0
- package/esm2020/lib/uploader/ngx-uploader.class.mjs +308 -0
- package/esm2020/lib/uploader/ngx-uploader.module.mjs +17 -0
- package/esm2020/lib/utils/slugify.mjs +16 -0
- package/esm2020/lib/utils/tab-memory.service.mjs +71 -0
- package/esm2020/public-api.mjs +51 -0
- package/esm2020/solidev-data.mjs +5 -0
- package/fesm2015/solidev-data.mjs +5411 -0
- package/fesm2015/solidev-data.mjs.map +1 -0
- package/fesm2020/solidev-data.mjs +5358 -0
- package/fesm2020/solidev-data.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/auth/auth-interceptor.service.d.ts +17 -0
- package/lib/auth/auth.service.d.ts +43 -0
- package/lib/auth/jwt.d.ts +22 -0
- package/lib/data/data-backend.d.ts +47 -0
- package/lib/data/data-collection.d.ts +87 -0
- package/lib/data/data-collection.mock.d.ts +19 -0
- package/lib/data/data-model.d.ts +93 -0
- package/lib/data/data-parameters.d.ts +26 -0
- package/lib/data/data-query.d.ts +101 -0
- package/lib/data/data-query.mock.d.ts +25 -0
- package/lib/data/fields/base.d.ts +116 -0
- package/lib/data/fields/boolean.d.ts +9 -0
- package/lib/data/fields/datetime.d.ts +39 -0
- package/lib/data/fields/index.d.ts +6 -0
- package/lib/data/fields/numbers.d.ts +35 -0
- package/lib/data/fields/primaryfield.d.ts +8 -0
- package/lib/data/fields/relations.d.ts +45 -0
- package/lib/data/fields/stringfields.d.ts +50 -0
- package/lib/dispedit/choice.pipe.d.ts +8 -0
- package/lib/dispedit/dispedit/dispedit.component.d.ts +182 -0
- package/lib/dispedit/dispedit/dispedit.constants.d.ts +6 -0
- package/lib/dispedit/factor.pipe.d.ts +12 -0
- package/lib/dispedit/factorc.pipe.d.ts +11 -0
- package/lib/dispedit/fkselect/fkselect.component.d.ts +43 -0
- package/lib/dispedit/flags/flags.component.d.ts +40 -0
- package/lib/dispedit/m2mselect/m2mselect.component.d.ts +120 -0
- package/lib/dispedit/richedit/richedit.component.d.ts +31 -0
- package/lib/dispedit/sdelete/sdelete.component.d.ts +27 -0
- package/lib/messages/message-zone/message-zone.component.d.ts +14 -0
- package/lib/messages/message.service.d.ts +59 -0
- package/lib/modellist/model-list-fields/model-list-field-header/model-list-field-header.component.d.ts +15 -0
- package/lib/modellist/model-list-fields/model-list-fields-selector/model-list-fields-selector.component.d.ts +19 -0
- package/lib/modellist/model-list-fields/model-list-fields.d.ts +67 -0
- package/lib/modellist/model-list-filters/filters/filtertypes.d.ts +1 -0
- package/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.component.d.ts +30 -0
- package/lib/modellist/model-list-filters/filters/model-list-autocomplete-filter/model-list-autocomplete-filter.d.ts +22 -0
- package/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.component.d.ts +10 -0
- package/lib/modellist/model-list-filters/filters/model-list-autocomplete-multi-filter/model-list-autocomplete-multi-filter.d.ts +8 -0
- package/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.component.d.ts +15 -0
- package/lib/modellist/model-list-filters/filters/model-list-date-filter/model-list-date-filter.d.ts +4 -0
- package/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.component.d.ts +15 -0
- package/lib/modellist/model-list-filters/filters/model-list-datetime-filter/model-list-datetime-filter.d.ts +4 -0
- package/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetime-range-filter.component.d.ts +11 -0
- package/lib/modellist/model-list-filters/filters/model-list-datetimerange-filter/model-list-datetimerange-filter.d.ts +4 -0
- package/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.component.d.ts +11 -0
- package/lib/modellist/model-list-filters/filters/model-list-flags-filter/model-list-flags-filter.d.ts +4 -0
- package/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/adapters/ban.d.ts +35 -0
- package/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.component.d.ts +25 -0
- package/lib/modellist/model-list-filters/filters/model-list-geodistance-filter/model-list-geodistance-filter.d.ts +18 -0
- package/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.component.d.ts +17 -0
- package/lib/modellist/model-list-filters/filters/model-list-number-filter/model-list-number-filter.d.ts +19 -0
- package/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.component.d.ts +17 -0
- package/lib/modellist/model-list-filters/filters/model-list-select-filter/model-list-select-filter.d.ts +16 -0
- package/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.component.d.ts +17 -0
- package/lib/modellist/model-list-filters/filters/model-list-select-multi-filter/model-list-select-multi-filter.d.ts +6 -0
- package/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.component.d.ts +16 -0
- package/lib/modellist/model-list-filters/filters/model-list-text-filter/model-list-text-filter.d.ts +4 -0
- package/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.component.d.ts +11 -0
- package/lib/modellist/model-list-filters/filters/model-list-tree-filter/model-list-tree-filter.d.ts +4 -0
- package/lib/modellist/model-list-filters/model-list-filter.d.ts +52 -0
- package/lib/modellist/model-list-filters/model-list-filters/model-list-filters.component.d.ts +9 -0
- package/lib/modellist/model-list-filters/model-list-filters-select/model-list-filters-select.component.d.ts +13 -0
- package/lib/modellist/model-list-filters/model-list-filters.d.ts +15 -0
- package/lib/modellist/model-list-paginator/model-list-paginator/model-list-paginator.component.d.ts +23 -0
- package/lib/modellist/model-list-paginator/model-list-paginator.d.ts +16 -0
- package/lib/modellist/model-list-sorter/model-list-sorter/model-list-sorter.component.d.ts +22 -0
- package/lib/modellist/model-list-sorter/model-list-sorter.d.ts +61 -0
- package/lib/modellist/model-list.service.d.ts +83 -0
- package/lib/routing/breadcrumb/breadcrumb.component.d.ts +42 -0
- package/lib/routing/routing.d.ts +64 -0
- package/lib/uploader/index.d.ts +5 -0
- package/lib/uploader/interfaces.d.ts +67 -0
- package/lib/uploader/ng-file-drop.directive.d.ts +22 -0
- package/lib/uploader/ng-file-select.directive.d.ts +19 -0
- package/lib/uploader/ngx-uploader.class.d.ts +35 -0
- package/lib/uploader/ngx-uploader.module.d.ts +8 -0
- package/lib/utils/slugify.d.ts +1 -0
- package/lib/utils/tab-memory.service.d.ts +29 -0
- package/package.json +35 -0
- package/public-api.d.ts +47 -0
- package/src/lib/data/README.md +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Inject, Injectable, InjectionToken } from '@angular/core';
|
|
2
|
+
import { HttpErrorResponse, } from '@angular/common/http';
|
|
3
|
+
import { catchError, filter, switchMap, take } from 'rxjs/operators';
|
|
4
|
+
import { BehaviorSubject, throwError } from 'rxjs';
|
|
5
|
+
import { DATA_API_URL } from '../data/data-parameters';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "./auth.service";
|
|
8
|
+
export const DATA_AUTH_SERVICE = new InjectionToken('data.auth.service');
|
|
9
|
+
export class AuthInterceptor {
|
|
10
|
+
constructor(_auth, _apiUrl) {
|
|
11
|
+
this._auth = _auth;
|
|
12
|
+
this._apiUrl = _apiUrl;
|
|
13
|
+
this._isRefreshing = false;
|
|
14
|
+
this._refreshTokenSubject = new BehaviorSubject(null);
|
|
15
|
+
}
|
|
16
|
+
intercept(req, next) {
|
|
17
|
+
if (this._auth.isAnonymous) {
|
|
18
|
+
return next.handle(req);
|
|
19
|
+
}
|
|
20
|
+
if (!req.url.startsWith(this._apiUrl)) {
|
|
21
|
+
return next.handle(req);
|
|
22
|
+
}
|
|
23
|
+
if (req.url.startsWith(this._auth.refreshUrl) ||
|
|
24
|
+
req.url.startsWith(this._auth.loginUrl)) {
|
|
25
|
+
return next.handle(req);
|
|
26
|
+
}
|
|
27
|
+
if (!this._auth.isAnonymous) {
|
|
28
|
+
req = this._addToken(req, this._auth.accessToken);
|
|
29
|
+
}
|
|
30
|
+
return next.handle(req).pipe(catchError((error) => {
|
|
31
|
+
console.log('Catched http error', error);
|
|
32
|
+
if (error instanceof HttpErrorResponse && error.status === 401) {
|
|
33
|
+
console.log('Passing to handle 401');
|
|
34
|
+
return this._handle401Error(req, next);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.log('throwing error');
|
|
38
|
+
return throwError(error);
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
_handle401Error(request, next) {
|
|
43
|
+
if (!this._isRefreshing) {
|
|
44
|
+
this._isRefreshing = true;
|
|
45
|
+
this._refreshTokenSubject.next(null);
|
|
46
|
+
console.log('refreshing token');
|
|
47
|
+
return this._auth.refresh().pipe(switchMap((token) => {
|
|
48
|
+
if (token === null) {
|
|
49
|
+
return throwError(() => new HttpErrorResponse({
|
|
50
|
+
error: 'Forbidden, please log in',
|
|
51
|
+
status: 403,
|
|
52
|
+
statusText: 'Warning',
|
|
53
|
+
url: request.url,
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this._isRefreshing = false;
|
|
58
|
+
this._refreshTokenSubject.next(token);
|
|
59
|
+
return next.handle(this._addToken(request, token.access));
|
|
60
|
+
}
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log('piping to refresh token subject');
|
|
65
|
+
return this._refreshTokenSubject.pipe(filter((token) => token != null), take(1), switchMap((token) => next.handle(this._addToken(request, token.access))));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
_addToken(request, token) {
|
|
69
|
+
return request.clone({
|
|
70
|
+
setHeaders: {
|
|
71
|
+
authorization: `Bearer ${token}`,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
AuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: AuthInterceptor, deps: [{ token: DATA_AUTH_SERVICE }, { token: DATA_API_URL }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
77
|
+
AuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: AuthInterceptor, providedIn: 'root' });
|
|
78
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: AuthInterceptor, decorators: [{
|
|
79
|
+
type: Injectable,
|
|
80
|
+
args: [{
|
|
81
|
+
providedIn: 'root',
|
|
82
|
+
}]
|
|
83
|
+
}], ctorParameters: function () { return [{ type: i1.AuthServiceBase, decorators: [{
|
|
84
|
+
type: Inject,
|
|
85
|
+
args: [DATA_AUTH_SERVICE]
|
|
86
|
+
}] }, { type: undefined, decorators: [{
|
|
87
|
+
type: Inject,
|
|
88
|
+
args: [DATA_API_URL]
|
|
89
|
+
}] }]; } });
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1pbnRlcmNlcHRvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2F1dGgvYXV0aC1pbnRlcmNlcHRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsaUJBQWlCLEdBSWxCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7O0FBRXZELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLElBQUksY0FBYyxDQUVqRCxtQkFBbUIsQ0FBQyxDQUFDO0FBS3ZCLE1BQU0sT0FBTyxlQUFlO0lBSzFCLFlBQ3FDLEtBQXFDLEVBQzFDLE9BQWU7UUFEVixVQUFLLEdBQUwsS0FBSyxDQUFnQztRQUMxQyxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBTnZDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLHlCQUFvQixHQUMxQixJQUFJLGVBQWUsQ0FBaUMsSUFBSSxDQUFDLENBQUM7SUFLekQsQ0FBQztJQUVKLFNBQVMsQ0FBQyxHQUFxQixFQUFFLElBQWlCO1FBQ2hELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFDMUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZ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LEtBQWlDLENBQUMsTUFBTSxDQUFDLENBQ25FLENBQ0YsQ0FDRixDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRU8sU0FBUyxDQUFDLE9BQXlCLEVBQUUsS0FBYTtRQUN4RCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDbkIsVUFBVSxFQUFFO2dCQUNWLGFBQWEsRUFBRSxVQUFVLEtBQUssRUFBRTthQUNqQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7OzRHQXBGVSxlQUFlLGtCQU1oQixpQkFBaUIsYUFDakIsWUFBWTtnSEFQWCxlQUFlLGNBRmQsTUFBTTsyRkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBT0ksTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUN4QixNQUFNOzJCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBIdHRwRXJyb3JSZXNwb25zZSxcbiAgSHR0cEhhbmRsZXIsXG4gIEh0dHBJbnRlcmNlcHRvcixcbiAgSHR0cFJlcXVlc3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlQmFzZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbHRlciwgc3dpdGNoTWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJSnd0UmVmcmVzaFJlc3BvbnNlSnNvbiB9IGZyb20gJy4vand0JztcbmltcG9ydCB7IERBVEFfQVBJX1VSTCB9IGZyb20gJy4uL2RhdGEvZGF0YS1wYXJhbWV0ZXJzJztcblxuZXhwb3J0IGNvbnN0IERBVEFfQVVUSF9TRVJWSUNFID0gbmV3IEluamVjdGlvblRva2VuPFxuICBBdXRoU2VydmljZUJhc2U8YW55LCBhbnksIGFueT5cbj4oJ2RhdGEuYXV0aC5zZXJ2aWNlJyk7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICBwcml2YXRlIF9pc1JlZnJlc2hpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcmVmcmVzaFRva2VuU3ViamVjdCA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdDxJSnd0UmVmcmVzaFJlc3BvbnNlSnNvbiB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREFUQV9BVVRIX1NFUlZJQ0UpIHByaXZhdGUgX2F1dGg6IEF1dGhTZXJ2aWNlQmFzZTxhbnksIGFueSwgYW55PixcbiAgICBASW5qZWN0KERBVEFfQVBJX1VSTCkgcHJpdmF0ZSBfYXBpVXJsOiBzdHJpbmdcbiAgKSB7fVxuXG4gIGludGVyY2VwdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKSB7XG4gICAgaWYgKHRoaXMuX2F1dGguaXNBbm9ueW1vdXMpIHtcbiAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICAgIH1cbiAgICBpZiAoIXJlcS51cmwuc3RhcnRzV2l0aCh0aGlzLl9hcGlVcmwpKSB7XG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcmVxLnVybC5zdGFydHNXaXRoKHRoaXMuX2F1dGgucmVmcmVzaFVybCkgfHxcbiAgICAgIHJlcS51cmwuc3RhcnRzV2l0aCh0aGlzLl9hdXRoLmxvZ2luVXJsKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fYXV0aC5pc0Fub255bW91cykge1xuICAgICAgcmVxID0gdGhpcy5fYWRkVG9rZW4ocmVxLCB0aGlzLl9hdXRoLmFjY2Vzc1Rva2VuIGFzIHN0cmluZyk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2F0Y2hlZCBodHRwIGVycm9yJywgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiBlcnJvci5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdQYXNzaW5nIHRvIGhhbmRsZSA0MDEnKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlNDAxRXJyb3IocmVxLCBuZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygndGhyb3dpbmcgZXJyb3InKTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZTQwMUVycm9yKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKSB7XG4gICAgaWYgKCF0aGlzLl9pc1JlZnJlc2hpbmcpIHtcbiAgICAgIHRoaXMuX2lzUmVmcmVzaGluZyA9IHRydWU7XG4gICAgICB0aGlzLl9yZWZyZXNoVG9rZW5TdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICBjb25zb2xlLmxvZygncmVmcmVzaGluZyB0b2tlbicpO1xuICAgICAgcmV0dXJuIHRoaXMuX2F1dGgucmVmcmVzaCgpLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgodG9rZW4pID0+IHtcbiAgICAgICAgICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgIG5ldyBIdHRwRXJyb3JSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICBlcnJvcjogJ0ZvcmJpZGRlbiwgcGxlYXNlIGxvZyBpbicsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IDQwMyxcbiAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6ICdXYXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzUmVmcmVzaGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFRva2VuU3ViamVjdC5uZXh0KHRva2VuKTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZSh0aGlzLl9hZGRUb2tlbihyZXF1ZXN0LCB0b2tlbi5hY2Nlc3MpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygncGlwaW5nIHRvIHJlZnJlc2ggdG9rZW4gc3ViamVjdCcpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlZnJlc2hUb2tlblN1YmplY3QucGlwZShcbiAgICAgICAgZmlsdGVyKCh0b2tlbikgPT4gdG9rZW4gIT0gbnVsbCksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgodG9rZW4pID0+XG4gICAgICAgICAgbmV4dC5oYW5kbGUoXG4gICAgICAgICAgICB0aGlzLl9hZGRUb2tlbihyZXF1ZXN0LCAodG9rZW4gYXMgSUp3dFJlZnJlc2hSZXNwb25zZUpzb24pLmFjY2VzcylcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYWRkVG9rZW4ocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgdG9rZW46IHN0cmluZykge1xuICAgIHJldHVybiByZXF1ZXN0LmNsb25lKHtcbiAgICAgIHNldEhlYWRlcnM6IHtcbiAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { __decorate, __param } from "tslib";
|
|
2
|
+
import { Inject, InjectionToken } from '@angular/core';
|
|
3
|
+
import { Jwt, } from './jwt';
|
|
4
|
+
import { catchError, map, switchMap, tap } from 'rxjs/operators';
|
|
5
|
+
import { of, ReplaySubject, throwError } from 'rxjs';
|
|
6
|
+
/**
|
|
7
|
+
* DATA_API_URL: stores data api base url
|
|
8
|
+
*/
|
|
9
|
+
export const DATA_AUTH_PARAMS = new InjectionToken('data.auth.params');
|
|
10
|
+
export const DATA_AUTH_USER_SERVICE = new InjectionToken('data.auth.user.service');
|
|
11
|
+
let AuthServiceBase = class AuthServiceBase {
|
|
12
|
+
constructor(userService, _params, _router, _http, _msgs) {
|
|
13
|
+
this.userService = userService;
|
|
14
|
+
this._params = _params;
|
|
15
|
+
this._router = _router;
|
|
16
|
+
this._http = _http;
|
|
17
|
+
this._msgs = _msgs;
|
|
18
|
+
this._user$ = new ReplaySubject(1);
|
|
19
|
+
this.autoLogin();
|
|
20
|
+
}
|
|
21
|
+
get isAnonymous() {
|
|
22
|
+
return !this._token.access;
|
|
23
|
+
}
|
|
24
|
+
get accessToken() {
|
|
25
|
+
return this._token.access ? this._token.access : null;
|
|
26
|
+
}
|
|
27
|
+
get refreshToken() {
|
|
28
|
+
return this._token.refresh ? this._token.refresh : null;
|
|
29
|
+
}
|
|
30
|
+
get currentUser() {
|
|
31
|
+
return this._user && this._user.id ? this._user : null;
|
|
32
|
+
}
|
|
33
|
+
get currentUser$() {
|
|
34
|
+
return this._user$.asObservable();
|
|
35
|
+
}
|
|
36
|
+
get refreshUrl() {
|
|
37
|
+
return `${this._params.tokenRefreshUrl}`;
|
|
38
|
+
}
|
|
39
|
+
get loginUrl() {
|
|
40
|
+
return `${this._params.tokenUrl}`;
|
|
41
|
+
}
|
|
42
|
+
logout() {
|
|
43
|
+
localStorage.removeItem('auth');
|
|
44
|
+
this._token = new Jwt();
|
|
45
|
+
this._user = this.userService.create();
|
|
46
|
+
this._user$.next(null);
|
|
47
|
+
}
|
|
48
|
+
autoLogin() {
|
|
49
|
+
const localAuth = localStorage.getItem('auth');
|
|
50
|
+
if (!localAuth) {
|
|
51
|
+
return this.logout();
|
|
52
|
+
}
|
|
53
|
+
const { user, token } = JSON.parse(localAuth);
|
|
54
|
+
this._token = new Jwt(token);
|
|
55
|
+
this._user = this.userService.create(user);
|
|
56
|
+
this._user$.next(this._user);
|
|
57
|
+
}
|
|
58
|
+
login(username, password) {
|
|
59
|
+
const payload = {};
|
|
60
|
+
payload[this._params.loginField] = username;
|
|
61
|
+
payload[this._params.passwordField] = password;
|
|
62
|
+
return this._http.post(this.loginUrl, payload).pipe(tap((tok) => {
|
|
63
|
+
this._token = new Jwt(tok);
|
|
64
|
+
this.saveAuth();
|
|
65
|
+
}), switchMap(() => {
|
|
66
|
+
if (this._token.data && this._token.data.user_id) {
|
|
67
|
+
return this.userService.fetch(this._token.data.user_id);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return throwError(() => 'Invalid token');
|
|
71
|
+
}
|
|
72
|
+
}), tap((user) => {
|
|
73
|
+
this._user = user;
|
|
74
|
+
this.saveAuth();
|
|
75
|
+
}), map(() => true), catchError((error) => {
|
|
76
|
+
this.logout();
|
|
77
|
+
return of(false);
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
saveAuth() {
|
|
81
|
+
if (this.isAnonymous) {
|
|
82
|
+
localStorage.removeItem('auth');
|
|
83
|
+
this._user$.next(null);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
localStorage.setItem('auth', JSON.stringify({
|
|
87
|
+
user: this._user.toJson(),
|
|
88
|
+
token: this._token.toJson(),
|
|
89
|
+
}));
|
|
90
|
+
this._user$.next(this._user);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
refresh() {
|
|
94
|
+
console.log('service token refresh');
|
|
95
|
+
if (!this._token.refresh) {
|
|
96
|
+
this.logout();
|
|
97
|
+
return of(null);
|
|
98
|
+
}
|
|
99
|
+
return this._http
|
|
100
|
+
.post(this.refreshUrl, {
|
|
101
|
+
refresh: this._token.refresh,
|
|
102
|
+
})
|
|
103
|
+
.pipe(catchError((err, caught) => {
|
|
104
|
+
console.error('Token refresh error', err, caught);
|
|
105
|
+
this.logout();
|
|
106
|
+
this._msgs.warning('Vous devez vous reconnecter');
|
|
107
|
+
this._router.navigate(this._params.loginRoute);
|
|
108
|
+
return of(null);
|
|
109
|
+
}), tap((tok) => {
|
|
110
|
+
if (tok) {
|
|
111
|
+
this._token = new Jwt({
|
|
112
|
+
access: tok.access,
|
|
113
|
+
refresh: this._token.refresh,
|
|
114
|
+
});
|
|
115
|
+
this.saveAuth();
|
|
116
|
+
}
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
AuthServiceBase = __decorate([
|
|
121
|
+
__param(0, Inject(DATA_AUTH_USER_SERVICE)),
|
|
122
|
+
__param(1, Inject(DATA_AUTH_PARAMS))
|
|
123
|
+
], AuthServiceBase);
|
|
124
|
+
export { AuthServiceBase };
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2F1dGgvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBSUwsR0FBRyxHQUNKLE1BQU0sT0FBTyxDQUFDO0FBRWYsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWNqRTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksY0FBYyxDQUNoRCxrQkFBa0IsQ0FDbkIsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksY0FBYyxDQUN0RCx3QkFBd0IsQ0FDekIsQ0FBQztBQUVLLElBQU0sZUFBZSxHQUFyQixNQUFNLGVBQWU7SUFTMUIsWUFDeUMsV0FBd0IsRUFDN0IsT0FBbUIsRUFDN0MsT0FBZSxFQUNmLEtBQWlCLEVBQ2pCLEtBQXlCO1FBSk0sZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDN0IsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUM3QyxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixVQUFLLEdBQUwsS0FBSyxDQUFvQjtRQVIzQixXQUFNLEdBQUcsSUFBSSxhQUFhLENBQWMsQ0FBQyxDQUFDLENBQUM7UUFVakQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzdCLENB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QUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSUp3dEJhc2VEYXRhLFxuICBJSnd0UmVmcmVzaFJlc3BvbnNlSnNvbixcbiAgSUp3dFJlc3BvbnNlSnNvbixcbiAgSnd0LFxufSBmcm9tICcuL2p3dCc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0LCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEYXRhTW9kZWwgfSBmcm9tICcuLi9kYXRhL2RhdGEtbW9kZWwnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJy4uL2RhdGEvZGF0YS1jb2xsZWN0aW9uJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBEYXRhTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi9tZXNzYWdlcy9tZXNzYWdlLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhQYXJhbXMge1xuICB0b2tlblVybDogc3RyaW5nO1xuICB0b2tlblJlZnJlc2hVcmw6IHN0cmluZztcbiAgbG9naW5GaWVsZDogc3RyaW5nO1xuICBwYXNzd29yZEZpZWxkOiBzdHJpbmc7XG4gIGxvZ2luUm91dGU6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIERBVEFfQVBJX1VSTDogc3RvcmVzIGRhdGEgYXBpIGJhc2UgdXJsXG4gKi9cbmV4cG9ydCBjb25zdCBEQVRBX0FVVEhfUEFSQU1TID0gbmV3IEluamVjdGlvblRva2VuPEF1dGhQYXJhbXM+KFxuICAnZGF0YS5hdXRoLnBhcmFtcydcbik7XG5leHBvcnQgY29uc3QgREFUQV9BVVRIX1VTRVJfU0VSVklDRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxDb2xsZWN0aW9uPGFueT4+KFxuICAnZGF0YS5hdXRoLnVzZXIuc2VydmljZSdcbik7XG5cbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZUJhc2U8XG4gIFVzZXIgZXh0ZW5kcyBEYXRhTW9kZWwsXG4gIFVzZXJTZXJ2aWNlIGV4dGVuZHMgQ29sbGVjdGlvbjxVc2VyPixcbiAgVXNlckRhdGEgZXh0ZW5kcyBJSnd0QmFzZURhdGFcbj4ge1xuICBwcml2YXRlIF91c2VyITogVXNlcjtcbiAgcHJpdmF0ZSBfdXNlciQgPSBuZXcgUmVwbGF5U3ViamVjdDxVc2VyIHwgbnVsbD4oMSk7XG4gIHByaXZhdGUgX3Rva2VuITogSnd0PFVzZXJEYXRhPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERBVEFfQVVUSF9VU0VSX1NFUlZJQ0UpIHB1YmxpYyB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgQEluamVjdChEQVRBX0FVVEhfUEFSQU1TKSBwcml2YXRlIF9wYXJhbXM6IEF1dGhQYXJhbXMsXG4gICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBfaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIF9tc2dzOiBEYXRhTWVzc2FnZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5hdXRvTG9naW4oKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBbm9ueW1vdXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl90b2tlbi5hY2Nlc3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjY2Vzc1Rva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl90b2tlbi5hY2Nlc3MgPyB0aGlzLl90b2tlbi5hY2Nlc3MgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCByZWZyZXNoVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3Rva2VuLnJlZnJlc2ggPyB0aGlzLl90b2tlbi5yZWZyZXNoIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFVzZXIoKTogVXNlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl91c2VyICYmIHRoaXMuX3VzZXIuaWQgPyB0aGlzLl91c2VyIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFVzZXIkKCk6IE9ic2VydmFibGU8VXNlciB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fdXNlciQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlZnJlc2hVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fcGFyYW1zLnRva2VuUmVmcmVzaFVybH1gO1xuICB9XG5cbiAgcHVibGljIGdldCBsb2dpblVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLl9wYXJhbXMudG9rZW5Vcmx9YDtcbiAgfVxuXG4gIHB1YmxpYyBsb2dvdXQoKTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2F1dGgnKTtcbiAgICB0aGlzLl90b2tlbiA9IG5ldyBKd3QoKTtcbiAgICB0aGlzLl91c2VyID0gdGhpcy51c2VyU2VydmljZS5jcmVhdGUoKTtcbiAgICB0aGlzLl91c2VyJC5uZXh0KG51bGwpO1xuICB9XG5cbiAgcHVibGljIGF1dG9Mb2dpbigpOiB2b2lkIHtcbiAgICBjb25zdCBsb2NhbEF1dGggPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYXV0aCcpO1xuICAgIGlmICghbG9jYWxBdXRoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2dvdXQoKTtcbiAgICB9XG4gICAgY29uc3QgeyB1c2VyLCB0b2tlbiB9ID0gSlNPTi5wYXJzZShsb2NhbEF1dGgpO1xuICAgIHRoaXMuX3Rva2VuID0gbmV3IEp3dCh0b2tlbik7XG4gICAgdGhpcy5fdXNlciA9IHRoaXMudXNlclNlcnZpY2UuY3JlYXRlKHVzZXIpO1xuICAgIHRoaXMuX3VzZXIkLm5leHQodGhpcy5fdXNlcik7XG4gIH1cblxuICBwdWJsaWMgbG9naW4odXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHBheWxvYWQ6IHsgW19pbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBwYXlsb2FkW3RoaXMuX3BhcmFtcy5sb2dpbkZpZWxkXSA9IHVzZXJuYW1lO1xuICAgIHBheWxvYWRbdGhpcy5fcGFyYW1zLnBhc3N3b3JkRmllbGRdID0gcGFzc3dvcmQ7XG4gICAgcmV0dXJuIHRoaXMuX2h0dHAucG9zdDxJSnd0UmVzcG9uc2VKc29uPih0aGlzLmxvZ2luVXJsLCBwYXlsb2FkKS5waXBlKFxuICAgICAgdGFwKCh0b2spID0+IHtcbiAgICAgICAgdGhpcy5fdG9rZW4gPSBuZXcgSnd0KHRvayk7XG4gICAgICAgIHRoaXMuc2F2ZUF1dGgoKTtcbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3Rva2VuLmRhdGEgJiYgdGhpcy5fdG9rZW4uZGF0YS51c2VyX2lkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudXNlclNlcnZpY2UuZmV0Y2godGhpcy5fdG9rZW4uZGF0YSEudXNlcl9pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gJ0ludmFsaWQgdG9rZW4nKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0YXAoKHVzZXI6IFVzZXIpID0+IHtcbiAgICAgICAgdGhpcy5fdXNlciA9IHVzZXI7XG4gICAgICAgIHRoaXMuc2F2ZUF1dGgoKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKCgpID0+IHRydWUpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmVBdXRoKCkge1xuICAgIGlmICh0aGlzLmlzQW5vbnltb3VzKSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnYXV0aCcpO1xuICAgICAgdGhpcy5fdXNlciQubmV4dChudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICdhdXRoJyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHVzZXI6IHRoaXMuX3VzZXIudG9Kc29uKCksXG4gICAgICAgICAgdG9rZW46IHRoaXMuX3Rva2VuLnRvSnNvbigpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuX3VzZXIkLm5leHQodGhpcy5fdXNlcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZnJlc2goKTogT2JzZXJ2YWJsZTxJSnd0UmVmcmVzaFJlc3BvbnNlSnNvbiB8IG51bGw+IHtcbiAgICBjb25zb2xlLmxvZygnc2VydmljZSB0b2tlbiByZWZyZXNoJyk7XG4gICAgaWYgKCF0aGlzLl90b2tlbi5yZWZyZXNoKSB7XG4gICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faHR0cFxuICAgICAgLnBvc3Q8SUp3dFJlZnJlc2hSZXNwb25zZUpzb24+KHRoaXMucmVmcmVzaFVybCwge1xuICAgICAgICByZWZyZXNoOiB0aGlzLl90b2tlbi5yZWZyZXNoIGFzIHN0cmluZyxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdUb2tlbiByZWZyZXNoIGVycm9yJywgZXJyLCBjYXVnaHQpO1xuICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgdGhpcy5fbXNncy53YXJuaW5nKCdWb3VzIGRldmV6IHZvdXMgcmVjb25uZWN0ZXInKTtcbiAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUodGhpcy5fcGFyYW1zLmxvZ2luUm91dGUpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgodG9rKSA9PiB7XG4gICAgICAgICAgaWYgKHRvaykge1xuICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSBuZXcgSnd0KHtcbiAgICAgICAgICAgICAgYWNjZXNzOiB0b2suYWNjZXNzLFxuICAgICAgICAgICAgICByZWZyZXNoOiB0aGlzLl90b2tlbi5yZWZyZXNoISxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zYXZlQXV0aCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import jwt_decode from 'jwt-decode';
|
|
2
|
+
export class Jwt {
|
|
3
|
+
constructor(response) {
|
|
4
|
+
this._data = null;
|
|
5
|
+
if (response) {
|
|
6
|
+
this.access = response.access;
|
|
7
|
+
this._data = Object.freeze(jwt_decode(response.access));
|
|
8
|
+
this.refresh = response.refresh;
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
this._data = null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
get data() {
|
|
15
|
+
return this._data;
|
|
16
|
+
}
|
|
17
|
+
toJson() {
|
|
18
|
+
return { access: this.access, refresh: this.refresh };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2F1dGgvand0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQW1CcEMsTUFBTSxPQUFPLEdBQUc7SUFLZCxZQUFZLFFBQTJCO1FBRnRCLFVBQUssR0FBdUIsSUFBSSxDQUFDO1FBR2hELElBQUksUUFBUSxFQUFFO1lBQ1osSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQWMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1NBQ2pDO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVNLE1BQU07UUFDWCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgand0X2RlY29kZSBmcm9tICdqd3QtZGVjb2RlJztcblxuZXhwb3J0IGludGVyZmFjZSBJSnd0UmVzcG9uc2VKc29uIHtcbiAgYWNjZXNzOiBzdHJpbmc7XG4gIHJlZnJlc2g6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSnd0UmVmcmVzaFJlc3BvbnNlSnNvbiB7XG4gIGFjY2Vzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElKd3RCYXNlRGF0YSB7XG4gIC8vIEZJWE1FOiBjaGVjayBtaW5pbWFsIGp3dCBkYXRhXG4gIHRva2VuX3R5cGU6ICdhY2Nlc3MnIHwgJ3JlZnJlc2gnO1xuICB1c2VyX2lkOiBudW1iZXI7XG4gIC8vIGV4cDogbnVtYmVyO1xuICAvLyBqdGk6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEp3dDxVc2VySnd0RGF0YSBleHRlbmRzIElKd3RCYXNlRGF0YT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgYWNjZXNzPzogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVmcmVzaD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0YTogVXNlckp3dERhdGEgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihyZXNwb25zZT86IElKd3RSZXNwb25zZUpzb24pIHtcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIHRoaXMuYWNjZXNzID0gcmVzcG9uc2UuYWNjZXNzO1xuICAgICAgdGhpcy5fZGF0YSA9IE9iamVjdC5mcmVlemUoand0X2RlY29kZTxVc2VySnd0RGF0YT4ocmVzcG9uc2UuYWNjZXNzKSk7XG4gICAgICB0aGlzLnJlZnJlc2ggPSByZXNwb25zZS5yZWZyZXNoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGEoKTogVXNlckp3dERhdGEgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyB0b0pzb24oKSB7XG4gICAgcmV0dXJuIHsgYWNjZXNzOiB0aGlzLmFjY2VzcywgcmVmcmVzaDogdGhpcy5yZWZyZXNoIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { makeStateKey } from '@angular/platform-browser';
|
|
2
|
+
import { of } from 'rxjs';
|
|
3
|
+
import { tap } from 'rxjs/operators';
|
|
4
|
+
import { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core';
|
|
5
|
+
import { isPlatformServer } from '@angular/common';
|
|
6
|
+
import { DATA_API_URL, DATA_MAX_TRANSFERSTATE_TIME } from './data-parameters';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common/http";
|
|
9
|
+
import * as i2 from "@angular/platform-browser";
|
|
10
|
+
/**
|
|
11
|
+
* DataBackend provides CRUD operations to a REST api.
|
|
12
|
+
* TransferState can be used if DATA_MAX_TRANSFERSTATE_TIME is set and > 0
|
|
13
|
+
*/
|
|
14
|
+
export class DataBackend {
|
|
15
|
+
constructor(_http, _transferState, _platform, _apiUrl, _maxTransferstateTime = 0) {
|
|
16
|
+
this._http = _http;
|
|
17
|
+
this._transferState = _transferState;
|
|
18
|
+
this._platform = _platform;
|
|
19
|
+
this._apiUrl = _apiUrl;
|
|
20
|
+
this._maxTransferstateTime = _maxTransferstateTime;
|
|
21
|
+
this._created = new Date();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Return api url for this backend.
|
|
25
|
+
*/
|
|
26
|
+
get apiUrl() {
|
|
27
|
+
return this._apiUrl;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Launch an action on collection.
|
|
31
|
+
* If method is GET and collection.useTranserState & transferState are enabled,
|
|
32
|
+
* result is stored / retrieved from transferState.
|
|
33
|
+
*
|
|
34
|
+
* @param collection Collection reference
|
|
35
|
+
* @param method HTTP method
|
|
36
|
+
* @param url full URL for action
|
|
37
|
+
* @param body JSON body
|
|
38
|
+
* @param params query parameters
|
|
39
|
+
* @param headers query headers
|
|
40
|
+
*
|
|
41
|
+
* @return an observable of response body
|
|
42
|
+
*/
|
|
43
|
+
action(collection, method, url, { body = undefined, params = {}, headers = {} } = {}) {
|
|
44
|
+
if (method === 'GET') {
|
|
45
|
+
return this._cachedGet(collection, url, { headers, params });
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
return this._http.request(method, url, { body, params, headers });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
put(collection, url, { body = undefined, params = {}, headers = {} } = {}) {
|
|
52
|
+
return this._http.put(url, body, { params, headers });
|
|
53
|
+
}
|
|
54
|
+
post(collection, url, { body = undefined, params = {}, headers = {} } = {}) {
|
|
55
|
+
return this._http.post(url, body, { params, headers });
|
|
56
|
+
}
|
|
57
|
+
patch(collection, url, { body = undefined, params = {}, headers = {} } = {}) {
|
|
58
|
+
return this._http.patch(url, body, { params, headers });
|
|
59
|
+
}
|
|
60
|
+
delete(collection, url, { params = {}, headers = {} } = {}) {
|
|
61
|
+
return this._http.delete(url, { params, headers });
|
|
62
|
+
}
|
|
63
|
+
_cachedGet(collection, url, { params = {}, headers = {} } = {}) {
|
|
64
|
+
const key = makeStateKey(url + '|' + JSON.stringify(params) + '|' + JSON.stringify(headers));
|
|
65
|
+
if (collection.useTransferState &&
|
|
66
|
+
this._maxTransferstateTime > 0 &&
|
|
67
|
+
this._transferState.hasKey(key) &&
|
|
68
|
+
new Date().getTime() - this._created.getTime() <
|
|
69
|
+
this._maxTransferstateTime) {
|
|
70
|
+
return of(this._transferState.get(key, null));
|
|
71
|
+
}
|
|
72
|
+
return this._http.get(url, { headers, params }).pipe(tap((result) => {
|
|
73
|
+
if (collection.useTransferState &&
|
|
74
|
+
isPlatformServer(this._platform) &&
|
|
75
|
+
this._maxTransferstateTime > 0) {
|
|
76
|
+
this._transferState.set(key, result);
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
get(collection, url, { params = {}, headers = {} } = {}) {
|
|
81
|
+
return this._cachedGet(collection, url, { headers, params });
|
|
82
|
+
}
|
|
83
|
+
list(collection, url, { params = {}, headers = {} } = {}) {
|
|
84
|
+
return this._cachedGet(collection, url, { headers, params });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
DataBackend.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: DataBackend, deps: [{ token: i1.HttpClient }, { token: i2.TransferState }, { token: PLATFORM_ID }, { token: DATA_API_URL }, { token: DATA_MAX_TRANSFERSTATE_TIME, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
88
|
+
DataBackend.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: DataBackend, providedIn: 'root' });
|
|
89
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: DataBackend, decorators: [{
|
|
90
|
+
type: Injectable,
|
|
91
|
+
args: [{
|
|
92
|
+
providedIn: 'root',
|
|
93
|
+
}]
|
|
94
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.TransferState }, { type: undefined, decorators: [{
|
|
95
|
+
type: Inject,
|
|
96
|
+
args: [PLATFORM_ID]
|
|
97
|
+
}] }, { type: undefined, decorators: [{
|
|
98
|
+
type: Inject,
|
|
99
|
+
args: [DATA_API_URL]
|
|
100
|
+
}] }, { type: undefined, decorators: [{
|
|
101
|
+
type: Optional
|
|
102
|
+
}, {
|
|
103
|
+
type: Inject,
|
|
104
|
+
args: [DATA_MAX_TRANSFERSTATE_TIME]
|
|
105
|
+
}] }]; } });
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1iYWNrZW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2RhdGEvZGF0YS1iYWNrZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQWlCLE1BQU0sMkJBQTJCLENBQUM7QUFDeEUsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUUsWUFBWSxFQUFFLDJCQUEyQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFFOUU7OztHQUdHO0FBSUgsTUFBTSxPQUFPLFdBQVc7SUFHdEIsWUFDVSxLQUFpQixFQUNqQixjQUE2QixFQUNSLFNBQWMsRUFDYixPQUFlLEVBR3JDLHdCQUFnQyxDQUFDO1FBTmpDLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDUixjQUFTLEdBQVQsU0FBUyxDQUFLO1FBQ2IsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUdyQywwQkFBcUIsR0FBckIscUJBQXFCLENBQVk7UUFUbkMsYUFBUSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFVM0IsQ0FBQztJQUVKOztPQUVHO0lBQ0gsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ksTUFBTSxDQUNYLFVBQXlCLEVBQ3pCLE1BQW1ELEVBQ25ELEdBQVcsRUFDWCxFQUFFLElBQUksR0FBRyxTQUFTLEVBQUUsTUFBTSxH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QUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEVBQzlCO2dCQUNBLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFLLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUMxQztRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sR0FBRyxDQUNSLFVBQXlCLEVBQ3pCLEdBQVcsRUFDWCxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLEVBQUUsS0FBb0IsRUFBRTtRQUVqRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQWdCLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU0sSUFBSSxDQUNULFVBQXlCLEVBQ3pCLEdBQVcsRUFDWCxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLEVBQUUsS0FBb0IsRUFBRTtRQUVqRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQWdCLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5RSxDQUFDOzt3R0EzSFUsV0FBVyx5RUFNWixXQUFXLGFBQ1gsWUFBWSxhQUVaLDJCQUEyQjs0R0FUMUIsV0FBVyxjQUZWLE1BQU07MkZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQU9JLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLE1BQU07MkJBQUMsWUFBWTs7MEJBQ25CLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IG1ha2VTdGF0ZUtleSwgVHJhbnNmZXJTdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIElBY3Rpb25QYXJhbXMgfSBmcm9tICcuL2RhdGEtY29sbGVjdGlvbic7XG5pbXBvcnQgeyBEYXRhTW9kZWwgfSBmcm9tICcuL2RhdGEtbW9kZWwnO1xuaW1wb3J0IHsgREFUQV9BUElfVVJMLCBEQVRBX01BWF9UUkFOU0ZFUlNUQVRFX1RJTUUgfSBmcm9tICcuL2RhdGEtcGFyYW1ldGVycyc7XG5cbi8qKlxuICogRGF0YUJhY2tlbmQgcHJvdmlkZXMgQ1JVRCBvcGVyYXRpb25zIHRvIGEgUkVTVCBhcGkuXG4gKiBUcmFuc2ZlclN0YXRlIGNhbiBiZSB1c2VkIGlmIERBVEFfTUFYX1RSQU5TRkVSU1RBVEVfVElNRSBpcyBzZXQgYW5kID4gMFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YUJhY2tlbmQge1xuICBwcml2YXRlIF9jcmVhdGVkID0gbmV3IERhdGUoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9odHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgX3RyYW5zZmVyU3RhdGU6IFRyYW5zZmVyU3RhdGUsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBfcGxhdGZvcm06IGFueSxcbiAgICBASW5qZWN0KERBVEFfQVBJX1VSTCkgcHJpdmF0ZSBfYXBpVXJsOiBzdHJpbmcsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KERBVEFfTUFYX1RSQU5TRkVSU1RBVEVfVElNRSlcbiAgICBwcml2YXRlIF9tYXhUcmFuc2ZlcnN0YXRlVGltZTogbnVtYmVyID0gMFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhcGkgdXJsIGZvciB0aGlzIGJhY2tlbmQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFwaVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcGlVcmw7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoIGFuIGFjdGlvbiBvbiBjb2xsZWN0aW9uLlxuICAgKiBJZiBtZXRob2QgaXMgR0VUIGFuZCBjb2xsZWN0aW9uLnVzZVRyYW5zZXJTdGF0ZSAmIHRyYW5zZmVyU3RhdGUgYXJlIGVuYWJsZWQsXG4gICAqIHJlc3VsdCBpcyBzdG9yZWQgLyByZXRyaWV2ZWQgZnJvbSB0cmFuc2ZlclN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0gY29sbGVjdGlvbiBDb2xsZWN0aW9uIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0gbWV0aG9kIEhUVFAgbWV0aG9kXG4gICAqIEBwYXJhbSB1cmwgZnVsbCBVUkwgZm9yIGFjdGlvblxuICAgKiBAcGFyYW0gYm9keSBKU09OIGJvZHlcbiAgICogQHBhcmFtIHBhcmFtcyBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBoZWFkZXJzIHF1ZXJ5IGhlYWRlcnNcbiAgICpcbiAgICogQHJldHVybiBhbiBvYnNlcnZhYmxlIG9mIHJlc3BvbnNlIGJvZHlcbiAgICovXG4gIHB1YmxpYyBhY3Rpb248VCBleHRlbmRzIERhdGFNb2RlbCwgUlQ+KFxuICAgIGNvbGxlY3Rpb246IENvbGxlY3Rpb248VD4sXG4gICAgbWV0aG9kOiAnR0VUJyB8ICdQT1NUJyB8ICdQVVQnIHwgJ1BBVENIJyB8ICdERUxFVEUnLFxuICAgIHVybDogc3RyaW5nLFxuICAgIHsgYm9keSA9IHVuZGVmaW5lZCwgcGFyYW1zID0ge30sIGhlYWRlcnMgPSB7fSB9OiBJQWN0aW9uUGFyYW1zID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSVD4ge1xuICAgIGlmIChtZXRob2QgPT09ICdHRVQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVkR2V0KGNvbGxlY3Rpb24sIHVybCwgeyBoZWFkZXJzLCBwYXJhbXMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9odHRwLnJlcXVlc3Q8UlQ+KG1ldGhvZCwgdXJsLCB7IGJvZHksIHBhcmFtcywgaGVhZGVycyB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHV0PFQgZXh0ZW5kcyBEYXRhTW9kZWw+KFxuICAgIGNvbGxlY3Rpb246IENvbGxlY3Rpb248VD4sXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgeyBib2R5ID0gdW5kZWZpbmVkLCBwYXJhbXMgPSB7fSwgaGVhZGVycyA9IHt9IH06IElBY3Rpb25QYXJhbXMgPSB7fVxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5faHR0cC5wdXQ8VD4odXJsLCBib2R5LCB7IHBhcmFtcywgaGVhZGVycyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBwb3N0PFQgZXh0ZW5kcyBEYXRhTW9kZWw+KFxuICAgIGNvbGxlY3Rpb246IENvbGxlY3Rpb248VD4sXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgeyBib2R5ID0gdW5kZWZpbmVkLCBwYXJhbXMgPSB7fSwgaGVhZGVycyA9IHt9IH06IElBY3Rpb25QYXJhbXMgPSB7fVxuICApOiBPYnNlcnZhYmxlPFBhcnRpYWw8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0PFBhcnRpYWw8VD4+KHVybCwgYm9keSwgeyBwYXJhbXMsIGhlYWRlcnMgfSk7XG4gIH1cblxuICBwdWJsaWMgcGF0Y2g8VCBleHRlbmRzIERhdGFNb2RlbD4oXG4gICAgY29sbGVjdGlvbjogQ29sbGVjdGlvbjxUPixcbiAgICB1cmw6IHN0cmluZyxcbiAgICB7IGJvZHkgPSB1bmRlZmluZWQsIHBhcmFtcyA9IHt9LCBoZWFkZXJzID0ge30gfTogSUFjdGlvblBhcmFtcyA9IHt9XG4gICk6IE9ic2VydmFibGU8UGFydGlhbDxUPj4ge1xuICAgIHJldHVybiB0aGlzLl9odHRwLnBhdGNoPFBhcnRpYWw8VD4+KHVybCwgYm9keSwgeyBwYXJhbXMsIGhlYWRlcnMgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlPFQgZXh0ZW5kcyBEYXRhTW9kZWwsIFI+KFxuICAgIGNvbGxlY3Rpb246IENvbGxlY3Rpb248VD4sXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgeyBwYXJhbXMgPSB7fSwgaGVhZGVycyA9IHt9IH06IElBY3Rpb25QYXJhbXMgPSB7fVxuICApOiBPYnNlcnZhYmxlPFI+IHtcbiAgICByZXR1cm4gdGhpcy5faHR0cC5kZWxldGU8Uj4odXJsLCB7IHBhcmFtcywgaGVhZGVycyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBfY2FjaGVkR2V0PFQgZXh0ZW5kcyBEYXRhTW9kZWwsIFJUPihcbiAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uPFQ+LFxuICAgIHVybDogc3RyaW5nLFxuICAgIHsgcGFyYW1zID0ge30sIGhlYWRlcnMgPSB7fSB9OiBJQWN0aW9uUGFyYW1zID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSVD4ge1xuICAgIGNvbnN0IGtleSA9IG1ha2VTdGF0ZUtleTxSVD4oXG4gICAgICB1cmwgKyAnfCcgKyBKU09OLnN0cmluZ2lmeShwYXJhbXMpICsgJ3wnICsgSlNPTi5zdHJpbmdpZnkoaGVhZGVycylcbiAgICApO1xuICAgIGlmIChcbiAgICAgIGNvbGxlY3Rpb24udXNlVHJhbnNmZXJTdGF0ZSAmJlxuICAgICAgdGhpcy5fbWF4VHJhbnNmZXJzdGF0ZVRpbWUgPiAwICYmXG4gICAgICB0aGlzLl90cmFuc2ZlclN0YXRlLmhhc0tleShrZXkpICYmXG4gICAgICBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHRoaXMuX2NyZWF0ZWQuZ2V0VGltZSgpIDxcbiAgICAgICAgdGhpcy5fbWF4VHJhbnNmZXJzdGF0ZVRpbWVcbiAgICApIHtcbiAgICAgIHJldHVybiBvZih0aGlzLl90cmFuc2ZlclN0YXRlLmdldDxSVCB8IG51bGw+KGtleSwgbnVsbCkgYXMgUlQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faHR0cC5nZXQ8UlQ+KHVybCwgeyBoZWFkZXJzLCBwYXJhbXMgfSkucGlwZShcbiAgICAgIHRhcCgocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb2xsZWN0aW9uLnVzZVRyYW5zZmVyU3RhdGUgJiZcbiAgICAgICAgICBpc1BsYXRmb3JtU2VydmVyKHRoaXMuX3BsYXRmb3JtKSAmJlxuICAgICAgICAgIHRoaXMuX21heFRyYW5zZmVyc3RhdGVUaW1lID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLl90cmFuc2ZlclN0YXRlLnNldDxSVD4oa2V5LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0PFQgZXh0ZW5kcyBEYXRhTW9kZWw+KFxuICAgIGNvbGxlY3Rpb246IENvbGxlY3Rpb248VD4sXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgeyBwYXJhbXMgPSB7fSwgaGVhZGVycyA9IHt9IH06IElBY3Rpb25QYXJhbXMgPSB7fVxuICApOiBPYnNlcnZhYmxlPFBhcnRpYWw8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkR2V0PFQsIFBhcnRpYWw8VD4+KGNvbGxlY3Rpb24sIHVybCwgeyBoZWFkZXJzLCBwYXJhbXMgfSk7XG4gIH1cblxuICBwdWJsaWMgbGlzdDxUIGV4dGVuZHMgRGF0YU1vZGVsPihcbiAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uPFQ+LFxuICAgIHVybDogc3RyaW5nLFxuICAgIHsgcGFyYW1zID0ge30sIGhlYWRlcnMgPSB7fSB9OiBJQWN0aW9uUGFyYW1zID0ge31cbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkR2V0PFQsIFBhcnRpYWw8VD4+KGNvbGxlY3Rpb24sIHVybCwgeyBoZWFkZXJzLCBwYXJhbXMgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Queryset } from './data-query';
|
|
2
|
+
import { map, tap } from 'rxjs/operators';
|
|
3
|
+
export class Collection {
|
|
4
|
+
constructor(backend, path, model) {
|
|
5
|
+
this.backend = backend;
|
|
6
|
+
this.path = path;
|
|
7
|
+
this.model = model;
|
|
8
|
+
this.useTransferState = true;
|
|
9
|
+
}
|
|
10
|
+
create(data) {
|
|
11
|
+
if (!data) {
|
|
12
|
+
data = {};
|
|
13
|
+
}
|
|
14
|
+
return this.fromJson(data);
|
|
15
|
+
}
|
|
16
|
+
fromJson(data) {
|
|
17
|
+
if (data instanceof Array) {
|
|
18
|
+
const out = [];
|
|
19
|
+
for (const r of data) {
|
|
20
|
+
const ri = new this.model(this);
|
|
21
|
+
ri.fromJson(r);
|
|
22
|
+
out.push(ri);
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
const m = new this.model(this);
|
|
27
|
+
m.fromJson(data);
|
|
28
|
+
return m;
|
|
29
|
+
}
|
|
30
|
+
queryset(options = {}) {
|
|
31
|
+
return new Queryset(this, options);
|
|
32
|
+
}
|
|
33
|
+
fetch(id, { prefix = '', suffix = '', params = {}, headers = {}, } = {}) {
|
|
34
|
+
return this.backend
|
|
35
|
+
.get(this, this.getUrl(id, { prefix, suffix }), { headers, params })
|
|
36
|
+
.pipe(map((result) => this.fromJson(result)));
|
|
37
|
+
}
|
|
38
|
+
action(model, method, action, { body = undefined, params = {}, headers = {} } = {}) {
|
|
39
|
+
return this.backend.action(this, method, this.getUrl(model ? model.id : null, {
|
|
40
|
+
suffix: model ? '/' + action : action,
|
|
41
|
+
}), { body, params, headers });
|
|
42
|
+
}
|
|
43
|
+
save(model, { updateModel = true } = {}) {
|
|
44
|
+
let saveMethod = model.id !== undefined
|
|
45
|
+
? this.backend.patch.bind(this.backend)
|
|
46
|
+
: this.backend.post.bind(this.backend);
|
|
47
|
+
let url = model.id !== undefined ? this.getUrl(model.id) : this.getUrl();
|
|
48
|
+
return saveMethod(this, url, { body: model.toJson() }).pipe(map((res) => this.fromJson(res)), tap((res) => {
|
|
49
|
+
if (updateModel) {
|
|
50
|
+
model.fromJson(res);
|
|
51
|
+
}
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
update(model, fields = [], { updateModel = true } = {}) {
|
|
55
|
+
let saveMethod = model.id !== undefined
|
|
56
|
+
? this.backend.patch.bind(this.backend)
|
|
57
|
+
: this.backend.post.bind(this.backend);
|
|
58
|
+
let url = model.id !== undefined ? this.getUrl(model.id) : this.getUrl();
|
|
59
|
+
return saveMethod(this, url, { body: model.toJson(fields) }).pipe(map((res) => this.fromJson(res)), tap((res) => {
|
|
60
|
+
if (updateModel) {
|
|
61
|
+
model.fromJson(res);
|
|
62
|
+
}
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
delete(model, { params = {}, headers = {} } = {}) {
|
|
66
|
+
return this.backend.delete(this, this.getUrl(model.id), {
|
|
67
|
+
params,
|
|
68
|
+
headers,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
list(query = {}, { prefix = '', suffix = '', params = {}, headers = {}, } = {}) {
|
|
72
|
+
const qry = Object.assign({}, query, params);
|
|
73
|
+
return this.backend
|
|
74
|
+
.list(this, this.getUrl(null, { suffix, prefix }),
|
|
75
|
+
// SEE: forced typecast maybe bad
|
|
76
|
+
{ params: qry, headers })
|
|
77
|
+
.pipe(
|
|
78
|
+
// FIXME: parametrize paginated results access
|
|
79
|
+
map((result) => this.fromJson(result.results)));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Calls *method* endpoint for this collection and returns raw results.
|
|
83
|
+
*
|
|
84
|
+
* @param method GET/POST/...
|
|
85
|
+
* @param prefix collection_urlPREFIXSUFFIX
|
|
86
|
+
* @param suffix collection_urlPREFIXSUFFIX
|
|
87
|
+
* @param params query paremeters
|
|
88
|
+
* @param body body as json
|
|
89
|
+
* @param headers headers
|
|
90
|
+
*/
|
|
91
|
+
raw({ method = 'GET', prefix = '', suffix = '', params = {}, body = {}, headers = {}, } = {}) {
|
|
92
|
+
return this.backend.action(this, method, this.getUrl(null, { suffix, prefix }), {
|
|
93
|
+
params,
|
|
94
|
+
headers,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
getUrl(id, { prefix = '', suffix = '' } = {}) {
|
|
98
|
+
if (id === undefined || id === null) {
|
|
99
|
+
if (prefix || suffix) {
|
|
100
|
+
return `${this.backend.apiUrl}${this.path}/${prefix}${suffix}`;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
return `${this.backend.apiUrl}${this.path}`;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return `${this.backend.apiUrl}${this.path}/${prefix}${id}${suffix}`;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb2xsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YS9zcmMvbGliL2RhdGEvZGF0YS1jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBZ0MsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFzQjFDLE1BQU0sT0FBTyxVQUFVO0lBR3JCLFlBQ1ksT0FBb0IsRUFDcEIsSUFBWSxFQUNmLEtBQXVCO1FBRnBCLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDcEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNmLFVBQUssR0FBTCxLQUFLLENBQWtCO1FBTHpCLHFCQUFnQixHQUFHLElBQUksQ0FBQztJQU01QixDQUFDO0lBRUcsTUFBTSxDQUFDLElBQWlCO1FBQzdCLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxJQUFJLEdBQUcsRUFBRSxDQUFDO1NBQ1g7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUlELFFBQVEsQ0FBQyxJQUErQjtRQUN0QyxJQUFJLElBQUksWUFBWSxLQUFLLEVBQUU7WUFDekIsTUFBTSxHQUFHLEdBQVEsRUFBRSxDQUFDO1lBQ3BCLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUNwQixNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNkO1lBQ0QsT0FBTyxHQUFHLENBQUM7U0FDWjtRQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJ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RUFBRTtnQkFDcEIsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDO2FBQ2hFO2lCQUFNO2dCQUNMLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDN0M7U0FDRjtRQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDdEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YU1vZGVsIH0gZnJvbSAnLi9kYXRhLW1vZGVsJztcbmltcG9ydCB7IERhdGFCYWNrZW5kIH0gZnJvbSAnLi9kYXRhLWJhY2tlbmQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRmlsdGVyRGF0YSwgSVF1ZXJ5c2V0T3B0aW9ucywgUXVlcnlzZXQgfSBmcm9tICcuL2RhdGEtcXVlcnknO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCB0eXBlIElIdHRwTWV0aG9kID0gJ1BPU1QnIHwgJ0dFVCcgfCAnREVMRVRFJyB8ICdQVVQnIHwgJ1BBVENIJztcblxuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uUGFyYW1zIHtcbiAgYm9keT86IGFueTtcbiAgaGVhZGVycz86IHsgW2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcGFyYW1zPzogeyBbaW5kZXg6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2xsZWN0aW9uQ2FjaGVQYXJhbXMge1xuICB0cmFuc2ZlclN0YXRlPzoge1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgbWF4VGltZTogbnVtYmVyO1xuICAgIG1heENvdW50OiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIERhdGFNb2RlbFR5cGU8VCBleHRlbmRzIERhdGFNb2RlbD4gPSBuZXcgKFxuICBfY29sbD86IENvbGxlY3Rpb248VD5cbikgPT4gVDtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb248VCBleHRlbmRzIERhdGFNb2RlbD4ge1xuICBwdWJsaWMgdXNlVHJhbnNmZXJTdGF0ZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGJhY2tlbmQ6IERhdGFCYWNrZW5kLFxuICAgIHByb3RlY3RlZCBwYXRoOiBzdHJpbmcsXG4gICAgcHVibGljIG1vZGVsOiBEYXRhTW9kZWxUeXBlPFQ+XG4gICkge31cblxuICBwdWJsaWMgY3JlYXRlKGRhdGE/OiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0ge307XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZyb21Kc29uKGRhdGEpO1xuICB9XG5cbiAgZnJvbUpzb24oZGF0YTogUGFydGlhbDxUPik6IFQ7XG4gIGZyb21Kc29uKGRhdGE6IFBhcnRpYWw8VD5bXSk6IFRbXTtcbiAgZnJvbUpzb24oZGF0YTogUGFydGlhbDxUPiB8IFBhcnRpYWw8VD5bXSk6IFQgfCBUW10ge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGNvbnN0IG91dDogVFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgZGF0YSkge1xuICAgICAgICBjb25zdCByaSA9IG5ldyB0aGlzLm1vZGVsKHRoaXMpO1xuICAgICAgICByaS5mcm9tSnNvbihyKTtcbiAgICAgICAgb3V0LnB1c2gocmkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgY29uc3QgbSA9IG5ldyB0aGlzLm1vZGVsKHRoaXMpO1xuICAgIG0uZnJvbUpzb24oZGF0YSk7XG4gICAgcmV0dXJuIG07XG4gIH1cblxuICBwdWJsaWMgcXVlcnlzZXQob3B0aW9uczogSVF1ZXJ5c2V0T3B0aW9ucyA9IHt9KTogUXVlcnlzZXQ8VD4ge1xuICAgIHJldHVybiBuZXcgUXVlcnlzZXQ8VD4odGhpcywgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZmV0Y2goXG4gICAgaWQ6IG51bWJlcixcbiAgICB7XG4gICAgICBwcmVmaXggPSAnJyxcbiAgICAgIHN1ZmZpeCA9ICcnLFxuICAgICAgcGFyYW1zID0ge30sXG4gICAgICBoZWFkZXJzID0ge30sXG4gICAgfToge1xuICAgICAgcHJlZml4Pzogc3RyaW5nO1xuICAgICAgc3VmZml4Pzogc3RyaW5nO1xuICAgICAgcGFyYW1zPzogeyBbX2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICAgIGhlYWRlcnM/OiB7IFtfaW5kZXg6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIH0gPSB7fVxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5iYWNrZW5kXG4gICAgICAuZ2V0KHRoaXMsIHRoaXMuZ2V0VXJsKGlkLCB7IHByZWZpeCwgc3VmZml4IH0pLCB7IGhlYWRlcnMsIHBhcmFtcyB9KVxuICAgICAgLnBpcGUobWFwKChyZXN1bHQpID0+IHRoaXMuZnJvbUpzb24ocmVzdWx0KSkpO1xuICB9XG5cbiAgcHVibGljIGFjdGlvbjxSVD4oXG4gICAgbW9kZWw6IFQgfCBudWxsLFxuICAgIG1ldGhvZDogSUh0dHBNZXRob2QsXG4gICAgYWN0aW9uOiBzdHJpbmcsXG4gICAgeyBib2R5ID0gdW5kZWZpbmVkLCBwYXJhbXMgPSB7fSwgaGVhZGVycyA9IHt9IH06IElBY3Rpb25QYXJhbXMgPSB7fVxuICApOiBPYnNlcnZhYmxlPFJUPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFja2VuZC5hY3Rpb248VCwgUlQ+KFxuICAgICAgdGhpcyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHRoaXMuZ2V0VXJsKG1vZGVsID8gbW9kZWwuaWQgOiBudWxsLCB7XG4gICAgICAgIHN1ZmZpeDogbW9kZWwgPyAnLycgKyBhY3Rpb24gOiBhY3Rpb24sXG4gICAgICB9KSxcbiAgICAgIHsgYm9keSwgcGFyYW1zLCBoZWFkZXJzIH1cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmUoXG4gICAgbW9kZWw6IFQsXG4gICAgeyB1cGRhdGVNb2RlbCA9IHRydWUgfTogeyB1cGRhdGVNb2RlbD86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIGxldCBzYXZlTWV0aG9kID1cbiAgICAgIG1vZGVsLmlkICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmJhY2tlbmQucGF0Y2guYmluZCh0aGlzLmJhY2tlbmQpXG4gICAgICAgIDogdGhpcy5iYWNrZW5kLnBvc3QuYmluZCh0aGlzLmJhY2tlbmQpO1xuICAgIGxldCB1cmwgPSBtb2RlbC5pZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5nZXRVcmwobW9kZWwuaWQpIDogdGhpcy5nZXRVcmwoKTtcbiAgICByZXR1cm4gc2F2ZU1ldGhvZCh0aGlzLCB1cmwsIHsgYm9keTogbW9kZWwudG9Kc29uKCkgfSkucGlwZShcbiAgICAgIG1hcCgocmVzKSA9PiB0aGlzLmZyb21Kc29uKHJlcykpLFxuICAgICAgdGFwKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHVwZGF0ZU1vZGVsKSB7XG4gICAgICAgICAgbW9kZWwuZnJvbUpzb24ocmVzKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZShcbiAgICBtb2RlbDogVCxcbiAgICBmaWVsZHM6IHN0cmluZ1tdID0gW10sXG4gICAgeyB1cGRhdGVNb2RlbCA9IHRydWUgfTogeyB1cGRhdGVNb2RlbD86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIGxldCBzYXZlTWV0aG9kID1cbiAgICAgIG1vZGVsLmlkICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmJhY2tlbmQucGF0Y2guYmluZCh0aGlzLmJhY2tlbmQpXG4gICAgICAgIDogdGhpcy5iYWNrZW5kLnBvc3QuYmluZCh0aGlzLmJhY2tlbmQpO1xuICAgIGxldCB1cmwgPSBtb2RlbC5pZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5nZXRVcmwobW9kZWwuaWQpIDogdGhpcy5nZXRVcmwoKTtcbiAgICByZXR1cm4gc2F2ZU1ldGhvZCh0aGlzLCB1cmwsIHsgYm9keTogbW9kZWwudG9Kc29uKGZpZWxkcykgfSkucGlwZShcbiAgICAgIG1hcCgocmVzKSA9PiB0aGlzLmZyb21Kc29uKHJlcykpLFxuICAgICAgdGFwKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHVwZGF0ZU1vZGVsKSB7XG4gICAgICAgICAgbW9kZWwuZnJvbUpzb24ocmVzKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShcbiAgICBtb2RlbDogVCxcbiAgICB7IHBhcmFtcyA9IHt9LCBoZWFkZXJzID0ge30gfTogSUFjdGlvblBhcmFtcyA9IHt9XG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYmFja2VuZC5kZWxldGUodGhpcywgdGhpcy5nZXRVcmwobW9kZWwuaWQpLCB7XG4gICAgICBwYXJhbXMsXG4gICAgICBoZWFkZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGxpc3QoXG4gICAgcXVlcnk6IEZpbHRlckRhdGEgPSB7fSxcbiAgICB7XG4gICAgICBwcmVmaXggPSAnJyxcbiAgICAgIHN1ZmZpeCA9ICcnLFxuICAgICAgcGFyYW1zID0ge30sXG4gICAgICBoZWFkZXJzID0ge30sXG4gICAgfToge1xuICAgICAgcHJlZml4Pzogc3RyaW5nO1xuICAgICAgc3VmZml4Pzogc3RyaW5nO1xuICAgICAgcGFyYW1zPzogeyBbX2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICAgIGhlYWRlcnM/OiB7IFtfaW5kZXg6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIH0gPSB7fVxuICApOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgIGNvbnN0IHFyeSA9IE9iamVjdC5hc3NpZ24oe30sIHF1ZXJ5LCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLmJhY2tlbmRcbiAgICAgIC5saXN0KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmdldFVybChudWxsLCB7IHN1ZmZpeCwgcHJlZml4IH0pLFxuICAgICAgICAvLyBTRUU6IGZvcmNlZCB0eXBlY2FzdCBtYXliZSBiYWRcbiAgICAgICAgeyBwYXJhbXM6IHFyeSwgaGVhZGVycyB9XG4gICAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgLy8gRklYTUU6IHBhcmFtZXRyaXplIHBhZ2luYXRlZCByZXN1bHRzIGFjY2Vzc1xuICAgICAgICBtYXAoKHJlc3VsdDogeyByZXN1bHRzOiBQYXJ0aWFsPFQ+W10gfSkgPT5cbiAgICAgICAgICB0aGlzLmZyb21Kc29uKHJlc3VsdC5yZXN1bHRzKVxuICAgICAgICApXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzICptZXRob2QqIGVuZHBvaW50IGZvciB0aGlzIGNvbGxlY3Rpb24gYW5kIHJldHVybnMgcmF3IHJlc3VsdHMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgR0VUL1BPU1QvLi4uXG4gICAqIEBwYXJhbSBwcmVmaXggY29sbGVjdGlvbl91cmxQUkVGSVhTVUZGSVhcbiAgICogQHBhcmFtIHN1ZmZpeCBjb2xsZWN0aW9uX3VybFBSRUZJWFNVRkZJWFxuICAgKiBAcGFyYW0gcGFyYW1zIHF1ZXJ5IHBhcmVtZXRlcnNcbiAgICogQHBhcmFtIGJvZHkgYm9keSBhcyBqc29uXG4gICAqIEBwYXJhbSBoZWFkZXJzIGhlYWRlcnNcbiAgICovXG4gIHB1YmxpYyByYXc8UlQ+KHtcbiAgICBtZXRob2QgPSAnR0VUJyxcbiAgICBwcmVmaXggPSAnJyxcbiAgICBzdWZmaXggPSAnJyxcbiAgICBwYXJhbXMgPSB7fSxcbiAgICBib2R5ID0ge30sXG4gICAgaGVhZGVycyA9IHt9LFxuICB9OiB7XG4gICAgbWV0aG9kPzogSUh0dHBNZXRob2Q7XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHN1ZmZpeD86IHN0cmluZztcbiAgICBib2R5PzogYW55O1xuICAgIHBhcmFtcz86IHsgW19pbmRleDogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgaGVhZGVycz86IHsgW19pbmRleDogc3RyaW5nXTogc3RyaW5nIH07XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8UlQ+IHtcbiAgICByZXR1cm4gdGhpcy5iYWNrZW5kLmFjdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBtZXRob2QsXG4gICAgICB0aGlzLmdldFVybChudWxsLCB7IHN1ZmZpeCwgcHJlZml4IH0pLFxuICAgICAge1xuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVcmwoXG4gICAgaWQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHsgcHJlZml4ID0gJycsIHN1ZmZpeCA9ICcnIH06IHsgcHJlZml4Pzogc3RyaW5nOyBzdWZmaXg/OiBzdHJpbmcgfSA9IHt9XG4gICk6IHN0cmluZyB7XG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHtcbiAgICAgIGlmIChwcmVmaXggfHwgc3VmZml4KSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmJhY2tlbmQuYXBpVXJsfSR7dGhpcy5wYXRofS8ke3ByZWZpeH0ke3N1ZmZpeH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuYmFja2VuZC5hcGlVcmx9JHt0aGlzLnBhdGh9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMuYmFja2VuZC5hcGlVcmx9JHt0aGlzLnBhdGh9LyR7cHJlZml4fSR7aWR9JHtzdWZmaXh9YDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { of } from "rxjs";
|
|
2
|
+
import { QuerysetMock } from "./data-query.mock";
|
|
3
|
+
export class CollectionMock {
|
|
4
|
+
constructor(model) {
|
|
5
|
+
this.model = model;
|
|
6
|
+
}
|
|
7
|
+
fetch(id, suffix = "") {
|
|
8
|
+
return of(this.mockValue);
|
|
9
|
+
}
|
|
10
|
+
action(model, method, action, params) {
|
|
11
|
+
return of(this.actionValue);
|
|
12
|
+
}
|
|
13
|
+
queryset(options = {}) {
|
|
14
|
+
return new QuerysetMock(this, options);
|
|
15
|
+
}
|
|
16
|
+
list(query = {}, suffix = "") {
|
|
17
|
+
return of({ results: this.mockValues });
|
|
18
|
+
}
|
|
19
|
+
fromJson(data, many = false) {
|
|
20
|
+
if (data && data.id !== undefined) {
|
|
21
|
+
const m = new this.model(this);
|
|
22
|
+
m.fromJson(data);
|
|
23
|
+
return m;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
if (many && data && data.length) {
|
|
27
|
+
const out = [];
|
|
28
|
+
for (const r of data) {
|
|
29
|
+
const ri = new this.model(this);
|
|
30
|
+
ri.fromJson(r);
|
|
31
|
+
out.push(ri);
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
return data;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1jb2xsZWN0aW9uLm1vY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhL3NyYy9saWIvZGF0YS9kYXRhLWNvbGxlY3Rpb24ubW9jay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWEsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUcvQyxNQUFNLE9BQU8sY0FBYztJQUt6QixZQUFzQixLQUFvQztRQUFwQyxVQUFLLEdBQUwsS0FBSyxDQUErQjtJQUMxRCxDQUFDO0lBRU0sS0FBSyxDQUFDLEVBQVUsRUFBRSxTQUFpQixFQUFFO1FBQzFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFjLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU0sTUFBTSxDQUFDLEtBQWUsRUFBRSxNQUFtQixFQUFFLE1BQWMsRUFBRSxNQUFxQjtRQUN2RixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVNLFFBQVEsQ0FBQyxVQUE0QixFQUFFO1FBQzVDLE9BQU8sSUFBSSxZQUFZLENBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxJQUFJLENBQUMsUUFBcUMsRUFBRSxFQUFFLFNBQWlCLEVBQUU7UUFDdEUsT0FBTyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFTLEVBQUUsT0FBZ0IsS0FBSztRQUN2QyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBVyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQixPQUFPLENBQUMsQ0FBQztTQUNWO2FBQU07WUFDTCxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDL0IsTUFBTSxHQUFHLEdBQVEsRUFBRSxDQUFDO2dCQUNwQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDcEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQVcsQ0FBQyxDQUFDO29CQUN2QyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2Q7Z0JBQ0QsT0FBTyxHQUFHLENBQUM7YUFDWjtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RhdGFNb2RlbH0gZnJvbSBcIi4vZGF0YS1tb2RlbFwiO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7SVF1ZXJ5c2V0T3B0aW9uc30gZnJvbSBcIi4vZGF0YS1xdWVyeVwiO1xuaW1wb3J0IHtRdWVyeXNldE1vY2t9IGZyb20gXCIuL2RhdGEtcXVlcnkubW9ja1wiO1xuaW1wb3J0IHtDb2xsZWN0aW9uLCBJQWN0aW9uUGFyYW1zLCBJSHR0cE1ldGhvZH0gZnJvbSBcIi4vZGF0YS1jb2xsZWN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTW9jazxUIGV4dGVuZHMgRGF0YU1vZGVsPiB7XG4gIHB1YmxpYyBtb2NrVmFsdWU/OiBUO1xuICBwdWJsaWMgbW9ja1ZhbHVlcz86IFRbXTtcbiAgcHVibGljIGFjdGlvblZhbHVlOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIG1vZGVsOiBuZXcoY29sbDogQ29sbGVjdGlvbjxUPikgPT4gVCkge1xuICB9XG5cbiAgcHVibGljIGZldGNoKGlkOiBudW1iZXIsIHN1ZmZpeDogc3RyaW5nID0gXCJcIik6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiBvZih0aGlzLm1vY2tWYWx1ZSBhcyBUKTtcbiAgfVxuXG4gIHB1YmxpYyBhY3Rpb24obW9kZWw6IFQgfCBudWxsLCBtZXRob2Q6IElIdHRwTWV0aG9kLCBhY3Rpb246IHN0cmluZywgcGFyYW1zOiBJQWN0aW9uUGFyYW1zKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gb2YodGhpcy5hY3Rpb25WYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgcXVlcnlzZXQob3B0aW9uczogSVF1ZXJ5c2V0T3B0aW9ucyA9IHt9KTogUXVlcnlzZXRNb2NrPFQ+IHtcbiAgICByZXR1cm4gbmV3IFF1ZXJ5c2V0TW9jazxUPih0aGlzLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBsaXN0KHF1ZXJ5OiB7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fSwgc3VmZml4OiBzdHJpbmcgPSBcIlwiKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gb2Yoe3Jlc3VsdHM6IHRoaXMubW9ja1ZhbHVlc30pO1xuICB9XG5cbiAgZnJvbUpzb24oZGF0YTogYW55LCBtYW55OiBib29sZWFuID0gZmFsc2UpOiBUIHwgYW55IHtcbiAgICBpZiAoZGF0YSAmJiBkYXRhLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG0gPSBuZXcgdGhpcy5tb2RlbCh0aGlzIGFzIGFueSk7XG4gICAgICBtLmZyb21Kc29uKGRhdGEpO1xuICAgICAgcmV0dXJuIG07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtYW55ICYmIGRhdGEgJiYgZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgb3V0OiBUW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByIG9mIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCByaSA9IG5ldyB0aGlzLm1vZGVsKHRoaXMgYXMgYW55KTtcbiAgICAgICAgICByaS5mcm9tSnNvbihyKTtcbiAgICAgICAgICBvdXQucHVzaChyaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfVxufVxuIl19
|