ohayolibs
Version:
Ohayo is a set of essential modules for ohayojp.
52 lines (48 loc) • 1.67 kB
text/typescript
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, CanActivateChild, CanLoad, Data, Route, Router, RouterStateSnapshot } from '@angular/router';
import { Observable, of } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { ACLService } from './acl.service';
import { ACLCanType } from './acl.type';
/**
* Routing guard prevent unauthorized users visit the page, [ACL Document](https://ohayojp.com/acl).
*
* ```ts
* data: {
* path: 'home',
* canActivate: [ ACLGuard ],
* data: { guard: 'user1' }
* }
* ```
*/
export class ACLGuard implements CanActivate, CanActivateChild, CanLoad {
constructor(private srv: ACLService, private router: Router) { }
private process(data: Data): Observable<boolean> {
data = {
guard: null,
guard_url: this.srv.guard_url,
...data,
};
const guard: ACLCanType | Observable<ACLCanType> = data.guard;
return (guard && guard instanceof Observable ? guard : of(guard != null ? (guard as ACLCanType) : null)).pipe(
map(v => this.srv.can(v)),
tap(v => {
if (v) return;
this.router.navigateByUrl(data.guard_url);
}),
);
}
// lazy loading
canLoad(route: Route): Observable<boolean> {
return this.process(route.data!);
}
// all children route
canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.canActivate(childRoute, state);
}
// route
canActivate(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot | null): Observable<boolean> {
return this.process(route.data);
}
}