import { unwrapApiResponse, unwrapNullableApiResponse } from '@/utils/api-response' import { request } from '@/utils/request' import type { ApiResponse } from '@/types/common' import type { BackendCollection, CampusRecord, CreateCampusRequest, CreateDepartmentRequest, DepartmentRecord, OrganizationResponseDto, UpdateCampusRequest, UpdateDepartmentRequest, } from './types' const useMockData = import.meta.env.VITE_USE_MOCK !== 'false' function getRecords(data: BackendCollection) { return Array.isArray(data) ? data : (data.records ?? data.items ?? data.content ?? []) } export function getCampuses(): Promise { if (useMockData) { return Promise.resolve([]) } return request .get>>('/v1/campuses', { params: { page: 1, size: 200 }, }) .then(unwrapApiResponse) .then((data) => getRecords(data).map((item) => ({ id: item.id, code: item.code ?? item.id, name: item.name ?? item.campusName ?? item.id, address: item.address ?? undefined, status: item.status ?? 'ENABLED', sortNo: item.sortNo ?? 0, })), ) } export function getDepartments(campusId?: string): Promise { if (useMockData) { return Promise.resolve([]) } const params = campusId ? { page: 1, size: 200, campusId } : { page: 1, size: 200 } return request .get>>('/v1/departments', { params, }) .then(unwrapApiResponse) .then((data) => getRecords(data).map((item) => ({ id: item.id, campusId: item.campusId ?? '', parentId: item.parentId, code: item.code ?? item.id, name: item.name ?? item.departmentName ?? item.id, status: item.status ?? 'ENABLED', sortNo: item.sortNo ?? 0, })), ) } function mapCampus(data: OrganizationResponseDto): CampusRecord { return { id: data.id, code: data.code ?? data.id, name: data.name ?? data.campusName ?? data.id, address: data.address ?? undefined, status: data.status ?? 'ENABLED', sortNo: data.sortNo ?? 0, } } function mapDepartment(data: OrganizationResponseDto): DepartmentRecord { return { id: data.id, campusId: data.campusId ?? '', parentId: data.parentId, code: data.code ?? data.id, name: data.name ?? data.departmentName ?? data.id, status: data.status ?? 'ENABLED', sortNo: data.sortNo ?? 0, } } export async function createCampus(payload: CreateCampusRequest): Promise { if (useMockData) { throw new Error('Mock 模式不执行院区写操作') } const response = await request.post>('/v1/campuses', payload) return mapCampus(unwrapApiResponse(response)) } export async function updateCampus( id: string, payload: UpdateCampusRequest, ): Promise { if (useMockData) { throw new Error('Mock 模式不执行院区写操作') } const response = await request.put>( `/v1/campuses/${encodeURIComponent(id)}`, payload, ) return mapCampus(unwrapApiResponse(response)) } export async function deleteCampus(id: string): Promise { if (useMockData) { throw new Error('Mock 模式不执行院区写操作') } const response = await request.delete>(`/v1/campuses/${encodeURIComponent(id)}`) unwrapNullableApiResponse(response) } export async function createDepartment( payload: CreateDepartmentRequest, ): Promise { if (useMockData) { throw new Error('Mock 模式不执行科室写操作') } const response = await request.post>( '/v1/departments', payload, ) return mapDepartment(unwrapApiResponse(response)) } export async function updateDepartment( id: string, payload: UpdateDepartmentRequest, ): Promise { if (useMockData) { throw new Error('Mock 模式不执行科室写操作') } const response = await request.put>( `/v1/departments/${encodeURIComponent(id)}`, payload, ) return mapDepartment(unwrapApiResponse(response)) } export async function deleteDepartment(id: string): Promise { if (useMockData) { throw new Error('Mock 模式不执行科室写操作') } const response = await request.delete>( `/v1/departments/${encodeURIComponent(id)}`, ) unwrapNullableApiResponse(response) }