Files
xh-medical-sign-web/clinical-web/src/api/management/roles.ts
T

142 lines
4.5 KiB
TypeScript

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<T>(collection: BackendCollection<T>): T[] {
return Array.isArray(collection)
? collection
: (collection.records ?? collection.items ?? collection.content ?? [])
}
export async function getRoles(): Promise<RoleRecord[]> {
const response = await request.get<ApiResponse<BackendCollection<RoleResponseDto>>>('/v1/roles')
return normalizeCollection(unwrapApiResponse(response)).map(normalizeRole)
}
export async function getAssignableRoles(): Promise<RoleRecord[]> {
const response =
await request.get<ApiResponse<BackendCollection<RoleResponseDto>>>('/v1/roles/assignable')
return normalizeCollection(unwrapApiResponse(response)).map(normalizeRole)
}
export async function getRoleMembers(
roleId: string,
page: number,
pageSize: number,
): Promise<PageResult<RoleMemberDto>> {
const response = await request.get<ApiResponse<BackendPage<RoleMemberDto>>>(
`/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<PermissionResourceNodeDto[]> {
const response = await request.get<ApiResponse<PermissionResourceNodeDto[]>>(
'/v1/roles/permission-tree',
)
return unwrapApiResponse(response)
}
export async function getRolePermissions(roleId: string): Promise<string[]> {
const response = await request.get<ApiResponse<string[]>>(
`/v1/roles/${encodeURIComponent(roleId)}/permissions`,
)
return unwrapApiResponse(response)
}
export async function updateRolePermissions(
roleId: string,
permissionIds: string[],
): Promise<void> {
const response = await request.put<ApiResponse<null>>(
`/v1/roles/${encodeURIComponent(roleId)}/permissions`,
{ permissionIds },
)
unwrapNullableApiResponse(response)
}
export async function getRoleDataScope(roleId: string): Promise<RoleDataScopeResponseDto> {
const response = await request.get<ApiResponse<RoleDataScopeResponseDto>>(
`/v1/roles/${encodeURIComponent(roleId)}/data-scope`,
)
return unwrapApiResponse(response)
}
export async function updateRoleDataScope(
roleId: string,
payload: RoleDataScopeRequest,
): Promise<void> {
const response = await request.put<ApiResponse<null>>(
`/v1/roles/${encodeURIComponent(roleId)}/data-scope`,
payload,
)
unwrapNullableApiResponse(response)
}
export async function createRole(payload: CreateRoleRequest): Promise<string> {
const response = await request.post<ApiResponse<{ id: string }>>('/v1/roles', payload)
return unwrapApiResponse(response).id
}
export async function updateRole(id: string, payload: UpdateRoleRequest): Promise<void> {
const response = await request.put<ApiResponse<null>>(
`/v1/roles/${encodeURIComponent(id)}`,
payload,
)
unwrapNullableApiResponse(response)
}
export async function setRoleStatus(id: string, enabled: boolean): Promise<void> {
const response = await request.put<ApiResponse<null>>(
`/v1/roles/${encodeURIComponent(id)}/status`,
{ enabled },
)
unwrapNullableApiResponse(response)
}
export async function deleteRole(id: string): Promise<void> {
const response = await request.delete<ApiResponse<null>>(`/v1/roles/${encodeURIComponent(id)}`)
unwrapNullableApiResponse(response)
}