Browse Source

Guards mapped & refactored

pull/16739/head
Masum ULU 3 years ago
parent
commit
843b2de3a8
  1. 19
      npm/ng-packs/packages/account/src/lib/account-routing.module.ts
  2. 9
      npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts
  3. 28
      npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts
  4. 9
      npm/ng-packs/packages/core/src/lib/abstracts/abstract-guard.ts
  5. 7
      npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts
  6. 1
      npm/ng-packs/packages/core/src/lib/abstracts/index.ts
  7. 28
      npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts
  8. 57
      npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts
  9. 16
      npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts
  10. 19
      npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts
  11. 6
      npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts
  12. 59
      npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts
  13. 8
      npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts

19
npm/ng-packs/packages/account/src/lib/account-routing.module.ts

@ -1,20 +1,22 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes, mapToCanActivate } from '@angular/router';
import { import {
AuthGuard, AuthGuard,
ReplaceableComponents, ReplaceableComponents,
ReplaceableRouteContainerComponent, ReplaceableRouteContainerComponent,
RouterOutletComponent, RouterOutletComponent,
} from '@abp/ng.core'; } from '@abp/ng.core';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ForgotPasswordComponent } from './components/forgot-password/forgot-password.component'; import { ForgotPasswordComponent } from './components/forgot-password/forgot-password.component';
import { LoginComponent } from './components/login/login.component'; import { LoginComponent } from './components/login/login.component';
import { ManageProfileComponent } from './components/manage-profile/manage-profile.component'; import { ManageProfileComponent } from './components/manage-profile/manage-profile.component';
import { RegisterComponent } from './components/register/register.component'; import { RegisterComponent } from './components/register/register.component';
import { ResetPasswordComponent } from './components/reset-password/reset-password.component'; import { ResetPasswordComponent } from './components/reset-password/reset-password.component';
import { eAccountComponents } from './enums/components'; import { eAccountComponents } from './enums/components';
import { AuthenticationFlowGuard } from './guards/authentication-flow.guard'; import { AccountExtensionsGuard, AuthenticationFlowGuard } from './guards';
import { AccountExtensionsGuard } from './guards';
const canActivate = mapToCanActivate([AuthenticationFlowGuard]);
const routes: Routes = [ const routes: Routes = [
{ path: '', pathMatch: 'full', redirectTo: 'login' }, { path: '', pathMatch: 'full', redirectTo: 'login' },
@ -25,7 +27,7 @@ const routes: Routes = [
{ {
path: 'login', path: 'login',
component: ReplaceableRouteContainerComponent, component: ReplaceableRouteContainerComponent,
canActivate: [AuthenticationFlowGuard], canActivate,
data: { data: {
replaceableComponent: { replaceableComponent: {
key: eAccountComponents.Login, key: eAccountComponents.Login,
@ -36,7 +38,7 @@ const routes: Routes = [
{ {
path: 'register', path: 'register',
component: ReplaceableRouteContainerComponent, component: ReplaceableRouteContainerComponent,
canActivate: [AuthenticationFlowGuard], canActivate,
data: { data: {
replaceableComponent: { replaceableComponent: {
key: eAccountComponents.Register, key: eAccountComponents.Register,
@ -47,7 +49,8 @@ const routes: Routes = [
{ {
path: 'forgot-password', path: 'forgot-password',
component: ReplaceableRouteContainerComponent, component: ReplaceableRouteContainerComponent,
canActivate: [AuthenticationFlowGuard], canActivate,
data: { data: {
replaceableComponent: { replaceableComponent: {
key: eAccountComponents.ForgotPassword, key: eAccountComponents.ForgotPassword,
@ -70,7 +73,7 @@ const routes: Routes = [
{ {
path: 'manage', path: 'manage',
component: ReplaceableRouteContainerComponent, component: ReplaceableRouteContainerComponent,
canActivate: [AuthGuard, AccountExtensionsGuard], canActivate: mapToCanActivate([AuthGuard, AccountExtensionsGuard]),
data: { data: {
replaceableComponent: { replaceableComponent: {
key: eAccountComponents.ManageProfile, key: eAccountComponents.ManageProfile,

9
npm/ng-packs/packages/account/src/lib/guards/authentication-flow.guard.ts

@ -1,10 +1,9 @@
import { AuthService } from '@abp/ng.core'; import { AuthService, IAbpGuard } from '@abp/ng.core';
import { Injectable } from '@angular/core'; import { Injectable, inject } from '@angular/core';
@Injectable() @Injectable()
export class AuthenticationFlowGuard { export class AuthenticationFlowGuard implements IAbpGuard {
constructor(private authService: AuthService) {} protected readonly authService = inject(AuthService);
canActivate() { canActivate() {
if (this.authService.isInternalAuth) return true; if (this.authService.isInternalAuth) return true;

28
npm/ng-packs/packages/account/src/lib/guards/extensions.guard.ts

@ -1,46 +1,46 @@
import { Injectable, Injector } from '@angular/core'; import { Injectable, inject } from '@angular/core';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { tap, map } from 'rxjs/operators';
import { ConfigStateService, IAbpGuard } from '@abp/ng.core';
import { import {
ExtensionsService, ExtensionsService,
getObjectExtensionEntitiesFromStore, getObjectExtensionEntitiesFromStore,
mapEntitiesToContributors, mapEntitiesToContributors,
mergeWithDefaultProps, mergeWithDefaultProps,
} from '@abp/ng.theme.shared/extensions'; } from '@abp/ng.theme.shared/extensions';
import { ConfigStateService } from '@abp/ng.core';
import { tap, map, mapTo } from 'rxjs/operators';
import { import {
ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS, ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS,
DEFAULT_ACCOUNT_FORM_PROPS, DEFAULT_ACCOUNT_FORM_PROPS,
} from '../tokens/extensions.token'; } from '../tokens/extensions.token';
import { AccountEditFormPropContributors } from '../models/config-options';
import { eAccountComponents } from '../enums/components'; import { eAccountComponents } from '../enums/components';
@Injectable() @Injectable()
export class AccountExtensionsGuard { export class AccountExtensionsGuard implements IAbpGuard {
constructor(private injector: Injector) {} protected readonly configState = inject(ConfigStateService);
protected readonly extensions = inject(ExtensionsService);
canActivate(): Observable<boolean> { canActivate(): Observable<boolean> {
const extensions: ExtensionsService = this.injector.get(ExtensionsService); const config = { optional: true };
const editFormContributors: AccountEditFormPropContributors = const editFormContributors = inject(ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS, config) || {};
this.injector.get(ACCOUNT_EDIT_FORM_PROP_CONTRIBUTORS, null) || {};
const configState = this.injector.get(ConfigStateService); return getObjectExtensionEntitiesFromStore(this.configState, 'Identity').pipe(
return getObjectExtensionEntitiesFromStore(configState, 'Identity').pipe(
map(entities => ({ map(entities => ({
[eAccountComponents.PersonalSettings]: entities.User, [eAccountComponents.PersonalSettings]: entities.User,
})), })),
mapEntitiesToContributors(configState, 'AbpIdentity'), mapEntitiesToContributors(this.configState, 'AbpIdentity'),
tap(objectExtensionContributors => { tap(objectExtensionContributors => {
mergeWithDefaultProps( mergeWithDefaultProps(
extensions.editFormProps, this.extensions.editFormProps,
DEFAULT_ACCOUNT_FORM_PROPS, DEFAULT_ACCOUNT_FORM_PROPS,
objectExtensionContributors.editForm, objectExtensionContributors.editForm,
editFormContributors, editFormContributors,
); );
}), }),
mapTo(true), map(() => true),
); );
} }
} }

9
npm/ng-packs/packages/core/src/lib/abstracts/abstract-guard.ts

@ -0,0 +1,9 @@
import { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';
export interface IAbpGuard {
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree;
}

7
npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts

@ -1,13 +1,14 @@
import { Injectable } from '@angular/core';
import { UrlTree } from '@angular/router'; import { UrlTree } from '@angular/router';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { Injectable } from '@angular/core'; import { IAbpGuard } from './abstract-guard';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
export class AuthGuard implements IAuthGuard { export class AuthGuard implements IAbpGuard {
canActivate(): Observable<boolean> | boolean | UrlTree { canActivate(): Observable<boolean> | boolean | UrlTree {
console.error('You should add @abp/ng-oauth packages or create your own auth packages.'); console.error('You should add @abp/ng-oauth packages or create your own auth packages.');
return false; return false;
} }
} }
export interface IAuthGuard {}

1
npm/ng-packs/packages/core/src/lib/abstracts/index.ts

@ -1,3 +1,4 @@
export * from './abstract-guard';
export * from './ng-model.component'; export * from './ng-model.component';
export * from './auth.guard'; export * from './auth.guard';
export * from './auth.service'; export * from './auth.service';

28
npm/ng-packs/packages/core/src/lib/guards/permission.guard.ts

@ -1,23 +1,25 @@
import { HttpErrorResponse } from '@angular/common/http'; import { Injectable, inject } from '@angular/core';
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router';
import { HttpErrorResponse } from '@angular/common/http';
import { Observable, of } from 'rxjs'; import { Observable, of } from 'rxjs';
import { tap } from 'rxjs/operators'; import { tap } from 'rxjs/operators';
import { HttpErrorReporterService } from '../services/http-error-reporter.service';
import { PermissionService } from '../services/permission.service'; import { OAuthService } from 'angular-oauth2-oidc';
import { RoutesService } from '../services/routes.service';
import { IAbpGuard } from '../abstracts';
import { findRoute, getRoutePath } from '../utils/route-utils'; import { findRoute, getRoutePath } from '../utils/route-utils';
import { RoutesService, PermissionService, HttpErrorReporterService } from '../services';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
export class PermissionGuard { export class PermissionGuard implements IAbpGuard {
constructor( protected readonly router = inject(Router);
private router: Router, protected readonly routesService = inject(RoutesService);
private routesService: RoutesService, protected readonly oAuthService = inject(OAuthService);
private permissionService: PermissionService, protected readonly permissionService = inject(PermissionService);
private httpErrorReporter: HttpErrorReporterService, protected readonly httpErrorReporter = inject(HttpErrorReporterService);
) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
let { requiredPolicy } = route.data || {}; let { requiredPolicy } = route.data || {};
@ -31,7 +33,7 @@ export class PermissionGuard {
return this.permissionService.getGrantedPolicy$(requiredPolicy).pipe( return this.permissionService.getGrantedPolicy$(requiredPolicy).pipe(
tap(access => { tap(access => {
if (!access) { if (!access && this.oAuthService.hasValidAccessToken()) {
this.httpErrorReporter.reportError({ status: 403 } as HttpErrorResponse); this.httpErrorReporter.reportError({ status: 403 } as HttpErrorResponse);
} }
}), }),

57
npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts

@ -1,4 +1,9 @@
import { ConfigStateService } from '@abp/ng.core'; import { Injectable, inject } from '@angular/core';
import { Observable } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { ConfigStateService, IAbpGuard } from '@abp/ng.core';
import { import {
ExtensionsService, ExtensionsService,
getObjectExtensionEntitiesFromStore, getObjectExtensionEntitiesFromStore,
@ -6,18 +11,8 @@ import {
mergeWithDefaultActions, mergeWithDefaultActions,
mergeWithDefaultProps, mergeWithDefaultProps,
} from '@abp/ng.theme.shared/extensions'; } from '@abp/ng.theme.shared/extensions';
import { Injectable, Injector } from '@angular/core';
import { Observable } from 'rxjs';
import { map, mapTo, tap } from 'rxjs/operators';
import { eIdentityComponents } from '../enums/components'; import { eIdentityComponents } from '../enums/components';
import {
IdentityCreateFormPropContributors,
IdentityEditFormPropContributors,
IdentityEntityActionContributors,
IdentityEntityPropContributors,
IdentityToolbarActionContributors,
} from '../models/config-options';
import { import {
DEFAULT_IDENTITY_CREATE_FORM_PROPS, DEFAULT_IDENTITY_CREATE_FORM_PROPS,
DEFAULT_IDENTITY_EDIT_FORM_PROPS, DEFAULT_IDENTITY_EDIT_FORM_PROPS,
@ -32,60 +27,56 @@ import {
} from '../tokens/extensions.token'; } from '../tokens/extensions.token';
@Injectable() @Injectable()
export class IdentityExtensionsGuard { export class IdentityExtensionsGuard implements IAbpGuard {
constructor(private injector: Injector) {} protected readonly configState = inject(ConfigStateService);
protected readonly extensions = inject(ExtensionsService);
canActivate(): Observable<boolean> { canActivate(): Observable<boolean> {
const extensions: ExtensionsService = this.injector.get(ExtensionsService); const config = { optional: true };
const actionContributors: IdentityEntityActionContributors =
this.injector.get(IDENTITY_ENTITY_ACTION_CONTRIBUTORS, null) || {}; const actionContributors = inject(IDENTITY_ENTITY_ACTION_CONTRIBUTORS, config) || {};
const toolbarContributors: IdentityToolbarActionContributors = const toolbarContributors = inject(IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS, config) || {};
this.injector.get(IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS, null) || {}; const propContributors = inject(IDENTITY_ENTITY_PROP_CONTRIBUTORS, config) || {};
const propContributors: IdentityEntityPropContributors = const createFormContributors = inject(IDENTITY_CREATE_FORM_PROP_CONTRIBUTORS, config) || {};
this.injector.get(IDENTITY_ENTITY_PROP_CONTRIBUTORS, null) || {}; const editFormContributors = inject(IDENTITY_EDIT_FORM_PROP_CONTRIBUTORS, config) || {};
const createFormContributors: IdentityCreateFormPropContributors =
this.injector.get(IDENTITY_CREATE_FORM_PROP_CONTRIBUTORS, null) || {};
const editFormContributors: IdentityEditFormPropContributors =
this.injector.get(IDENTITY_EDIT_FORM_PROP_CONTRIBUTORS, null) || {};
const configState = this.injector.get(ConfigStateService); return getObjectExtensionEntitiesFromStore(this.configState, 'Identity').pipe(
return getObjectExtensionEntitiesFromStore(configState, 'Identity').pipe(
map(entities => ({ map(entities => ({
[eIdentityComponents.Roles]: entities.Role, [eIdentityComponents.Roles]: entities.Role,
[eIdentityComponents.Users]: entities.User, [eIdentityComponents.Users]: entities.User,
})), })),
mapEntitiesToContributors(configState, 'AbpIdentity'), mapEntitiesToContributors(this.configState, 'AbpIdentity'),
tap(objectExtensionContributors => { tap(objectExtensionContributors => {
mergeWithDefaultActions( mergeWithDefaultActions(
extensions.entityActions, this.extensions.entityActions,
DEFAULT_IDENTITY_ENTITY_ACTIONS, DEFAULT_IDENTITY_ENTITY_ACTIONS,
actionContributors, actionContributors,
); );
mergeWithDefaultActions( mergeWithDefaultActions(
extensions.toolbarActions, this.extensions.toolbarActions,
DEFAULT_IDENTITY_TOOLBAR_ACTIONS, DEFAULT_IDENTITY_TOOLBAR_ACTIONS,
toolbarContributors, toolbarContributors,
); );
mergeWithDefaultProps( mergeWithDefaultProps(
extensions.entityProps, this.extensions.entityProps,
DEFAULT_IDENTITY_ENTITY_PROPS, DEFAULT_IDENTITY_ENTITY_PROPS,
objectExtensionContributors.prop, objectExtensionContributors.prop,
propContributors, propContributors,
); );
mergeWithDefaultProps( mergeWithDefaultProps(
extensions.createFormProps, this.extensions.createFormProps,
DEFAULT_IDENTITY_CREATE_FORM_PROPS, DEFAULT_IDENTITY_CREATE_FORM_PROPS,
objectExtensionContributors.createForm, objectExtensionContributors.createForm,
createFormContributors, createFormContributors,
); );
mergeWithDefaultProps( mergeWithDefaultProps(
extensions.editFormProps, this.extensions.editFormProps,
DEFAULT_IDENTITY_EDIT_FORM_PROPS, DEFAULT_IDENTITY_EDIT_FORM_PROPS,
objectExtensionContributors.editForm, objectExtensionContributors.editForm,
editFormContributors, editFormContributors,
); );
}), }),
mapTo(true), map(() => true),
); );
} }
} }

16
npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts

@ -1,21 +1,25 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes, mapToCanActivate } from '@angular/router';
import { import {
AuthGuard, PermissionGuard, AuthGuard,
PermissionGuard,
ReplaceableComponents, ReplaceableComponents,
ReplaceableRouteContainerComponent, RouterOutletComponent ReplaceableRouteContainerComponent,
RouterOutletComponent,
} from '@abp/ng.core'; } from '@abp/ng.core';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { RolesComponent } from './components/roles/roles.component'; import { RolesComponent } from './components/roles/roles.component';
import { UsersComponent } from './components/users/users.component'; import { UsersComponent } from './components/users/users.component';
import { eIdentityComponents } from './enums/components'; import { eIdentityComponents } from './enums/components';
import { IdentityExtensionsGuard } from './guards/extensions.guard'; import { IdentityExtensionsGuard } from './guards';
const routes: Routes = [ const routes: Routes = [
{ path: '', redirectTo: 'roles', pathMatch: 'full' }, { path: '', redirectTo: 'roles', pathMatch: 'full' },
{ {
path: '', path: '',
component: RouterOutletComponent, component: RouterOutletComponent,
canActivate: [AuthGuard, PermissionGuard, IdentityExtensionsGuard], canActivate: mapToCanActivate([AuthGuard, PermissionGuard, IdentityExtensionsGuard]),
children: [ children: [
{ {
path: 'roles', path: 'roles',

19
npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts

@ -1,22 +1,27 @@
import { Injectable } from '@angular/core'; import { Injectable, inject } from '@angular/core';
import { UrlTree } from '@angular/router'; import { UrlTree } from '@angular/router';
import { OAuthService } from 'angular-oauth2-oidc'; import { HttpErrorResponse } from '@angular/common/http';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { AuthService, IAuthGuard } from '@abp/ng.core'; import { OAuthService } from 'angular-oauth2-oidc';
import { AuthService, HttpErrorReporterService, IAbpGuard } from '@abp/ng.core';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
export class AbpOAuthGuard implements IAuthGuard { export class AbpOAuthGuard implements IAbpGuard {
constructor(private oauthService: OAuthService, private authService: AuthService) {} protected readonly oAuthService = inject(OAuthService);
protected readonly authService = inject(AuthService);
protected readonly httpErrorReporter = inject(HttpErrorReporterService);
canActivate(): Observable<boolean> | boolean | UrlTree { canActivate(): Observable<boolean> | boolean | UrlTree {
const hasValidAccessToken = this.oauthService.hasValidAccessToken(); const hasValidAccessToken = this.oAuthService.hasValidAccessToken();
if (hasValidAccessToken) { if (hasValidAccessToken) {
return true; return true;
} }
this.authService.navigateToLogin(); this.httpErrorReporter.reportError({ status: 401 } as HttpErrorResponse);
return false; return false;
} }
} }

6
npm/ng-packs/packages/setting-management/src/lib/setting-management-routing.module.ts

@ -1,11 +1,11 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes, mapToCanActivate } from '@angular/router';
import { import {
AuthGuard, AuthGuard,
ReplaceableComponents, ReplaceableComponents,
ReplaceableRouteContainerComponent, ReplaceableRouteContainerComponent,
RouterOutletComponent, RouterOutletComponent,
} from '@abp/ng.core'; } from '@abp/ng.core';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { SettingManagementComponent } from './components/setting-management.component'; import { SettingManagementComponent } from './components/setting-management.component';
import { eSettingManagementComponents } from './enums/components'; import { eSettingManagementComponents } from './enums/components';
@ -13,7 +13,7 @@ const routes: Routes = [
{ {
path: '', path: '',
component: RouterOutletComponent, component: RouterOutletComponent,
canActivate: [AuthGuard], canActivate: mapToCanActivate([AuthGuard]),
children: [ children: [
{ {
path: '', path: '',

59
npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts

@ -1,4 +1,9 @@
import { ConfigStateService } from '@abp/ng.core'; import { Injectable, inject } from '@angular/core';
import { Observable } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { ConfigStateService, IAbpGuard } from '@abp/ng.core';
import { import {
ExtensionsService, ExtensionsService,
getObjectExtensionEntitiesFromStore, getObjectExtensionEntitiesFromStore,
@ -6,18 +11,8 @@ import {
mergeWithDefaultActions, mergeWithDefaultActions,
mergeWithDefaultProps, mergeWithDefaultProps,
} from '@abp/ng.theme.shared/extensions'; } from '@abp/ng.theme.shared/extensions';
import { Injectable, Injector } from '@angular/core';
import { Observable } from 'rxjs';
import { map, mapTo, tap } from 'rxjs/operators';
import { eTenantManagementComponents } from '../enums/components'; import { eTenantManagementComponents } from '../enums/components';
import {
TenantManagementCreateFormPropContributors,
TenantManagementEditFormPropContributors,
TenantManagementEntityActionContributors,
TenantManagementEntityPropContributors,
TenantManagementToolbarActionContributors,
} from '../models/config-options';
import { import {
DEFAULT_TENANT_MANAGEMENT_CREATE_FORM_PROPS, DEFAULT_TENANT_MANAGEMENT_CREATE_FORM_PROPS,
DEFAULT_TENANT_MANAGEMENT_EDIT_FORM_PROPS, DEFAULT_TENANT_MANAGEMENT_EDIT_FORM_PROPS,
@ -32,59 +27,57 @@ import {
} from '../tokens/extensions.token'; } from '../tokens/extensions.token';
@Injectable() @Injectable()
export class TenantManagementExtensionsGuard { export class TenantManagementExtensionsGuard implements IAbpGuard {
constructor(private injector: Injector) {} protected readonly configState = inject(ConfigStateService);
protected readonly extensions = inject(ExtensionsService);
canActivate(): Observable<boolean> { canActivate(): Observable<boolean> {
const extensions: ExtensionsService = this.injector.get(ExtensionsService); const config = { optional: true };
const actionContributors: TenantManagementEntityActionContributors =
this.injector.get(TENANT_MANAGEMENT_ENTITY_ACTION_CONTRIBUTORS, null) || {}; const actionContributors = inject(TENANT_MANAGEMENT_ENTITY_ACTION_CONTRIBUTORS, config) || {};
const toolbarContributors: TenantManagementToolbarActionContributors = const toolbarContributors = inject(TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, config) || {};
this.injector.get(TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, null) || {}; const propContributors = inject(TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS, config) || {};
const propContributors: TenantManagementEntityPropContributors = const createFormContributors =
this.injector.get(TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS, null) || {}; inject(TENANT_MANAGEMENT_CREATE_FORM_PROP_CONTRIBUTORS, config) || {};
const createFormContributors: TenantManagementCreateFormPropContributors = const editFormContributors =
this.injector.get(TENANT_MANAGEMENT_CREATE_FORM_PROP_CONTRIBUTORS, null) || {}; inject(TENANT_MANAGEMENT_EDIT_FORM_PROP_CONTRIBUTORS, config) || {};
const editFormContributors: TenantManagementEditFormPropContributors =
this.injector.get(TENANT_MANAGEMENT_EDIT_FORM_PROP_CONTRIBUTORS, null) || {};
const configState = this.injector.get(ConfigStateService); return getObjectExtensionEntitiesFromStore(this.configState, 'TenantManagement').pipe(
return getObjectExtensionEntitiesFromStore(configState, 'TenantManagement').pipe(
map(entities => ({ map(entities => ({
[eTenantManagementComponents.Tenants]: entities.Tenant, [eTenantManagementComponents.Tenants]: entities.Tenant,
})), })),
mapEntitiesToContributors(configState, 'TenantManagement'), mapEntitiesToContributors(this.configState, 'TenantManagement'),
tap(objectExtensionContributors => { tap(objectExtensionContributors => {
mergeWithDefaultActions( mergeWithDefaultActions(
extensions.entityActions, this.extensions.entityActions,
DEFAULT_TENANT_MANAGEMENT_ENTITY_ACTIONS, DEFAULT_TENANT_MANAGEMENT_ENTITY_ACTIONS,
actionContributors, actionContributors,
); );
mergeWithDefaultActions( mergeWithDefaultActions(
extensions.toolbarActions, this.extensions.toolbarActions,
DEFAULT_TENANT_MANAGEMENT_TOOLBAR_ACTIONS, DEFAULT_TENANT_MANAGEMENT_TOOLBAR_ACTIONS,
toolbarContributors, toolbarContributors,
); );
mergeWithDefaultProps( mergeWithDefaultProps(
extensions.entityProps, this.extensions.entityProps,
DEFAULT_TENANT_MANAGEMENT_ENTITY_PROPS, DEFAULT_TENANT_MANAGEMENT_ENTITY_PROPS,
objectExtensionContributors.prop, objectExtensionContributors.prop,
propContributors, propContributors,
); );
mergeWithDefaultProps( mergeWithDefaultProps(
extensions.createFormProps, this.extensions.createFormProps,
DEFAULT_TENANT_MANAGEMENT_CREATE_FORM_PROPS, DEFAULT_TENANT_MANAGEMENT_CREATE_FORM_PROPS,
objectExtensionContributors.createForm, objectExtensionContributors.createForm,
createFormContributors, createFormContributors,
); );
mergeWithDefaultProps( mergeWithDefaultProps(
extensions.editFormProps, this.extensions.editFormProps,
DEFAULT_TENANT_MANAGEMENT_EDIT_FORM_PROPS, DEFAULT_TENANT_MANAGEMENT_EDIT_FORM_PROPS,
objectExtensionContributors.editForm, objectExtensionContributors.editForm,
editFormContributors, editFormContributors,
); );
}), }),
mapTo(true), map(() => true),
); );
} }
} }

8
npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts

@ -1,3 +1,6 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes, mapToCanActivate } from '@angular/router';
import { import {
AuthGuard, AuthGuard,
PermissionGuard, PermissionGuard,
@ -5,8 +8,7 @@ import {
ReplaceableRouteContainerComponent, ReplaceableRouteContainerComponent,
RouterOutletComponent, RouterOutletComponent,
} from '@abp/ng.core'; } from '@abp/ng.core';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { TenantsComponent } from './components/tenants/tenants.component'; import { TenantsComponent } from './components/tenants/tenants.component';
import { eTenantManagementComponents } from './enums/components'; import { eTenantManagementComponents } from './enums/components';
import { TenantManagementExtensionsGuard } from './guards'; import { TenantManagementExtensionsGuard } from './guards';
@ -16,7 +18,7 @@ const routes: Routes = [
{ {
path: '', path: '',
component: RouterOutletComponent, component: RouterOutletComponent,
canActivate: [AuthGuard, PermissionGuard, TenantManagementExtensionsGuard], canActivate: mapToCanActivate([AuthGuard, PermissionGuard, TenantManagementExtensionsGuard]),
children: [ children: [
{ {
path: 'tenants', path: 'tenants',

Loading…
Cancel
Save