current-workspace-id
unknown
typescript
a year ago
4.3 kB
9
Indexable
//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 {
// Сброс контекста рабочего пространства, если необходимо
}
}
Editor is loading...
Leave a Comment