change permission subject

This commit is contained in:
rubikscraft 2022-03-13 20:04:26 +01:00
parent ac72035f76
commit be5689f7fb
No known key found for this signature in database
GPG key ID: 1463EBE9200A5CD4
2 changed files with 16 additions and 14 deletions

View file

@ -6,7 +6,7 @@ import {
PermissionsList
} from 'picsur-shared/dist/dto/permissions';
import { AsyncFailable, HasFailed } from 'picsur-shared/dist/types';
import { BehaviorSubject } from 'rxjs';
import { BehaviorSubject, filter, Observable, take } from 'rxjs';
import { ApiService } from './api.service';
import { UserService } from './user.service';
@ -18,18 +18,24 @@ export class PermissionService {
this.onUser();
}
public get live() {
return this.permissionsSubject;
public get live(): Observable<Permissions> {
return this.permissionsSubject.pipe(
filter((v) => v !== null)
) as Observable<Permissions>;
}
public get snapshot() {
return this.permissionsSubject.getValue();
public get snapshot(): Permissions {
return (
this.permissionsSubject.getValue() ?? (PermissionsList as Permissions)
);
}
public loadedSnapshot(): Promise<Permissions> {
return new Promise((resolve) => this.live.pipe(take(1)).subscribe(resolve));
}
// Lets be optimistic for better ux
private permissionsSubject = new BehaviorSubject<Permissions>(
PermissionsList as Permissions
);
private permissionsSubject = new BehaviorSubject<Permissions | null>(null);
@AutoUnsubscribe()
private onUser() {

View file

@ -14,7 +14,7 @@ import { PermissionService } from '../api/permission.service';
export class PermissionGuard implements CanActivate {
constructor(private permissionService: PermissionService) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const requiredPermissions: Permissions = route.data['permissions'];
if (!isPermissionsArray(requiredPermissions)) {
throw new Error(
@ -22,16 +22,12 @@ export class PermissionGuard implements CanActivate {
);
}
const ourPermissions = this.permissionService.snapshot;
const ourPermissions = await this.permissionService.loadedSnapshot();
const isOk = requiredPermissions.every((permission) =>
ourPermissions.includes(permission)
);
console.log(
`PermissionGuard: requiredPermissions=${requiredPermissions} ourPermissions=${ourPermissions} isOk=${isOk}`
);
return isOk;
}
}