Files
user_manager/src/services/roleManagerService.ts
2026-02-10 20:36:49 -05:00

123 lines
2.8 KiB
TypeScript

import { fetchWrapper } from '@KTXC/utils/helpers/fetch-wrapper';
import type { ApiResponse, Role } from '@/types';
/**
* Role Manager Service
* API client for role management operations
*/
class RoleManagerService {
private baseUrl = '/user/roles';
private transactionCounter = 0;
private getTransaction(): string {
return `txn-${Date.now()}-${++this.transactionCounter}`;
}
/**
* List all roles
*/
async listRoles(): Promise<Role[]> {
const response = await fetchWrapper.post<ApiResponse<Role[]>>(
`${this.baseUrl}/v1`,
{
version: 1,
transaction: this.getTransaction(),
operation: 'role.list',
data: {}
},
{ skipLogoutOnError: true }
);
return response.data;
}
/**
* Fetch single role
*/
async fetchRole(rid: string): Promise<Role> {
const response = await fetchWrapper.post<ApiResponse<Role>>(
`${this.baseUrl}/v1`,
{
version: 1,
transaction: this.getTransaction(),
operation: 'role.fetch',
data: { rid }
}
);
return response.data;
}
/**
* Create new role
*/
async createRole(roleData: {
label: string;
description?: string;
permissions?: string[];
}): Promise<Role> {
const response = await fetchWrapper.post<ApiResponse<Role>>(
`${this.baseUrl}/v1`,
{
version: 1,
transaction: this.getTransaction(),
operation: 'role.create',
data: roleData
}
);
return response.data;
}
/**
* Update role
*/
async updateRole(rid: string, updates: {
label?: string;
description?: string;
permissions?: string[];
}): Promise<boolean> {
const response = await fetchWrapper.post<ApiResponse<boolean>>(
`${this.baseUrl}/v1`,
{
version: 1,
transaction: this.getTransaction(),
operation: 'role.update',
data: { rid, ...updates }
}
);
return response.data;
}
/**
* Delete role
*/
async deleteRole(rid: string): Promise<boolean> {
const response = await fetchWrapper.post<ApiResponse<boolean>>(
`${this.baseUrl}/v1`,
{
version: 1,
transaction: this.getTransaction(),
operation: 'role.delete',
data: { rid }
}
);
return response.data;
}
/**
* Get available permissions (grouped with metadata)
*/
async listPermissions(): Promise<import('@/types').PermissionGroup> {
const response = await fetchWrapper.post<ApiResponse<import('@/types').PermissionGroup>>(
`${this.baseUrl}/v1`,
{
version: 1,
transaction: this.getTransaction(),
operation: 'permissions.list',
data: {}
}
);
return response.data;
}
}
export const roleManagerService = new RoleManagerService();