{"version":3,"file":"bravobit-bb-foundation-permissions.mjs","sources":["../../../projects/bb-foundation/permissions/src/lib/handlers/abstract.handler.ts","../../../projects/bb-foundation/permissions/src/lib/handlers/local.handler.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.service.ts","../../../projects/bb-foundation/permissions/src/lib/directives/permission.directive.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.interface.ts","../../../projects/bb-foundation/permissions/src/lib/guards/permission.guard.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.config.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.module.ts","../../../projects/bb-foundation/permissions/src/bravobit-bb-foundation-permissions.ts"],"sourcesContent":["import {Observable} from 'rxjs';\n\nexport abstract class PermissionsHandler {\n\n    abstract get(): Observable<string[]> | string[];\n\n}\n","import {LocalPermissionsData} from '../permissions.interface';\nimport {PermissionsHandler} from './abstract.handler';\nimport {Auth} from '@bravobit/bb-foundation/auth';\nimport {map} from 'rxjs/operators';\n\nexport class LocalPermissionsHandler extends PermissionsHandler {\n\n    constructor(protected auth: Auth,\n                protected localPermissions: LocalPermissionsData) {\n        super();\n    }\n\n    override get() {\n        return this.auth.user.pipe(\n            map(user => user?.['role'] as string ?? null),\n            map(role => {\n                if (role === null || role === undefined) {\n                    return [];\n                }\n\n                return this.getPermissionsForRole(role);\n            })\n        );\n    }\n\n    protected getPermissionsForRole(role: string) {\n        return Object.keys(this.localPermissions ?? {}).reduce((previous, current) => {\n            const roles = this.localPermissions?.[current] ?? [];\n            if (roles === '*' || roles?.includes(role)) {\n                return [...previous, current];\n            }\n\n            return previous;\n        }, []);\n    }\n\n}\n","import {BehaviorSubject, isObservable, of, Subscription} from 'rxjs';\nimport {PermissionsHandler} from './handlers/abstract.handler';\nimport {PermissionsOptions} from './permissions.interface';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\nimport {Injectable, OnDestroy} from '@angular/core';\n\n@Injectable({\n    providedIn: 'root'\n})\nexport class Permissions implements OnDestroy {\n\n    // State.\n    private _activePermissions$ = new BehaviorSubject<string[]>([]);\n\n    // Subscriptions.\n    private _subscription = new Subscription();\n\n    constructor(private _handler: PermissionsHandler) {\n        this.trackPermissions();\n    }\n\n    ngOnDestroy() {\n        this._subscription?.unsubscribe();\n    }\n\n    all() {\n        return this._activePermissions$.asObservable();\n    }\n\n    allSync() {\n        return this._activePermissions$.getValue();\n    }\n\n    has(value: string | string[], options?: PermissionsOptions) {\n        const requiredPermissions = this.getRequiredPermissions(value);\n        if (requiredPermissions?.length <= 0) {\n            return of(false);\n        }\n\n        return this._activePermissions$.pipe(\n            map(activePermissions => this.hasPermission(requiredPermissions, activePermissions, options)),\n            distinctUntilChanged()\n        );\n    }\n\n    hasSync(value: string | string[], options?: PermissionsOptions) {\n        const requiredPermissions = this.getRequiredPermissions(value);\n        if (requiredPermissions?.length <= 0) {\n            return false;\n        }\n\n        const activePermissions = this._activePermissions$.getValue();\n        return this.hasPermission(requiredPermissions, activePermissions, options);\n    }\n\n    private hasPermission(requiredPermissions: string[], activePermissions: string[], options?: PermissionsOptions) {\n        const mode = options?.mode ?? 'and';\n        switch (mode) {\n            case 'or':\n                return this.verifyModeOr(requiredPermissions, activePermissions);\n            case 'not':\n                return this.verifyModeNot(requiredPermissions, activePermissions);\n            case 'and':\n            default:\n                return this.verifyModeAnd(requiredPermissions, activePermissions);\n        }\n    }\n\n    private verifyModeAnd(permissions: string[], activePermissions: string[]) {\n        for (const permission of permissions) {\n            const verified = activePermissions?.includes(permission);\n            if (!verified) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    private verifyModeNot(permissions: string[], activePermissions: string[]) {\n        for (const permission of permissions) {\n            if (activePermissions.includes(permission)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    private verifyModeOr(permissions: string[], activePermissions: string[]) {\n        for (const permission of permissions) {\n            const verified = activePermissions?.includes(permission);\n            if (verified) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    private getRequiredPermissions(value: string | string[]) {\n        return Array.isArray(value)\n            ? value\n            : [value];\n    }\n\n    private trackPermissions() {\n        const data = this._handler.get();\n        const permissions$ = isObservable(data) ? data : of(data);\n\n        const subscription = permissions$.subscribe(permissions => {\n            this._activePermissions$.next(permissions ?? []);\n        });\n        this._subscription.add(subscription);\n    }\n\n}\n","import {Directive, EmbeddedViewRef, inject, Input, OnDestroy, OnInit, TemplateRef, ViewContainerRef} from '@angular/core';\nimport {BehaviorSubject, combineLatest, Subscription} from 'rxjs';\nimport {distinctUntilChanged, switchMap} from 'rxjs/operators';\nimport {PermissionsMode} from '../permissions.interface';\nimport {Permissions} from '../permissions.service';\n\n@Directive({\n    selector: 'ng-template[bbPermission]'\n})\nexport class BbPermission implements OnInit, OnDestroy {\n\n    // Dependencies.\n    private readonly _permissions: Permissions = inject(Permissions);\n    private readonly _templateRef: TemplateRef<any> = inject(TemplateRef);\n    private readonly _viewContainerRef: ViewContainerRef = inject(ViewContainerRef);\n\n    // Templates.\n    private _elseTemplateRef: TemplateRef<any> | null = null;\n\n    // View refs.\n    private _thenViewRef: EmbeddedViewRef<any> | null = null;\n    private _elseViewRef: EmbeddedViewRef<any> | null = null;\n\n    // Data.\n    private _valid: boolean = false;\n    private _permission$ = new BehaviorSubject<string[]>([]);\n    private _mode$ = new BehaviorSubject<PermissionsMode>('and');\n\n    @Input()\n    set bbPermission(value: string | string[]) {\n        const permissions = Array.isArray(value) ? value : [value];\n        this._permission$.next(permissions);\n        this.updateView();\n    }\n\n    @Input()\n    set bbPermissionElse(templateRef: TemplateRef<any>) {\n        this.assertTemplate('bbPermissionElse', templateRef);\n        this._elseTemplateRef = templateRef;\n        this.updateView();\n    }\n\n    @Input()\n    set bbPermissionMode(mode: PermissionsMode) {\n        this._mode$.next(mode);\n    }\n\n    // Subscriptions.\n    private _subscription = new Subscription();\n\n    ngOnInit() {\n        const check$ = combineLatest([this._permission$, this._mode$]).pipe(\n            switchMap(([permissions, mode]) => this._permissions.has(permissions, {mode})),\n            distinctUntilChanged()\n        );\n\n        const subscription = check$.subscribe(valid => {\n            this._valid = valid;\n            this.updateView();\n        });\n        this._subscription.add(subscription);\n    }\n\n    ngOnDestroy() {\n        this._subscription?.unsubscribe();\n    }\n\n    private updateView() {\n        if (this._valid) {\n            if (!this._thenViewRef) {\n                this._viewContainerRef.clear();\n                this._elseViewRef = null;\n                if (this._templateRef) {\n                    this._thenViewRef = this._viewContainerRef.createEmbeddedView(this._templateRef);\n                }\n            }\n        } else {\n            if (!this._elseViewRef) {\n                this._viewContainerRef.clear();\n                this._thenViewRef = null;\n                if (this._elseTemplateRef) {\n                    this._elseViewRef = this._viewContainerRef.createEmbeddedView(this._elseTemplateRef);\n                }\n            }\n        }\n    }\n\n    private assertTemplate(property: string, templateRef: TemplateRef<any> | null) {\n        const isTemplateRefOrNull = !!(!templateRef || templateRef.createEmbeddedView);\n        if (!isTemplateRefOrNull) {\n            throw new Error(`${property} must be a TemplateRef.`);\n        }\n    }\n\n    static ngAcceptInputType_bbPermission: string | string[];\n    static ngAcceptInputType_bbPermissionElse: TemplateRef<any>;\n    static ngAcceptInputType_bbPermissionMode: PermissionsMode;\n\n}\n","import {ActivatedRouteSnapshot, Router, RouterStateSnapshot, UrlTree} from '@angular/router';\nimport {InjectionToken, Provider} from '@angular/core';\n\nexport class PermissionsConfig {\n    provider?: Provider;\n    localPermissions?: LocalPermissionsData;\n    onPermissionDenied?: (router: Router, snapshot: ActivatedRouteSnapshot, state: RouterStateSnapshot) => UrlTree;\n}\n\nexport interface PermissionsOptions {\n    mode?: PermissionsMode;\n}\n\nexport type PermissionsMode = 'and' | 'or' | 'not';\nexport type LocalPermissionsData<T extends string = any> = Record<string, T[] | '*'>;\n\nexport const PERMISSIONS_CONFIG: InjectionToken<PermissionsConfig> = new InjectionToken('permissions config');\n","import {ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot} from '@angular/router';\nimport {PermissionsOptions, PERMISSIONS_CONFIG} from '../permissions.interface';\nimport {Permissions} from '../permissions.service';\nimport {inject} from '@angular/core';\n\nexport const bbPermissionGuard = (value: string | string[], options?: PermissionsOptions): CanActivateFn => {\n    return (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n        const router = inject(Router);\n        const permissions = inject(Permissions);\n        const config = inject(PERMISSIONS_CONFIG, {optional: true});\n\n        const valid = permissions.hasSync(value, options);\n        if (valid) {\n            return true;\n        }\n\n        const onPermissionDeniedFn = config?.onPermissionDenied ?? null;\n        if (!onPermissionDeniedFn) {\n            return false;\n        }\n\n        const urlTree = onPermissionDeniedFn(router, route, state);\n        if (!urlTree) {\n            return false;\n        }\n\n        return valid ? true : urlTree;\n    };\n};\n","import {EnvironmentProviders, makeEnvironmentProviders, Provider} from '@angular/core';\nimport {PERMISSIONS_CONFIG, PermissionsConfig} from './permissions.interface';\nimport {LocalPermissionsHandler} from './handlers/local.handler';\nimport {PermissionsHandler} from './handlers/abstract.handler';\nimport {Auth} from '@bravobit/bb-foundation/auth';\n\nexport function providePermissionsConfig(config?: PermissionsConfig): EnvironmentProviders {\n    const defaultProvider: Provider = {\n        provide: PermissionsHandler,\n        deps: [Auth],\n        useFactory: (auth: Auth) => {\n            return new LocalPermissionsHandler(auth, config?.localPermissions ?? {});\n        }\n    };\n\n    const permissionHandlerProvider = config?.provider ?? defaultProvider;\n\n    return makeEnvironmentProviders([\n        {provide: PERMISSIONS_CONFIG, useValue: config},\n        permissionHandlerProvider\n    ]);\n}\n","import {BbPermission} from './directives/permission.directive';\nimport {providePermissionsConfig} from './permissions.config';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\nimport {PermissionsConfig} from './permissions.interface';\n\n@NgModule({\n    imports: [BbPermission],\n    exports: [BbPermission]\n})\nexport class PermissionsModule {\n\n    static forRoot(config?: PermissionsConfig): ModuleWithProviders<PermissionsModule> {\n        return {\n            ngModule: PermissionsModule,\n            providers: [\n                providePermissionsConfig(config)\n            ]\n        };\n    }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.PermissionsHandler"],"mappings":"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"}