-
-
Notifications
You must be signed in to change notification settings - Fork 468
/
permission.service.ts
117 lines (103 loc) · 4.33 KB
/
permission.service.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/**
* Copyright 2023-present DreamNum Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import type { Observable } from 'rxjs';
import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
import { map } from 'rxjs/operators';
import { Disposable } from '../../shared';
import type { IPermissionPoint, IPermissionService } from './type';
import { PermissionStatus } from './type';
export class PermissionService extends Disposable implements IPermissionService {
private _permissionPointMap: Map<string, BehaviorSubject<IPermissionPoint<any>>> = new Map();
private _permissionPointUpdate$ = new Subject<IPermissionPoint<unknown>>();
public permissionPointUpdate$ = this._permissionPointUpdate$.asObservable();
deletePermissionPoint(permissionId: string) {
const permissionPoint = this._permissionPointMap.get(permissionId);
if (permissionPoint) {
permissionPoint.complete();
this._permissionPointMap.delete(permissionId);
}
};
addPermissionPoint<T = boolean>(_item: IPermissionPoint<T> | BehaviorSubject<IPermissionPoint<T>>) {
const isSubject = _item instanceof BehaviorSubject;
const item = isSubject ? _item.getValue() : _item;
if (!item.id) {
return false;
}
const permissionPoint = this._permissionPointMap.get(item.id);
if (permissionPoint) {
throw new Error(`${item.id} PermissionPoint already exists`);
}
this._permissionPointMap.set(item.id, isSubject ? _item : new BehaviorSubject<IPermissionPoint<unknown>>(item));
this._permissionPointUpdate$.next(item);
return true;
};
updatePermissionPoint<T = boolean>(permissionId: string, value: T) {
const permissionPoint = this._permissionPointMap.get(permissionId);
if (!permissionPoint) {
return;
}
const subject = permissionPoint.getValue() as IPermissionPoint<T>;
subject.value = value;
subject.status = PermissionStatus.DONE;
permissionPoint.next({ ...subject });
this._permissionPointUpdate$.next(subject);
};
clearPermissionMap() {
this._permissionPointMap.clear();
};
getPermissionPoint<T = boolean>(permissionId: string) {
const permissionPoint = this._permissionPointMap.get(permissionId);
if (!permissionPoint) return;
return permissionPoint.getValue() as IPermissionPoint<T>;
};
getPermissionPoint$<T = boolean>(permissionId: string) {
const permissionPoint = this._permissionPointMap.get(permissionId);
if (!permissionPoint) return;
return permissionPoint as Observable<IPermissionPoint<T>>;
};
composePermission$(permissionIdList: string[]) {
const subjectList = permissionIdList.map((id) => {
const subject = this._permissionPointMap?.get(id);
if (!subject) {
throw new Error(`[PermissionService]: ${id} permissionPoint does not exist!`);
}
return subject.asObservable();
});
return combineLatest(subjectList).pipe(
// Check that all permissions exist
map((list) => {
return list;
})
);
}
composePermission(permissionIdList: string[]) {
const valueList = permissionIdList.map((id) => {
const subject = this._permissionPointMap?.get(id);
if (!subject) {
throw new Error(`[PermissionService]: ${id} permissionPoint does not exist!`);
}
return subject.getValue();
});
return valueList;
}
getAllPermissionPoint() {
const cacheMap = new Map<string, BehaviorSubject<IPermissionPoint<unknown>>>();
this._permissionPointMap.forEach((v, key) => {
cacheMap.set(key, v);
});
return cacheMap;
}
}