import { unwrapApiResponse, unwrapNullableApiResponse } from '@/utils/api-response' import { request } from '@/utils/request' import type { ApiResponse, PageResult } from '@/types/common' import type { BackendCollection, BackendPage, CreateRoleRequest, PermissionResourceNodeDto, RoleDataScopeRequest, RoleDataScopeResponseDto, RoleMemberDto, RoleRecord, RoleResponseDto, UpdateRoleRequest, } from './types' const fallbackColors = ['#6b5bd2', '#0e6e8c', '#0f9d6c', '#d9821f', '#c65d5d'] function normalizeRole(dto: RoleResponseDto, index: number): RoleRecord { return { id: dto.id, code: dto.code, name: dto.name, description: dto.description ?? '', userCount: dto.userCount ?? 0, color: fallbackColors[index % fallbackColors.length], status: dto.status ?? 'DISABLED', menuPermissionCount: dto.menuPermissionCount ?? 0, buttonPermissionCount: dto.buttonPermissionCount ?? 0, dataScope: dto.dataScope ?? 'SELF', configured: dto.configured ?? false, createdAt: dto.createdAt, updatedAt: dto.updatedAt, version: dto.version ?? undefined, } } function normalizeCollection(collection: BackendCollection): T[] { return Array.isArray(collection) ? collection : (collection.records ?? collection.items ?? collection.content ?? []) } export async function getRoles(): Promise { const response = await request.get>>('/v1/roles') return normalizeCollection(unwrapApiResponse(response)).map(normalizeRole) } export async function getAssignableRoles(): Promise { const response = await request.get>>('/v1/roles/assignable') return normalizeCollection(unwrapApiResponse(response)).map(normalizeRole) } export async function getRoleMembers( roleId: string, page: number, pageSize: number, ): Promise> { const response = await request.get>>( `/v1/roles/${encodeURIComponent(roleId)}/users`, { params: { page, size: pageSize } }, ) const result = unwrapApiResponse(response) return { records: result.records ?? result.items ?? result.content ?? [], total: result.total ?? 0, page: result.page ?? page, pageSize: result.size ?? pageSize, } } export async function getRolePermissionTree(): Promise { const response = await request.get>( '/v1/roles/permission-tree', ) return unwrapApiResponse(response) } export async function getRolePermissions(roleId: string): Promise { const response = await request.get>( `/v1/roles/${encodeURIComponent(roleId)}/permissions`, ) return unwrapApiResponse(response) } export async function updateRolePermissions( roleId: string, permissionIds: string[], ): Promise { const response = await request.put>( `/v1/roles/${encodeURIComponent(roleId)}/permissions`, { permissionIds }, ) unwrapNullableApiResponse(response) } export async function getRoleDataScope(roleId: string): Promise { const response = await request.get>( `/v1/roles/${encodeURIComponent(roleId)}/data-scope`, ) return unwrapApiResponse(response) } export async function updateRoleDataScope( roleId: string, payload: RoleDataScopeRequest, ): Promise { const response = await request.put>( `/v1/roles/${encodeURIComponent(roleId)}/data-scope`, payload, ) unwrapNullableApiResponse(response) } export async function createRole(payload: CreateRoleRequest): Promise { const response = await request.post>('/v1/roles', payload) return unwrapApiResponse(response).id } export async function updateRole(id: string, payload: UpdateRoleRequest): Promise { const response = await request.put>( `/v1/roles/${encodeURIComponent(id)}`, payload, ) unwrapNullableApiResponse(response) } export async function setRoleStatus(id: string, enabled: boolean): Promise { const response = await request.put>( `/v1/roles/${encodeURIComponent(id)}/status`, { enabled }, ) unwrapNullableApiResponse(response) } export async function deleteRole(id: string): Promise { const response = await request.delete>(`/v1/roles/${encodeURIComponent(id)}`) unwrapNullableApiResponse(response) }