current-workspace-id

mail@pastecode.io avatar
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