current-workspace-id
unknown
typescript
21 days ago
4.3 kB
2
Indexable
Never
//current-workspace-id.ts import { AsyncLocalStorage } from 'async_hooks'; import { Uuid } from "@server/fd/fd-toolbox/types/uuid"; import { WorkspaceConstants } from "@server/fd/fd-toolbox/constants/workspace-constants"; import { FdClaimTypes } from "@server/fd/fd-toolbox-core/auth/fd-claim-types"; import { tryGetFromCoreCache, setCoreCache } from "@server/fd/fd-toolbox/caching/core-memory-cache"; const asyncLocalStorage = new AsyncLocalStorage<{ workspaceId: Uuid }>(); const defaultWorkspaceId: Uuid = WorkspaceConstants.Default; const WORKSPACE_CACHE_KEY = 'CurrentWorkspaceId'; export function getCurrentWorkspaceId(): Uuid { const store = asyncLocalStorage.getStore(); if (store?.workspaceId) { return store.workspaceId; } const cachedWorkspaceId = tryGetFromCoreCache<Uuid>(WORKSPACE_CACHE_KEY); if (cachedWorkspaceId) { return cachedWorkspaceId; } const claims = getCurrentUserClaims(); const workspaceId = claims.find(c => c.type === FdClaimTypes.OriginalWorkspaceId)?.value; if (!workspaceId) { return defaultWorkspaceId; } setCoreCache(WORKSPACE_CACHE_KEY, workspaceId); return workspaceId as Uuid; } export function setCurrentWorkspaceId(workspaceId: Uuid): void { asyncLocalStorage.enterWith({ workspaceId }); setCoreCache(WORKSPACE_CACHE_KEY, workspaceId); } export function resetCurrentWorkspaceId(): void { asyncLocalStorage.enterWith({ workspaceId: defaultWorkspaceId }); setCoreCache(WORKSPACE_CACHE_KEY, defaultWorkspaceId); } export function withWorkspaceId<T>(workspaceId: Uuid, callback: () => T): T { return asyncLocalStorage.run({ workspaceId }, callback); } function getCurrentUserClaims(): { type: string, value: string }[] { // Реализация получения claims пользователя return []; } // Permission Checker export async function hasPermission(permissionName: string, userId: Uuid): Promise<boolean> { const workspaceId = getCurrentWorkspaceId(); // Реализация проверки разрешений с учетом workspaceId return true; // Заглушка } export async function getCurrentUserPermissions(): Promise<string[]> { const workspaceId = getCurrentWorkspaceId(); // Получение разрешений текущего пользователя для текущего рабочего пространства return []; // Заглушка } export async function currentUserHasViewPermission(permissionName: string): Promise<boolean> { const workspaceId = getCurrentWorkspaceId(); // Проверка наличия разрешения на просмотр у текущего пользователя return true; // Заглушка } // User Impersonator let originalWorkspaceId: Uuid | null = null; export async function impersonateUserForAction<T>(userId: Uuid, action: () => Promise<T>): Promise<T> { originalWorkspaceId = getCurrentWorkspaceId(); try { const userWorkspaceId = await getUserWorkspaceId(userId); setCurrentWorkspaceId(userWorkspaceId); return await action(); } finally { if (originalWorkspaceId) { setCurrentWorkspaceId(originalWorkspaceId); } else { resetCurrentWorkspaceId(); } } } async function getUserWorkspaceId(userId: Uuid): Promise<Uuid> { // Реализация получения рабочего пространства пользователя return getCurrentWorkspaceId(); // Заглушка } // DB Context Workspace Setter export function setWorkspaceContext(dbContext: any): void { const workspaceId = getCurrentWorkspaceId(); // Установка контекста рабочего пространства для операций с базой данных // Пример: // dbContext.setWorkspaceFilter(workspaceId); } export async function withWorkspaceContext<T>(action: () => Promise<T>): Promise<T> { const workspaceId = getCurrentWorkspaceId(); // Установка контекста рабочего пространства try { return await action(); } finally { // Сброс контекста рабочего пространства, если необходимо } }
Leave a Comment