import { query } from "../database/db"; /** * PostgreSQL 에러를 사용자 친절한 메시지로 변환 * table_type_columns의 column_label을 조회하여 한글 라벨로 표시 */ export async function formatPgError( error: any, companyCode?: string ): Promise { if (!error || !error.code) { return error?.message || "데이터 처리 중 오류가 발생했습니다."; } switch (error.code) { case "23502": { // not_null_violation const colName = error.column || ""; const tblName = error.table || ""; if (colName && tblName && companyCode) { try { const rows = await query( `SELECT column_label FROM table_type_columns WHERE table_name = $1 AND column_name = $2 AND company_code = $3 LIMIT 1`, [tblName, colName, companyCode] ); const label = rows[0]?.column_label; if (label) { return `필수 입력값이 누락되었습니다: ${label}`; } } catch { // 라벨 조회 실패 시 컬럼명으로 폴백 } } const detail = colName ? ` [${colName}]` : ""; return `필수 입력값이 누락되었습니다.${detail}`; } case "23505": { // unique_violation const constraint = error.constraint || ""; const tblName = error.table || ""; // constraint 이름에서 컬럼명 추출 시도 (예: item_mst_item_code_key → item_code) let colName = ""; if (constraint && tblName) { const prefix = `${tblName}_`; const suffix = "_key"; if (constraint.startsWith(prefix) && constraint.endsWith(suffix)) { colName = constraint.slice(prefix.length, -suffix.length); } } if (colName && tblName && companyCode) { try { const rows = await query( `SELECT column_label FROM table_type_columns WHERE table_name = $1 AND column_name = $2 AND company_code = $3 LIMIT 1`, [tblName, colName, companyCode] ); const label = rows[0]?.column_label; if (label) { return `중복된 데이터가 존재합니다: ${label}`; } } catch { // 폴백 } } const detail = colName ? ` [${colName}]` : ""; return `중복된 데이터가 존재합니다.${detail}`; } case "23503": return "참조 무결성 제약 조건 위반입니다."; default: if (error.code.startsWith("23")) { return "데이터 무결성 제약 조건 위반입니다."; } return error.message || "데이터 처리 중 오류가 발생했습니다."; } }