import type { CrudAction, WtObject } from '../../../enums'; import { _wtUiLog as wtlog } from '../../../scripts/logger'; import { mapGlobalActionToCrudAction, mapScopeClassAccessTokenToCrudAction, mapScopeClassToWtObjects, mapUiSectionToWtObject, mapWtObjectToUiSection, wtObjectsWithGlobalCrudActionAccessAsChecksSource, wtObjectsWithGlobalSpecialActionAccessAsChecksSource, } from '../mappings/mappings'; import type { AppVisibilityMap, GlobalAccessApiResponseItem, GlobalAction, GlobalActionAccessMap, LicenseAccessMap, ScopeAccessApiResponseItem, ScopeAccessMap, SectionVisibilityMap, UiSection, VisibilityAccess, WebitelLicenseInfo, } from '../types/UserAccess.d'; /** * @internal * @description * backend -> frontend * */ const castGlobalActionToCrudAction = ( globalAction: GlobalAction, ): CrudAction | null => { return mapGlobalActionToCrudAction[globalAction] || null; }; export const makeGlobalAccessMap = ( rawGlobalAccess: GlobalAccessApiResponseItem[], ): GlobalActionAccessMap => { return rawGlobalAccess.reduce((map, { id }) => { const key = castGlobalActionToCrudAction(id) || id; return map.set(key, true); }, new Map()); }; export const makeScopeAccessMap = ( rawScope: ScopeAccessApiResponseItem[], ): ScopeAccessMap => { const map = new Map(); rawScope.forEach(({ class: scopeClass, access: scopeAccess }) => { const access = scopeAccess.split('').reduce((accessMap, token) => { accessMap.set(mapScopeClassAccessTokenToCrudAction[token], true); return accessMap; }, new Map()); const scopeClassObjects = mapScopeClassToWtObjects[scopeClass]; if (!scopeClassObjects) { wtlog.info({ module: 'modules/userinfo', })('Unknown scope class to convert to WtObject:', scopeClass); map.set(scopeClass, access); } else { scopeClassObjects.forEach((object) => { map.set(object, access); }); } }); return map; }; export const makeAppVisibilityMap = ( rawVisibility: VisibilityAccess, ): AppVisibilityMap => { const map = new Map(); if (!rawVisibility) return map; Object.entries(rawVisibility).forEach(([app, visibility]) => { map.set(app, visibility._enabled); }); return map; }; export const makeSectionVisibilityMap = ( rawVisibility: VisibilityAccess, ): SectionVisibilityMap => { const map = new Map(); if (!rawVisibility) return map; Object.entries(rawVisibility).forEach(([app, appSectionsVisibility]) => { Object.entries(appSectionsVisibility).forEach(([section, visibility]) => { if (section.startsWith('_')) { return; // skip private fields } map.set( `${app}/${section}`, ( visibility as { _enabled: boolean; } )._enabled, ); }); }); return map; }; export const makeLicenseAccessMap = ( rawLicense: WebitelLicenseInfo[], ): LicenseAccessMap => { const map = new Map(); rawLicense.forEach((license) => { if (map.has(license.prod)) { map.get(license.prod)?.push(license); } else { map.set(license.prod, [ license, ]); } }); return map; }; export const castUiSectionToWtObject = (section: UiSection): WtObject => { return mapUiSectionToWtObject[section]; }; export const castWtObjectToUiSection = (object: WtObject): UiSection => { return mapWtObjectToUiSection[object]; }; export const shouldUseGlobalSpecialActionAccessAsChecksSource = ( object: WtObject, ): boolean => { return !!wtObjectsWithGlobalSpecialActionAccessAsChecksSource[object]; }; export const shouldUseGlobalCrudActionAccessAsChecksSource = ( object: WtObject, ): boolean => { return !!wtObjectsWithGlobalCrudActionAccessAsChecksSource[object]; };