import { ApiRequestOptions } from '../hooks/useApi'; // ============================================================================ // TYPES & INTERFACES // ============================================================================ export interface Role { id: string; [key: string]: any; // Allow additional properties from backend } export type RoleUpdateData = Partial>; export interface PaginationParams { page?: number; pageSize?: number; sort?: Array<{ field: string; direction: 'asc' | 'desc' }>; filters?: Record; search?: string; } export interface PaginatedResponse { items: T[]; pagination?: { currentPage: number; pageSize: number; totalItems: number; totalPages: number; }; } // Type for the request function passed to API functions export type ApiRequestFunction = (options: ApiRequestOptions) => Promise; // ============================================================================ // API REQUEST FUNCTIONS // ============================================================================ /** * Fetch list of roles with optional pagination * Endpoint: GET /api/rbac/roles * Query parameter: pagination (optional, JSON-encoded string) * Example: /api/rbac/roles?pagination={"page":1,"pageSize":10} */ export async function fetchRoles( request: ApiRequestFunction, params?: PaginationParams ): Promise | Role[]> { const requestParams: any = {}; // Build pagination object if provided if (params) { const paginationObj: any = {}; if (params.page !== undefined) paginationObj.page = params.page; if (params.pageSize !== undefined) paginationObj.pageSize = params.pageSize; if (params.sort) paginationObj.sort = params.sort; if (params.filters) paginationObj.filters = params.filters; if (params.search) paginationObj.search = params.search; if (Object.keys(paginationObj).length > 0) { requestParams.pagination = JSON.stringify(paginationObj); } } const data = await request({ url: '/api/rbac/roles', method: 'get', params: requestParams }); return data; } /** * Fetch a single role by ID * Endpoint: GET /api/rbac/roles/{roleId} */ export async function fetchRoleById( request: ApiRequestFunction, roleId: string ): Promise { try { const data = await request({ url: `/api/rbac/roles/${roleId}`, method: 'get' }); return data || null; } catch (error: any) { console.error('Error fetching role by ID:', error); return null; } } /** * Create a new role * Endpoint: POST /api/rbac/roles * Request body: Role object * Required fields: * - roleLabel: string (e.g., "admin", "user") * - description: TextMultilingual object (at least en is required) */ export async function createRole( request: ApiRequestFunction, roleData: Partial ): Promise { console.log('🔵 createRole - Complete request structure:', { url: '/api/rbac/roles', method: 'post', requestOptions: { url: '/api/rbac/roles', method: 'post', data: roleData }, roleData: roleData, roleDataKeys: Object.keys(roleData || {}), roleDataValues: Object.entries(roleData || {}).map(([key, value]) => ({ key, value, type: typeof value, isObject: typeof value === 'object' && value !== null, isArray: Array.isArray(value), stringified: typeof value === 'object' ? JSON.stringify(value, null, 2) : String(value) })), dataStringified: JSON.stringify(roleData, null, 2), dataStringifiedCompact: JSON.stringify(roleData) }); try { const result = await request({ url: '/api/rbac/roles', method: 'post', data: roleData }); console.log('✅ createRole - Response:', result); return result; } catch (error: any) { console.error('❌ createRole - Request failed:', { error, errorMessage: error.message, errorResponse: error.response, errorResponseData: error.response?.data, errorResponseStatus: error.response?.status, errorResponseHeaders: error.response?.headers, errorRequest: error.request, errorConfig: error.config }); throw error; } } /** * Update a role * Endpoint: PUT /api/rbac/roles/{roleId} */ export async function updateRole( request: ApiRequestFunction, roleId: string, updateData: RoleUpdateData ): Promise { return await request({ url: `/api/rbac/roles/${roleId}`, method: 'put', data: updateData }); } /** * Delete a role * Endpoint: DELETE /api/rbac/roles/{roleId} */ export async function deleteRole( request: ApiRequestFunction, roleId: string ): Promise { await request({ url: `/api/rbac/roles/${roleId}`, method: 'delete' }); }