admin.guard.ts 1.6 KB

12345678910111213141516171819202122232425262728293031
  1. import { inject } from '@angular/core';
  2. import { CanActivateFn, Router } from '@angular/router';
  3. import { AdminSessionService } from './admin-session.service';
  4. import { AdminIdentity } from './admin.models';
  5. import { CloudFunctionsService } from './cloud-functions.service';
  6. export const adminGuard: CanActivateFn = (_route, state) => {
  7. const sessions = inject(AdminSessionService);
  8. if (sessions.isAuthenticated()) return true;
  9. return inject(Router).createUrlTree(['/admin/login'], { queryParams: { returnUrl: state.url } });
  10. };
  11. export const superAdminGuard: CanActivateFn = async (_route, state) => {
  12. const sessions = inject(AdminSessionService);
  13. const router = inject(Router);
  14. if (!sessions.isAuthenticated()) return router.createUrlTree(['/admin/login'], { queryParams: { returnUrl: state.url } });
  15. if (sessions.session()?.isSuperAdmin === true) return true;
  16. try {
  17. const identity = (await inject(CloudFunctionsService).admin<{ identity: AdminIdentity }>('meta')).identity;
  18. sessions.applyIdentity(identity);
  19. return identity.isSuperAdmin ? true : router.createUrlTree(['/admin/forbidden']);
  20. } catch {
  21. return router.createUrlTree(['/admin/forbidden']);
  22. }
  23. };
  24. export const operatorManagerGuard: CanActivateFn = async () => {
  25. const sessions=inject(AdminSessionService),router=inject(Router),functions=inject(CloudFunctionsService);
  26. try { const identity=(await functions.admin<{identity:AdminIdentity}>('meta')).identity; sessions.applyIdentity(identity); return identity.isSuperAdmin||identity.operationsRole==='ops-manager'?true:router.createUrlTree(['/admin/forbidden']); }
  27. catch { return router.createUrlTree(['/admin/forbidden']); }
  28. };