refactor(WEB): 전체 actions.ts에 공통 API 유틸 적용
- buildApiUrl / executePaginatedAction 패턴으로 전환 (40+ actions 파일) - 직접 URLSearchParams 조립 → buildApiUrl 유틸 사용 - 수동 페이지네이션 메타 변환 → executePaginatedAction 자동 처리 - HandoverReportDocumentModal, OrderDocumentModal 개선 - 급여관리 SalaryManagement 코드 개선 - CLAUDE.md Server Action 공통 유틸 규칙 정리 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -2,15 +2,12 @@
|
||||
|
||||
|
||||
import { executeServerAction, type ActionResult } from '@/lib/api/execute-server-action';
|
||||
import type { PaginatedApiResponse } from '@/lib/api/types';
|
||||
import { executePaginatedAction } from '@/lib/api/execute-paginated-action';
|
||||
import { buildApiUrl } from '@/lib/api/query-params';
|
||||
import type { PaymentApiData, PaymentHistory } from './types';
|
||||
import { transformApiToFrontend } from './utils';
|
||||
|
||||
const API_URL = process.env.NEXT_PUBLIC_API_URL;
|
||||
|
||||
// ===== API 응답 타입 =====
|
||||
type PaymentPaginatedResponse = PaginatedApiResponse<PaymentApiData>;
|
||||
|
||||
interface PaymentStatementApiData {
|
||||
statement_no: string;
|
||||
issued_at: string;
|
||||
@@ -37,40 +34,28 @@ interface StatementData {
|
||||
total: number;
|
||||
}
|
||||
|
||||
interface FrontendPagination { currentPage: number; lastPage: number; perPage: number; total: number }
|
||||
const DEFAULT_PAGINATION: FrontendPagination = { currentPage: 1, lastPage: 1, perPage: 20, total: 0 };
|
||||
|
||||
// ===== 결제 목록 조회 =====
|
||||
export async function getPayments(params?: {
|
||||
page?: number; perPage?: number; status?: string; startDate?: string; endDate?: string; search?: string;
|
||||
}): Promise<{
|
||||
success: boolean; data: PaymentHistory[]; pagination: FrontendPagination;
|
||||
error?: string; __authError?: boolean;
|
||||
}> {
|
||||
const searchParams = new URLSearchParams();
|
||||
if (params?.page) searchParams.append('page', String(params.page));
|
||||
if (params?.perPage) searchParams.append('per_page', String(params.perPage));
|
||||
if (params?.status) searchParams.append('status', params.status);
|
||||
if (params?.startDate) searchParams.append('start_date', params.startDate);
|
||||
if (params?.endDate) searchParams.append('end_date', params.endDate);
|
||||
if (params?.search) searchParams.append('search', params.search);
|
||||
const queryString = searchParams.toString();
|
||||
|
||||
const result = await executeServerAction({
|
||||
url: `${API_URL}/api/v1/payments${queryString ? `?${queryString}` : ''}`,
|
||||
transform: (data: PaymentPaginatedResponse) => ({
|
||||
items: (data?.data || []).map(transformApiToFrontend),
|
||||
pagination: { currentPage: data?.current_page || 1, lastPage: data?.last_page || 1, perPage: data?.per_page || 20, total: data?.total || 0 },
|
||||
}) {
|
||||
return executePaginatedAction<PaymentApiData, PaymentHistory>({
|
||||
url: buildApiUrl('/api/v1/payments', {
|
||||
page: params?.page,
|
||||
per_page: params?.perPage,
|
||||
status: params?.status,
|
||||
start_date: params?.startDate,
|
||||
end_date: params?.endDate,
|
||||
search: params?.search,
|
||||
}),
|
||||
transform: transformApiToFrontend,
|
||||
errorMessage: '결제 내역을 불러오는데 실패했습니다.',
|
||||
});
|
||||
return { success: result.success, data: result.data?.items || [], pagination: result.data?.pagination || DEFAULT_PAGINATION, error: result.error, __authError: result.__authError };
|
||||
}
|
||||
|
||||
// ===== 결제 명세서 조회 =====
|
||||
export async function getPaymentStatement(id: string): Promise<ActionResult<StatementData>> {
|
||||
return executeServerAction({
|
||||
url: `${API_URL}/api/v1/payments/${id}/statement`,
|
||||
url: buildApiUrl(`/api/v1/payments/${id}/statement`),
|
||||
transform: (data: PaymentStatementApiData): StatementData => ({
|
||||
statementNo: data.statement_no,
|
||||
issuedAt: data.issued_at,
|
||||
|
||||
Reference in New Issue
Block a user