Files
lehuo/apps/admin-web/src/api/case-management.ts
T
2026-08-12 14:35:12 +08:00

173 lines
5.1 KiB
TypeScript

import type {
AcceptServiceApplicationRequest,
AcceptServiceApplicationResponse,
AssigneeOption,
BeneficiaryDetailResponse,
BeneficiaryTagOption,
ConfirmUploadResponse,
CompleteServiceCaseRequest,
CompleteServiceCaseResponse,
CreateServiceRecordRequest,
CreateUploadIntentRequest,
CreateUploadIntentResponse,
DownloadUrlResponse,
PaginatedBeneficiariesResponse,
PaginatedServiceCasesResponse,
ReplaceCaseAssigneesRequest,
ServiceCaseDetailResponse,
ServiceCategory,
ServiceCaseStatus,
ServiceRecordResponse,
TransitionServiceApplicationRequest,
UpdateBeneficiaryRequest,
UpdateServiceRecordRequest,
} from '@lehuo/contracts';
import { apiRequest } from './api-client';
function queryString(values: Record<string, string | number | boolean | undefined>): string {
const params = new URLSearchParams();
Object.entries(values).forEach(([key, value]) => {
if (value !== undefined && value !== '') params.set(key, String(value));
});
return params.toString();
}
export function transitionServiceApplication(
publicId: string,
input: TransitionServiceApplicationRequest,
): Promise<{ status: string }> {
return apiRequest(
`/api/v1/admin/service-applications/${encodeURIComponent(publicId)}/transition`,
{
method: 'POST',
body: JSON.stringify(input),
},
);
}
export function acceptServiceApplication(
publicId: string,
input: AcceptServiceApplicationRequest,
): Promise<AcceptServiceApplicationResponse> {
return apiRequest(`/api/v1/admin/service-applications/${encodeURIComponent(publicId)}/accept`, {
method: 'POST',
body: JSON.stringify(input),
});
}
export function fetchBeneficiaryTags(): Promise<BeneficiaryTagOption[]> {
return apiRequest('/api/v1/admin/beneficiaries/tags');
}
export function fetchBeneficiaries(query: {
page: number;
pageSize: number;
primaryCategory?: ServiceCategory;
status?: string;
keyCareFlag?: boolean;
}): Promise<PaginatedBeneficiariesResponse> {
return apiRequest(`/api/v1/admin/beneficiaries?${queryString(query)}`);
}
export function fetchBeneficiary(publicId: string): Promise<BeneficiaryDetailResponse> {
return apiRequest(`/api/v1/admin/beneficiaries/${encodeURIComponent(publicId)}`);
}
export function updateBeneficiary(
publicId: string,
input: UpdateBeneficiaryRequest,
): Promise<BeneficiaryDetailResponse> {
return apiRequest(`/api/v1/admin/beneficiaries/${encodeURIComponent(publicId)}`, {
method: 'PUT',
body: JSON.stringify(input),
});
}
export function fetchAssigneeOptions(): Promise<AssigneeOption[]> {
return apiRequest('/api/v1/admin/service-cases/assignee-options');
}
export function fetchServiceCases(query: {
page: number;
pageSize: number;
status?: ServiceCaseStatus;
category?: ServiceCategory;
caseNo?: string;
}): Promise<PaginatedServiceCasesResponse> {
return apiRequest(`/api/v1/admin/service-cases?${queryString(query)}`);
}
export function fetchServiceCase(publicId: string): Promise<ServiceCaseDetailResponse> {
return apiRequest(`/api/v1/admin/service-cases/${encodeURIComponent(publicId)}`);
}
export function startServiceCase(publicId: string): Promise<ServiceCaseDetailResponse> {
return apiRequest(`/api/v1/admin/service-cases/${encodeURIComponent(publicId)}/start`, {
method: 'POST',
body: '{}',
});
}
export function completeServiceCase(
publicId: string,
input: CompleteServiceCaseRequest,
): Promise<CompleteServiceCaseResponse> {
return apiRequest(`/api/v1/admin/service-cases/${encodeURIComponent(publicId)}/complete`, {
method: 'POST',
body: JSON.stringify(input),
});
}
export function replaceCaseAssignees(
publicId: string,
input: ReplaceCaseAssigneesRequest,
): Promise<ServiceCaseDetailResponse> {
return apiRequest(`/api/v1/admin/service-cases/${encodeURIComponent(publicId)}/assignees`, {
method: 'PUT',
body: JSON.stringify(input),
});
}
export function createServiceRecord(
publicId: string,
input: CreateServiceRecordRequest,
): Promise<ServiceRecordResponse> {
return apiRequest(`/api/v1/admin/service-cases/${encodeURIComponent(publicId)}/records`, {
method: 'POST',
body: JSON.stringify(input),
});
}
export function updateServiceRecord(
casePublicId: string,
recordPublicId: string,
input: UpdateServiceRecordRequest,
): Promise<ServiceRecordResponse> {
return apiRequest(
`/api/v1/admin/service-cases/${encodeURIComponent(casePublicId)}/records/${encodeURIComponent(recordPublicId)}`,
{ method: 'PATCH', body: JSON.stringify(input) },
);
}
export function createUploadIntent(
casePublicId: string,
input: CreateUploadIntentRequest,
): Promise<CreateUploadIntentResponse> {
return apiRequest(
`/api/v1/service-cases/${encodeURIComponent(casePublicId)}/files/upload-intents`,
{ method: 'POST', body: JSON.stringify(input) },
);
}
export function confirmUpload(publicId: string): Promise<ConfirmUploadResponse> {
return apiRequest(`/api/v1/files/${encodeURIComponent(publicId)}/confirm`, {
method: 'POST',
body: '{}',
});
}
export function fetchDownloadUrl(publicId: string): Promise<DownloadUrlResponse> {
return apiRequest(`/api/v1/files/${encodeURIComponent(publicId)}/download-url`);
}