@open-rlb/ng-app 3.1.21 → 3.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,7 +15,7 @@ import { RLB_TRANSLATION_SERVICE, RlbBootstrapModule, ModalDirective, ToastDirec
15
15
  import * as i1$5 from 'angular-auth-oidc-client';
16
16
  import { AbstractLoggerService, AuthModule, provideAuth, AuthInterceptor, AbstractSecurityStorage } from 'angular-auth-oidc-client';
17
17
  import * as i1 from 'ngx-cookie-service-ssr';
18
- import { filter, switchMap, map, BehaviorSubject, of, share, lastValueFrom, from, zip, EMPTY, catchError, Observable, tap, shareReplay, distinctUntilChanged, take } from 'rxjs';
18
+ import { of, filter, switchMap, map, BehaviorSubject, share, lastValueFrom, from, zip, EMPTY, catchError, Observable, tap, shareReplay, distinctUntilChanged, take } from 'rxjs';
19
19
  import { signalStore, withState, withMethods, patchState } from '@ngrx/signals';
20
20
  import { tapResponse } from '@ngrx/operators';
21
21
  import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
@@ -420,7 +420,8 @@ class AdminApiService {
420
420
  }
421
421
  resourcesByUser$() {
422
422
  if (!this.aclConfig) {
423
- throw new Error("ACL configuration is missing. Provide 'acl' in ProjectConfiguration.");
423
+ console.error("ACL configuration is missing. Provide 'acl' in ProjectConfiguration.");
424
+ return of([]);
424
425
  }
425
426
  const endpoint = this.config.endpoints?.[this.aclConfig.endpointKey];
426
427
  if (!endpoint) {
@@ -501,11 +502,13 @@ const DEFAULT_ROUTES_CONFIG = [
501
502
  ];
502
503
 
503
504
  class AppsService {
504
- constructor(store, activatedRoute, router, loggerService, confAuth) {
505
+ constructor(store, activatedRoute, router, loggerService, confAuth, confAcl) {
505
506
  this.store = store;
506
507
  this.activatedRoute = activatedRoute;
507
508
  this.router = router;
508
509
  this.loggerService = loggerService;
510
+ this.confAuth = confAuth;
511
+ this.confAcl = confAcl;
509
512
  this.logger = this.loggerService.for(this.constructor.name);
510
513
  this.logger.log('AppsService initialized');
511
514
  this.initAuthProviders(store, confAuth);
@@ -515,8 +518,38 @@ class AppsService {
515
518
  return window.location.hostname;
516
519
  }
517
520
  get apps() {
518
- return this.store.selectSignal(state => state[appContextFeatureKey].apps)()
519
- .filter(app => app.id && (app.domains === undefined || app.domains == null || app.domains.includes(this.currentDomain)));
521
+ const apps = this.store.selectSignal(state => state[appContextFeatureKey].apps)();
522
+ const resources = this.store.selectSignal(state => state[aclFeatureKey].resources)();
523
+ const confAcl = this.confAcl;
524
+ return apps.filter(app => {
525
+ // Basic domain check
526
+ const isDomainAllowed = !app.domains || app.domains.includes(this.currentDomain);
527
+ if (!isDomainAllowed)
528
+ return false;
529
+ // If acl config doesnt exist return apps filtered by domain
530
+ if (!confAcl)
531
+ return true;
532
+ if (!resources && app.actions?.length)
533
+ return true;
534
+ if (!resources && app.actions && app.actions.length > 0)
535
+ return false;
536
+ return resources?.some(userResource => {
537
+ // Matching by Business ID
538
+ // IMPORTANT: app.data must have key, name of this key is in confAcl
539
+ const appBusId = app.data?.[confAcl.businessIdKey];
540
+ const matchBusId = userResource.resourceBusinessId === appBusId;
541
+ if (!matchBusId)
542
+ return false;
543
+ // Matching by Resource ID
544
+ return userResource.resources.some(res => {
545
+ const appResId = app.data?.[confAcl.resourceIdKey];
546
+ const matchResId = res.resourceId === appResId;
547
+ if (!matchResId)
548
+ return false;
549
+ return res.actions.some(action => app.actions?.includes(action));
550
+ });
551
+ });
552
+ });
520
553
  }
521
554
  get currentApp() {
522
555
  const app = this.store.selectSignal(state => state[appContextFeatureKey].currentApp)();
@@ -739,7 +772,7 @@ class AppsService {
739
772
  }
740
773
  return segments.join('/');
741
774
  }
742
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AppsService, deps: [{ token: i1$1.Store }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: AppLoggerService }, { token: RLB_CFG_AUTH, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
775
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AppsService, deps: [{ token: i1$1.Store }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: AppLoggerService }, { token: RLB_CFG_AUTH, optional: true }, { token: RLB_CFG_ACL, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
743
776
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AppsService, providedIn: 'root' }); }
744
777
  }
745
778
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AppsService, decorators: [{
@@ -752,6 +785,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
752
785
  args: [RLB_CFG_AUTH]
753
786
  }, {
754
787
  type: Optional
788
+ }] }, { type: undefined, decorators: [{
789
+ type: Inject,
790
+ args: [RLB_CFG_ACL]
791
+ }, {
792
+ type: Optional
755
793
  }] }] });
756
794
 
757
795
  class LanguageService {
@@ -885,6 +923,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
885
923
  args: [{ providedIn: 'root' }]
886
924
  }], ctorParameters: () => [{ type: i2.Router }, { type: i2.ActivatedRoute }, { type: AppLoggerService }, { type: LanguageService }, { type: i2$1.UniqueIdService }] });
887
925
 
926
+ const RLB_INIT_PROVIDER = new InjectionToken(`${RLB_CFG}:init.provider`);
927
+
888
928
  class LocalCacheService {
889
929
  constructor(options) {
890
930
  this.options = options;
@@ -1636,13 +1676,14 @@ class CompanyInterceptor {
1636
1676
  const data = currentApp?.data;
1637
1677
  const mapping = this.config.acl?.interceptorMapping || {};
1638
1678
  let params = req.params;
1639
- Object.keys(mapping).forEach((key) => {
1679
+ for (const key of Object.keys(mapping)) {
1640
1680
  const storeKey = mapping[key];
1641
1681
  const value = data?.[storeKey];
1642
1682
  if (!!value) {
1643
1683
  params = params.set(key, value);
1644
1684
  }
1645
- });
1685
+ }
1686
+ ;
1646
1687
  const clonedReq = req.clone({ params });
1647
1688
  return next.handle(clonedReq);
1648
1689
  }
@@ -3058,10 +3099,10 @@ const appFeature = createFeature({
3058
3099
  throw new Error(`App type: ${appType} not found. Cannot finalize app.`);
3059
3100
  let updatedAppsOfType;
3060
3101
  if (appsOfType.length === 1 && !appsOfType[0].id) {
3061
- updatedAppsOfType = [{ ...appsOfType[0], data, id: appId, }];
3102
+ updatedAppsOfType = [{ ...appsOfType[0], data, id: appId }];
3062
3103
  }
3063
3104
  else {
3064
- updatedAppsOfType = [...appsOfType, { ...appsOfType[0], data, id: appId, }];
3105
+ updatedAppsOfType = [...appsOfType, { ...appsOfType[0], data, id: appId }];
3065
3106
  }
3066
3107
  const remainingApps = state.apps.filter(a => a.type !== appType);
3067
3108
  return { ...state, apps: [...remainingApps, ...updatedAppsOfType], };
@@ -3278,6 +3319,11 @@ function provideRlbConfig(env) {
3278
3319
  const authService = inject(AuthenticationService);
3279
3320
  return authService.checkAuthMultiple();
3280
3321
  }),
3322
+ provideAppInitializer(() => {
3323
+ const aclStore = inject(AclStore);
3324
+ // We call the rxMethod, AppInitializer can guarantee that this logic will be executed before routing
3325
+ return aclStore.loadACL();
3326
+ }),
3281
3327
  { provide: RLB_CFG, useValue: env },
3282
3328
  { provide: RLB_CFG_ENV, useValue: env.environment },
3283
3329
  { provide: RLB_CFG_CMS, useValue: env.cms },
@@ -3331,5 +3377,5 @@ function flattenRoutes(routes, parentPath = '') {
3331
3377
  * Generated bundle index. Do not edit.
3332
3378
  */
3333
3379
 
3334
- export { AbstractMdService, AbstractSupportService, AclActions, AppBreadcrumbService, AppContainerComponent, AppContextActions, AppContextActionsInternal, AppLoggerService, AppStorageService, AppTemplateComponent, AppsService, AsMultiPipe, AsSinglePipe, AuthActions, AuthActionsInternal, AuthFeatureService, AuthenticationService, AutolinkPipe, BaseComponent, CmsComponent, CmsPipe, ContentComponent, CookiesService, ErrorManagementService, ErrorModalComponent, KeycloakProfileService, LanguageService, LeftComponentPipe, LocalCacheService, ModalAppsComponent, NavbarActions, NavbarActionsInternal, OauthPasswordService, ParseJwtService, PwaUpdaterService, RLB_APPS, RLB_APP_NAVCOMP, RLB_CFG, RLB_CFG_ACL, RLB_CFG_AUTH, RLB_CFG_CMS, RLB_CFG_ENV, RLB_CFG_I18N, RLB_CFG_PAGES, RightComponentPipe, RlbAppModule, RlbRole, SidebarActions, SidebarActionsInternal, StrapiService, ToastComponent, TokenOauthInterceptor, TranslateBrowserLoader, TruncatePipe, UtilsService, aclFeatureKey, appContextFeatureKey, authsFeatureKey, getDefaultRoutes, initialAclState, initialAppContextState, initialAuthState, initialNavbarState, initialSidebarState, navbarsFeatureKey, oauthGuard, oauthPasswordGuard, permissionGuard, provideApp, provideRlbCodeBrowserOAuth, provideRlbConfig, provideRlbI18n, sidebarsFeatureKey, translateBrowserLoaderFactory, verifyDeactivate };
3380
+ export { AbstractMdService, AbstractSupportService, AclActions, AppBreadcrumbService, AppContainerComponent, AppContextActions, AppContextActionsInternal, AppLoggerService, AppStorageService, AppTemplateComponent, AppsService, AsMultiPipe, AsSinglePipe, AuthActions, AuthActionsInternal, AuthFeatureService, AuthenticationService, AutolinkPipe, BaseComponent, CmsComponent, CmsPipe, ContentComponent, CookiesService, ErrorManagementService, ErrorModalComponent, KeycloakProfileService, LanguageService, LeftComponentPipe, LocalCacheService, ModalAppsComponent, NavbarActions, NavbarActionsInternal, OauthPasswordService, ParseJwtService, PwaUpdaterService, RLB_APPS, RLB_APP_NAVCOMP, RLB_CFG, RLB_CFG_ACL, RLB_CFG_AUTH, RLB_CFG_CMS, RLB_CFG_ENV, RLB_CFG_I18N, RLB_CFG_PAGES, RLB_INIT_PROVIDER, RightComponentPipe, RlbAppModule, RlbRole, SidebarActions, SidebarActionsInternal, StrapiService, ToastComponent, TokenOauthInterceptor, TranslateBrowserLoader, TruncatePipe, UtilsService, aclFeatureKey, appContextFeatureKey, authsFeatureKey, getDefaultRoutes, initialAclState, initialAppContextState, initialAuthState, initialNavbarState, initialSidebarState, navbarsFeatureKey, oauthGuard, oauthPasswordGuard, permissionGuard, provideApp, provideRlbCodeBrowserOAuth, provideRlbConfig, provideRlbI18n, sidebarsFeatureKey, translateBrowserLoaderFactory, verifyDeactivate };
3335
3381
  //# sourceMappingURL=open-rlb-ng-app.mjs.map