Files
johngreen 53f2638b82 fix(audit-log): URL 단/복수 + DB 컬럼명 + 응답 키 case 일괄 정정
- frontend `/audit-log` → 백엔드 `/audit-logs` (단/복수 mismatch)
- mapper auditLog.xml: `CREATED_DATE` → `CREATED_AT` (PostgreSQL 실제 컬럼명)
- AuditLogStats interface camelCase → snake_case (백엔드 응답 키 일치)

그렘린 카오스 테스트 + fetch hook 으로 발견. Application error / 500 / 404 모두 해결.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 16:11:26 +09:00

93 lines
2.8 KiB
TypeScript

import { apiClient } from "./client";
export interface AuditLogEntry {
id: number;
company_code: string;
company_name: string | null;
user_id: string;
user_name: string | null;
action: string;
resource_type: string;
resource_id: string | null;
resource_name: string | null;
table_name: string | null;
summary: string | null;
changes: any;
ip_address: string | null;
request_path: string | null;
created_at: string;
}
export interface AuditLogFilters {
company_code?: string;
user_id?: string;
resourceType?: string;
action?: string;
tableName?: string;
dateFrom?: string;
dateTo?: string;
search?: string;
page?: number;
limit?: number;
}
export interface AuditLogStats {
daily_counts: Array<{ date: string; count: number }>;
resource_type_counts: Array<{ resource_type: string; count: number }>;
action_counts: Array<{ action: string; count: number }>;
top_users: Array<{ user_id: string; user_name: string; count: number }>;
}
export async function getAuditLogs(
filters: AuditLogFilters
): Promise<{
success: boolean;
data: AuditLogEntry[];
total: number;
page: number;
limit: number;
}> {
const params = new URLSearchParams();
if (filters.company_code) params.append("companyCode", filters.company_code);
if (filters.user_id) params.append("userId", filters.user_id);
if (filters.resourceType) params.append("resourceType", filters.resourceType);
if (filters.action) params.append("action", filters.action);
if (filters.tableName) params.append("tableName", filters.tableName);
if (filters.dateFrom) params.append("dateFrom", filters.dateFrom);
if (filters.dateTo) params.append("dateTo", filters.dateTo);
if (filters.search) params.append("search", filters.search);
if (filters.page) params.append("page", String(filters.page));
if (filters.limit) params.append("limit", String(filters.limit));
const response = await apiClient.get(`/audit-logs?${params.toString()}`);
return response.data;
}
export async function getAuditLogStats(
companyCode?: string,
days?: number
): Promise<{ success: boolean; data: AuditLogStats }> {
const params = new URLSearchParams();
if (companyCode) params.append("companyCode", companyCode);
if (days) params.append("days", String(days));
const response = await apiClient.get(`/audit-logs/stats?${params.toString()}`);
return response.data;
}
export interface AuditLogUser {
user_id: string;
user_name: string;
count: number;
}
export async function getAuditLogUsers(
companyCode?: string
): Promise<{ success: boolean; data: AuditLogUser[] }> {
const params = new URLSearchParams();
if (companyCode) params.append("companyCode", companyCode);
const response = await apiClient.get(`/audit-logs/users?${params.toString()}`);
return response.data;
}