import { computed, inject, Injectable, signal } from "@angular/core"; import type { Signal } from "@angular/core"; import type { AppStructureItem, AppStructureService } from "@simplysm/service-common"; import type { SdFlatMenu } from "./sd-app-structure.types"; import { SdAppStructureUtils } from "./sd-app-structure.utils"; import { SdServiceClientFactoryProvider } from "../service-client/sd-service-client-factory.provider"; import { SdAngularConfigProvider } from "../config/sd-angular-config.provider"; export function injectPermsSignal(viewCodes: string[], keys: K[]): Signal { const sdAppStructure = inject(SdAppStructureProvider); return computed(() => sdAppStructure.getPermsByFullCode(viewCodes, keys)); } // 권한은 모듈만 체크하고 // 메뉴는 모듈/권한 모두 체크함 @Injectable({ providedIn: "root" }) export class SdAppStructureProvider { private readonly _sdServiceClientFactory = inject(SdServiceClientFactoryProvider); private readonly _sdAngularConfig = inject(SdAngularConfigProvider); readonly usableModules = signal(undefined); readonly permRecord = signal | undefined>(undefined); readonly items = signal[]>([]); async initialize(serviceKey: string): Promise { const client = this._sdServiceClientFactory.get(serviceKey); const svc = client.getService("AppStructure"); const itemsMap = await svc.getItems(); this.items.set( (itemsMap[this._sdAngularConfig.clientName] ?? []) as AppStructureItem[], ); } usableMenus = computed(() => SdAppStructureUtils.getMenus(this.items(), [], this.usableModules(), this.permRecord()), ); usableFlatMenus = computed[]>(() => SdAppStructureUtils.getFlatMenus(this.items(), this.usableModules(), this.permRecord()), ); getPermissionsByStructure(items: AppStructureItem[], codeChain: string[] = []) { return SdAppStructureUtils.getPermissions(items, codeChain, this.usableModules()); } getTitleByFullCode(fullCode: string) { return SdAppStructureUtils.getTitleByFullCode(this.items(), fullCode); } getItemChainByFullCode(fullCode: string) { return SdAppStructureUtils.getItemChainByFullCode(this.items(), fullCode); } getPermsByFullCode(fullCodes: string[], permKeys: K[]): K[] { return SdAppStructureUtils.getPermsByFullCode( this.items(), fullCodes, permKeys, this.permRecord(), ); } }