ui-nyla/src/api/permissionApi.ts

71 lines
1.8 KiB
TypeScript

import { ApiRequestOptions } from '../hooks/useApi';
// ============================================================================
// TYPES & INTERFACES
// ============================================================================
export type PermissionLevel = 'n' | 'o' | 'a';
export interface UserPermissions {
view: boolean;
read: PermissionLevel;
create: PermissionLevel;
update: PermissionLevel;
delete: PermissionLevel;
}
export type PermissionContext = 'DATA' | 'UI' | 'RESOURCE';
// Type for the request function passed to API functions
export type ApiRequestFunction = (options: ApiRequestOptions<any>) => Promise<any>;
// ============================================================================
// API REQUEST FUNCTIONS
// ============================================================================
/**
* Fetch permissions for a given context and item
* Endpoint: GET /api/rbac/permissions
* Query params: context (required), item (optional)
*/
export async function fetchPermissions(
request: ApiRequestFunction,
context: PermissionContext,
item?: string
): Promise<UserPermissions> {
const params: Record<string, string> = { context };
if (item) {
params.item = item;
}
console.log('📡 fetchPermissions: Requesting permissions:', {
context,
item,
params,
url: '/api/rbac/permissions'
});
const data = await request({
url: '/api/rbac/permissions',
method: 'get',
params
});
console.log('📥 fetchPermissions: Received permissions response:', {
context,
item,
response: data,
view: data?.view,
read: data?.read,
create: data?.create,
update: data?.update,
delete: data?.delete,
type: typeof data,
isArray: Array.isArray(data),
keys: data ? Object.keys(data) : [],
fullResponse: JSON.stringify(data, null, 2)
});
return data;
}