{ "version": 3, "sources": ["src/app/core/enums/permission-status.enum.ts", "src/app/core/models/zod-schemas/membership-api/get-is-member/v1/get-is-member.zod-schema.ts", "src/app/core/models/zod-schemas/proxy-api/get-is-employee/v1/get-is-employee.zod-schema.ts", "src/app/core/models/planned-maintenance.ts", "src/app/core/helpers/maintenance.helper.ts", "src/app/core/services/permission.service.ts", "src/app/core/interceptors/maintenance.interceptor.ts"], "sourcesContent": ["export enum PermissionStatus {\n ACCESS = 'ACCESS', // User has access\n MAINTENANCE = 'MAINTENANCE', // The API is in maintenance mode, can not resolve permission\n NO_ACCESS = 'NO_ACCESS', // User has no access\n UNDER_DEVELOPMENT = 'UNDER_DEVELOPMENT', // Module being developed, no permissions available\n UNRESOLVED = 'UNRESOLVED', // Could not resolve permissions\n NOT_EMPLOYEE_OR_MEMBER = 'NOT_EMPLOYEE_OR_MEMBER', // User not employee or member and should not have permission to anything\n}\n", "import { z } from 'zod';\n\nexport const getIsMemberZodSchema = z\n .object({\n member: z.boolean(),\n })\n .transform((v): { isMember: boolean } => {\n return { isMember: v.member };\n });\n", "import { z } from 'zod';\n\nexport const getIsEmployeeZodSchema = z\n .object({\n isEmployee: z.boolean(),\n })\n .transform((v): { isEmployee: boolean } => {\n return v;\n });\n", "export const plannedMaintenance = 'PLANNED_MAINTENANCE';\n", "import { HttpErrorResponse } from '@angular/common/http';\nimport { plannedMaintenance } from '@core/models/planned-maintenance';\n\nexport class MaintenanceHelper {\n static isMaintenanceResponse(response: HttpErrorResponse): boolean {\n return (\n (response.status === 502 || response.status === 503) &&\n response.error.error === plannedMaintenance\n );\n }\n}\n", "import { inject, Injectable } from '@angular/core';\nimport { catchError, combineLatest, Observable, of, switchMap } from 'rxjs';\nimport {\n FfNgxAuthService,\n FfNgxModalRef,\n FfNgxModalService,\n FfNgxRequestService,\n} from '@fagforbundet/ngx-components';\nimport { map, take } from 'rxjs/operators';\nimport { membershipApiConfig } from '@config/apis/membership/membership-api.config';\nimport { getIsMemberZodSchema } from '@core/models/zod-schemas/membership-api/get-is-member/v1/get-is-member.zod-schema';\nimport { proxyApiConfig } from '@config/apis/proxy/proxy-api.config';\nimport { getIsEmployeeZodSchema } from '@core/models/zod-schemas/proxy-api/get-is-employee/v1/get-is-employee.zod-schema';\nimport { PermissionStatus } from '@core/enums/permission-status.enum';\nimport { Router } from '@angular/router';\nimport { HttpContext, HttpErrorResponse } from '@angular/common/http';\nimport { MaintenanceHelper } from '@core/helpers/maintenance.helper';\nimport { SKIP_MAINTENANCE_INTERCEPTOR } from '@core/interceptors/maintenance.interceptor';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PermissionService {\n readonly #authService = inject(FfNgxAuthService);\n #modalRef!: FfNgxModalRef;\n readonly #modalService = inject(FfNgxModalService);\n readonly #requestService = inject(FfNgxRequestService);\n readonly #router = inject(Router);\n\n handlePermission(status: PermissionStatus): boolean {\n switch (status) {\n case PermissionStatus.ACCESS:\n return true;\n case PermissionStatus.MAINTENANCE:\n this.#router.navigate(['/dashboard']).then(() => {\n this.showAccessModal(\n 'Planlagt vedlikehold',\n `

Denne modulen er under planlagt vedlikehold.

For avklaring og spørsmål kan du kontakte brukerstøtte her.

`,\n );\n });\n\n return false;\n case PermissionStatus.NO_ACCESS:\n this.#router.navigate(['/dashboard']).then(() => {\n this.showAccessModal(\n 'Mangler tilgang',\n `

Du mangler tilgang til dette verktøyet.

For avklaring og spørsmål kan du kontakte brukerstøtte her.

`,\n );\n });\n\n return false;\n case PermissionStatus.NOT_EMPLOYEE_OR_MEMBER:\n void this.#router.navigate(['/no-access']);\n return false;\n case PermissionStatus.UNDER_DEVELOPMENT:\n this.#router.navigate(['/dashboard']).then(() => {\n this.showAccessModal(\n 'Under utvikling',\n `

Denne modulen er under utvikling.

For avklaring og spørsmål kan du kontakte brukerstøtte her.

`,\n );\n });\n\n return false;\n case PermissionStatus.UNRESOLVED:\n default:\n this.#router.navigate(['/dashboard']).then(() => {\n this.showAccessModal(\n 'Feil oppstod',\n `

Vi fikk dessverre ikke sjekket om du har tilgang til denne modulen.

Prøv igjen, og om du fremdeles opplever problemer kan du kontakte brukerstøtte her.

`,\n );\n });\n\n return false;\n }\n }\n\n isEmployee(): Observable {\n return this.#authService.getSelf().pipe(\n take(1),\n switchMap((self) => {\n return this.#requestService.get(\n {\n api: proxyApiConfig,\n endpoint: proxyApiConfig.endpoints.GET_IS_EMPLOYEE,\n endpointVars: {\n userUuid: self!.sub,\n },\n },\n { shouldCache: true },\n {\n context: new HttpContext().set(SKIP_MAINTENANCE_INTERCEPTOR, true),\n },\n );\n }),\n map((r) => {\n return getIsEmployeeZodSchema.parse(r.responseBody);\n }),\n map((r: { isEmployee: boolean }) => {\n return r.isEmployee\n ? PermissionStatus.ACCESS\n : PermissionStatus.NO_ACCESS;\n }),\n catchError((e: HttpErrorResponse) => {\n return MaintenanceHelper.isMaintenanceResponse(e)\n ? of(PermissionStatus.MAINTENANCE)\n : of(PermissionStatus.UNRESOLVED);\n }),\n );\n }\n\n isEmployeeOrMember(): Observable {\n return combineLatest([this.isEmployee(), this.isMember()]).pipe(\n map(([isEmployeeStatus, isMemberStatus]) => {\n return (\n isEmployeeStatus === PermissionStatus.ACCESS ||\n isMemberStatus === PermissionStatus.ACCESS\n );\n }),\n catchError(() => {\n return of(false);\n }),\n );\n }\n\n isMember(): Observable {\n return this.#requestService\n .get(\n {\n api: membershipApiConfig,\n endpoint: membershipApiConfig.endpoints.GET_IS_MEMBER,\n },\n { shouldCache: true },\n {\n context: new HttpContext().set(SKIP_MAINTENANCE_INTERCEPTOR, true),\n },\n )\n .pipe(\n map((r) => {\n return getIsMemberZodSchema.parse(r.responseBody);\n }),\n map((r: { isMember: boolean }) => {\n return r.isMember\n ? PermissionStatus.ACCESS\n : PermissionStatus.NO_ACCESS;\n }),\n catchError((e: HttpErrorResponse) => {\n return MaintenanceHelper.isMaintenanceResponse(e)\n ? of(PermissionStatus.MAINTENANCE)\n : of(PermissionStatus.UNRESOLVED);\n }),\n );\n }\n\n showAccessModal(title: string, bodyHtml: string): void {\n if (this.#modalRef) {\n this.#modalRef.close();\n }\n\n this.#modalRef = this.#modalService.openTextModal({\n title,\n bodyHtml,\n });\n }\n}\n", "import {\n HttpContextToken,\n HttpErrorResponse,\n HttpEvent,\n HttpHandler,\n HttpInterceptor,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { PermissionService } from '@core/services/permission.service';\nimport { MaintenanceHelper } from '@core/helpers/maintenance.helper';\nimport { PermissionStatus } from '@core/enums/permission-status.enum';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MaintenanceInterceptor implements HttpInterceptor {\n readonly #permissionService = inject(PermissionService);\n\n intercept(\n req: HttpRequest,\n next: HttpHandler,\n ): Observable> {\n return next.handle(req).pipe(\n catchError((e: HttpErrorResponse) => {\n if (\n MaintenanceHelper.isMaintenanceResponse(e) &&\n !req.context.get(SKIP_MAINTENANCE_INTERCEPTOR)\n ) {\n this.#permissionService.handlePermission(\n PermissionStatus.MAINTENANCE,\n );\n }\n\n return throwError(() => e);\n }),\n );\n }\n}\n\nexport const SKIP_MAINTENANCE_INTERCEPTOR = new HttpContextToken(\n () => false,\n);\n"], "mappings": "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", "names": ["PermissionStatus", "getIsMemberZodSchema", "z", "object", "member", "boolean", "transform", "v", "isMember", "getIsEmployeeZodSchema", "z", "object", "isEmployee", "boolean", "transform", "v", "plannedMaintenance", "MaintenanceHelper", "isMaintenanceResponse", "response", "status", "error", "plannedMaintenance", "PermissionService", "#authService", "inject", "FfNgxAuthService", "#modalRef", "#modalService", "FfNgxModalService", "#requestService", "FfNgxRequestService", "#router", "Router", "handlePermission", "status", "PermissionStatus", "ACCESS", "MAINTENANCE", "navigate", "then", "showAccessModal", "NO_ACCESS", "NOT_EMPLOYEE_OR_MEMBER", "UNDER_DEVELOPMENT", "UNRESOLVED", "isEmployee", "getSelf", "pipe", "take", "switchMap", "self", "get", "api", "proxyApiConfig", "endpoint", "endpoints", "GET_IS_EMPLOYEE", "endpointVars", "userUuid", "sub", "shouldCache", "context", "HttpContext", "set", "SKIP_MAINTENANCE_INTERCEPTOR", "map", "r", "getIsEmployeeZodSchema", "parse", "responseBody", "catchError", "e", "MaintenanceHelper", "isMaintenanceResponse", "of", "isEmployeeOrMember", "combineLatest", "isMember", "isEmployeeStatus", "isMemberStatus", "membershipApiConfig", "GET_IS_MEMBER", "getIsMemberZodSchema", "title", "bodyHtml", "close", "openTextModal", "factory", "\u0275fac", "providedIn", "MaintenanceInterceptor", "#permissionService", "inject", "PermissionService", "intercept", "req", "next", "handle", "pipe", "catchError", "e", "MaintenanceHelper", "isMaintenanceResponse", "context", "get", "SKIP_MAINTENANCE_INTERCEPTOR", "handlePermission", "PermissionStatus", "MAINTENANCE", "throwError", "factory", "\u0275fac", "providedIn", "HttpContextToken"] }