"use server"; import { logIntegrationExecution } from "./service"; /** * REST API 호출 로깅 래퍼 함수 * * @description * REST API 호출을 자동으로 로깅하는 래퍼 함수입니다. * 요청 시작부터 완료까지의 시간을 측정하고, 성공/실패 여부를 기록합니다. * * @param integrationId 인터페이스 ID (추후 매핑 필요) * @param url 요청 URL * @param method HTTP 메소드 * @param requestData 요청 데이터 * @param processor 실제 fetch 함수 * @returns 처리 결과 * * @example * // 기본 사용법 - 커스텀 처리 함수와 함께 * const result = await withRestLogging( * 1, // 인터페이스 ID * 'https://api.example.com/users', * 'GET', * undefined, * async () => { * const response = await fetch('https://api.example.com/users'); * return response.json(); * } * ); * * @example * // POST 요청 with 데이터 * const userData = { name: 'John', email: 'john@example.com' }; * const createdUser = await withRestLogging( * 2, * 'https://api.example.com/users', * 'POST', * userData, * async () => { * const response = await fetch('https://api.example.com/users', { * method: 'POST', * headers: { 'Content-Type': 'application/json' }, * body: JSON.stringify(userData) * }); * return response.json(); * } * ); * * @example * // 에러 처리와 함께 * try { * const result = await withRestLogging( * 3, * 'https://api.example.com/data', * 'GET', * undefined, * async () => { * const response = await fetch('https://api.example.com/data'); * if (!response.ok) { * throw new Error(`API Error: ${response.status}`); * } * return response.json(); * } * ); * } catch (error) { * console.error('API 호출 실패:', error); * } */ export async function withRestLogging( integrationId: number, url: string, method: string, requestData?: unknown, processor?: () => Promise ): Promise { const start = Date.now(); try { let result: T; if (processor) { // 커스텀 처리 함수가 있는 경우 result = await processor(); } else { // 기본 fetch 처리 const response = await fetch(url, { method, headers: { 'Content-Type': 'application/json', }, body: requestData ? JSON.stringify(requestData) : undefined, }); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } result = await response.json() as T; } const duration = Date.now() - start; // 성공 로그 기록 await logIntegrationExecution({ integrationId, status: 'success', responseTime: duration, requestMethod: method, requestUrl: url, correlationId: `rest_${Date.now()}`, }); return result; } catch (error) { const duration = Date.now() - start; // 실패 로그 기록 await logIntegrationExecution({ integrationId, status: 'failed', responseTime: duration, errorMessage: error instanceof Error ? error.message : 'Unknown error', requestMethod: method, requestUrl: url, correlationId: `rest_${Date.now()}`, }); throw error; } } /** * 기존 fetch 호출을 로깅 버전으로 래핑하는 헬퍼 함수 * * @description * 표준 fetch API를 사용하면서 자동으로 로깅하고 싶을 때 사용하는 헬퍼 함수입니다. * 기존 fetch 호출을 최소한의 변경으로 로깅 기능을 추가할 수 있습니다. * * @param integrationId 인터페이스 ID * @param url 요청 URL * @param options fetch 옵션 * @returns fetch 결과 * * @example * // 기본 GET 요청 * const response = await fetchWithLogging( * 1, * 'https://api.example.com/users' * ); * const users = await response.json(); * * @example * // POST 요청 with 옵션 * const response = await fetchWithLogging( * 2, * 'https://api.example.com/users', * { * method: 'POST', * headers: { * 'Content-Type': 'application/json', * 'Authorization': 'Bearer token' * }, * body: JSON.stringify({ name: 'John' }) * } * ); * * @example * // 기존 fetch 호출 대체 * // 기존: const response = await fetch('/api/data'); * // 새로운: const response = await fetchWithLogging(1, '/api/data'); */ export async function fetchWithLogging( integrationId: number, url: string, options: RequestInit = {} ): Promise { return withRestLogging( integrationId, url, options.method || 'GET', options.body, async () => { return fetch(url, options); } ); }