admin.guard.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132
  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.session()?.passwordResetRequired&&state.url!=='/admin/change-password')return inject(Router).createUrlTree(['/admin/change-password']);
  9. if (sessions.isAuthenticated()) return true;
  10. return inject(Router).createUrlTree(['/admin/login'], { queryParams: { returnUrl: state.url } });
  11. };
  12. export const superAdminGuard: CanActivateFn = async (_route, state) => {
  13. const sessions = inject(AdminSessionService);
  14. const router = inject(Router);
  15. if (!sessions.isAuthenticated()) return router.createUrlTree(['/admin/login'], { queryParams: { returnUrl: state.url } });
  16. if (sessions.session()?.isSuperAdmin === true) return true;
  17. try {
  18. const identity = (await inject(CloudFunctionsService).admin<{ identity: AdminIdentity }>('meta')).identity;
  19. sessions.applyIdentity(identity);
  20. return identity.isSuperAdmin ? true : router.createUrlTree(['/admin/forbidden']);
  21. } catch {
  22. return router.createUrlTree(['/admin/forbidden']);
  23. }
  24. };
  25. export const operatorManagerGuard: CanActivateFn = async () => {
  26. const sessions=inject(AdminSessionService),router=inject(Router),functions=inject(CloudFunctionsService);
  27. 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']); }
  28. catch { return router.createUrlTree(['/admin/forbidden']); }
  29. };