142 lines
4.5 KiB
TypeScript
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)
|
|
}
|