123 lines
2.8 KiB
TypeScript
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();
|