dev #46

Merged
kjs merged 344 commits from dev into main 2025-09-22 18:17:24 +09:00
5 changed files with 1135 additions and 1615 deletions
Showing only changes of commit cb88faa68e - Show all commits

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,6 @@ import { Request, Response } from "express";
import { logger } from "../utils/logger";
import { AuthenticatedRequest } from "../types/auth";
import { MultiLangService } from "../services/multilangService";
import { Client } from "pg";
import {
CreateLanguageRequest,
UpdateLanguageRequest,
@ -25,29 +24,16 @@ export const getLanguages = async (
try {
logger.info("언어 목록 조회 요청", { user: req.user });
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
});
const multiLangService = new MultiLangService();
const languages = await multiLangService.getLanguages();
await client.connect();
const response: ApiResponse<any[]> = {
success: true,
message: "언어 목록 조회 성공",
data: languages,
};
try {
const multiLangService = new MultiLangService(client);
const languages = await multiLangService.getLanguages();
const response: ApiResponse<any[]> = {
success: true,
message: "언어 목록 조회 성공",
data: languages,
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("언어 목록 조회 실패:", error);
res.status(500).json({
@ -90,33 +76,20 @@ export const createLanguage = async (
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
const multiLangService = new MultiLangService();
const createdLanguage = await multiLangService.createLanguage({
...languageData,
createdBy: req.user?.userId || "system",
updatedBy: req.user?.userId || "system",
});
await client.connect();
const response: ApiResponse<any> = {
success: true,
message: "언어가 성공적으로 생성되었습니다.",
data: createdLanguage,
};
try {
const multiLangService = new MultiLangService(client);
const createdLanguage = await multiLangService.createLanguage({
...languageData,
createdBy: req.user?.userId || "system",
updatedBy: req.user?.userId || "system",
});
const response: ApiResponse<any> = {
success: true,
message: "언어가 성공적으로 생성되었습니다.",
data: createdLanguage,
};
res.status(201).json(response);
} finally {
await client.end();
}
res.status(201).json(response);
} catch (error) {
logger.error("언어 생성 실패:", error);
res.status(500).json({
@ -144,32 +117,19 @@ export const updateLanguage = async (
logger.info("언어 수정 요청", { langCode, languageData, user: req.user });
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
const multiLangService = new MultiLangService();
const updatedLanguage = await multiLangService.updateLanguage(langCode, {
...languageData,
updatedBy: req.user?.userId || "system",
});
await client.connect();
const response: ApiResponse<any> = {
success: true,
message: "언어가 성공적으로 수정되었습니다.",
data: updatedLanguage,
};
try {
const multiLangService = new MultiLangService(client);
const updatedLanguage = await multiLangService.updateLanguage(langCode, {
...languageData,
updatedBy: req.user?.userId || "system",
});
const response: ApiResponse<any> = {
success: true,
message: "언어가 성공적으로 수정되었습니다.",
data: updatedLanguage,
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("언어 수정 실패:", error);
res.status(500).json({
@ -195,29 +155,16 @@ export const toggleLanguage = async (
const { langCode } = req.params;
logger.info("언어 상태 토글 요청", { langCode, user: req.user });
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
});
const multiLangService = new MultiLangService();
const result = await multiLangService.toggleLanguage(langCode);
await client.connect();
const response: ApiResponse<string> = {
success: true,
message: `언어가 ${result}되었습니다.`,
data: result,
};
try {
const multiLangService = new MultiLangService(client);
const result = await multiLangService.toggleLanguage(langCode);
const response: ApiResponse<string> = {
success: true,
message: `언어가 ${result}되었습니다.`,
data: result,
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("언어 상태 토글 실패:", error);
res.status(500).json({
@ -246,34 +193,21 @@ export const getLangKeys = async (
user: req.user,
});
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
const multiLangService = new MultiLangService();
const langKeys = await multiLangService.getLangKeys({
companyCode: companyCode as string,
menuCode: menuCode as string,
keyType: keyType as string,
searchText: searchText as string,
});
await client.connect();
const response: ApiResponse<any[]> = {
success: true,
message: "다국어 키 목록 조회 성공",
data: langKeys,
};
try {
const multiLangService = new MultiLangService(client);
const langKeys = await multiLangService.getLangKeys({
companyCode: companyCode as string,
menuCode: menuCode as string,
keyType: keyType as string,
searchText: searchText as string,
});
const response: ApiResponse<any[]> = {
success: true,
message: "다국어 키 목록 조회 성공",
data: langKeys,
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("다국어 키 목록 조회 실패:", error);
res.status(500).json({
@ -299,29 +233,16 @@ export const getLangTexts = async (
const { keyId } = req.params;
logger.info("다국어 텍스트 조회 요청", { keyId, user: req.user });
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
});
const multiLangService = new MultiLangService();
const langTexts = await multiLangService.getLangTexts(parseInt(keyId));
await client.connect();
const response: ApiResponse<any[]> = {
success: true,
message: "다국어 텍스트 조회 성공",
data: langTexts,
};
try {
const multiLangService = new MultiLangService(client);
const langTexts = await multiLangService.getLangTexts(parseInt(keyId));
const response: ApiResponse<any[]> = {
success: true,
message: "다국어 텍스트 조회 성공",
data: langTexts,
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("다국어 텍스트 조회 실패:", error);
res.status(500).json({
@ -360,33 +281,20 @@ export const createLangKey = async (
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
const multiLangService = new MultiLangService();
const keyId = await multiLangService.createLangKey({
...keyData,
createdBy: req.user?.userId || "system",
updatedBy: req.user?.userId || "system",
});
await client.connect();
const response: ApiResponse<number> = {
success: true,
message: "다국어 키가 성공적으로 생성되었습니다.",
data: keyId,
};
try {
const multiLangService = new MultiLangService(client);
const keyId = await multiLangService.createLangKey({
...keyData,
createdBy: req.user?.userId || "system",
updatedBy: req.user?.userId || "system",
});
const response: ApiResponse<number> = {
success: true,
message: "다국어 키가 성공적으로 생성되었습니다.",
data: keyId,
};
res.status(201).json(response);
} finally {
await client.end();
}
res.status(201).json(response);
} catch (error) {
logger.error("다국어 키 생성 실패:", error);
res.status(500).json({
@ -414,32 +322,19 @@ export const updateLangKey = async (
logger.info("다국어 키 수정 요청", { keyId, keyData, user: req.user });
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
const multiLangService = new MultiLangService();
await multiLangService.updateLangKey(parseInt(keyId), {
...keyData,
updatedBy: req.user?.userId || "system",
});
await client.connect();
const response: ApiResponse<string> = {
success: true,
message: "다국어 키가 성공적으로 수정되었습니다.",
data: "수정 완료",
};
try {
const multiLangService = new MultiLangService(client);
await multiLangService.updateLangKey(parseInt(keyId), {
...keyData,
updatedBy: req.user?.userId || "system",
});
const response: ApiResponse<string> = {
success: true,
message: "다국어 키가 성공적으로 수정되었습니다.",
data: "수정 완료",
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("다국어 키 수정 실패:", error);
res.status(500).json({
@ -465,29 +360,16 @@ export const deleteLangKey = async (
const { keyId } = req.params;
logger.info("다국어 키 삭제 요청", { keyId, user: req.user });
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
});
const multiLangService = new MultiLangService();
await multiLangService.deleteLangKey(parseInt(keyId));
await client.connect();
const response: ApiResponse<string> = {
success: true,
message: "다국어 키가 성공적으로 삭제되었습니다.",
data: "삭제 완료",
};
try {
const multiLangService = new MultiLangService(client);
await multiLangService.deleteLangKey(parseInt(keyId));
const response: ApiResponse<string> = {
success: true,
message: "다국어 키가 성공적으로 삭제되었습니다.",
data: "삭제 완료",
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("다국어 키 삭제 실패:", error);
res.status(500).json({
@ -513,29 +395,16 @@ export const toggleLangKey = async (
const { keyId } = req.params;
logger.info("다국어 키 상태 토글 요청", { keyId, user: req.user });
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
});
const multiLangService = new MultiLangService();
const result = await multiLangService.toggleLangKey(parseInt(keyId));
await client.connect();
const response: ApiResponse<string> = {
success: true,
message: `다국어 키가 ${result}되었습니다.`,
data: result,
};
try {
const multiLangService = new MultiLangService(client);
const result = await multiLangService.toggleLangKey(parseInt(keyId));
const response: ApiResponse<string> = {
success: true,
message: `다국어 키가 ${result}되었습니다.`,
data: result,
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("다국어 키 상태 토글 실패:", error);
res.status(500).json({
@ -580,35 +449,22 @@ export const saveLangTexts = async (
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
const multiLangService = new MultiLangService();
await multiLangService.saveLangTexts(parseInt(keyId), {
texts: textData.texts.map((text) => ({
...text,
createdBy: req.user?.userId || "system",
updatedBy: req.user?.userId || "system",
})),
});
await client.connect();
const response: ApiResponse<string> = {
success: true,
message: "다국어 텍스트가 성공적으로 저장되었습니다.",
data: "저장 완료",
};
try {
const multiLangService = new MultiLangService(client);
await multiLangService.saveLangTexts(parseInt(keyId), {
texts: textData.texts.map((text) => ({
...text,
createdBy: req.user?.userId || "system",
updatedBy: req.user?.userId || "system",
})),
});
const response: ApiResponse<string> = {
success: true,
message: "다국어 텍스트가 성공적으로 저장되었습니다.",
data: "저장 완료",
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("다국어 텍스트 저장 실패:", error);
res.status(500).json({
@ -654,34 +510,21 @@ export const getUserText = async (
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
const multiLangService = new MultiLangService();
const langText = await multiLangService.getUserText({
companyCode,
menuCode,
langKey,
userLang: userLang as string,
});
await client.connect();
const response: ApiResponse<string> = {
success: true,
message: "사용자별 다국어 텍스트 조회 성공",
data: langText,
};
try {
const multiLangService = new MultiLangService(client);
const langText = await multiLangService.getUserText({
companyCode,
menuCode,
langKey,
userLang: userLang as string,
});
const response: ApiResponse<string> = {
success: true,
message: "사용자별 다국어 텍스트 조회 성공",
data: langText,
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("사용자별 다국어 텍스트 조회 실패:", error);
res.status(500).json({
@ -713,33 +556,20 @@ export const getLangText = async (
user: req.user,
});
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
});
const multiLangService = new MultiLangService();
const langText = await multiLangService.getLangText(
companyCode,
langKey,
langCode
);
await client.connect();
const response: ApiResponse<string> = {
success: true,
message: "특정 키의 다국어 텍스트 조회 성공",
data: langText,
};
try {
const multiLangService = new MultiLangService(client);
const langText = await multiLangService.getLangText(
companyCode,
langKey,
langCode
);
const response: ApiResponse<string> = {
success: true,
message: "특정 키의 다국어 텍스트 조회 성공",
data: langText,
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("특정 키의 다국어 텍스트 조회 실패:", error);
res.status(500).json({
@ -777,29 +607,16 @@ export const deleteLanguage = async (
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
});
const multiLangService = new MultiLangService();
await multiLangService.deleteLanguage(langCode);
await client.connect();
const response: ApiResponse<string> = {
success: true,
message: "언어가 성공적으로 삭제되었습니다.",
data: "삭제 완료",
};
try {
const multiLangService = new MultiLangService(client);
await multiLangService.deleteLanguage(langCode);
const response: ApiResponse<string> = {
success: true,
message: "언어가 성공적으로 삭제되었습니다.",
data: "삭제 완료",
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("언어 삭제 실패:", error);
res.status(500).json({
@ -866,34 +683,21 @@ export const getBatchTranslations = async (
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString:
process.env.DATABASE_URL ||
"postgresql://postgres:postgres@localhost:5432/ilshin",
const multiLangService = new MultiLangService();
const translations = await multiLangService.getBatchTranslations({
companyCode: finalCompanyCode as string,
menuCode: finalMenuCode as string,
userLang: finalUserLang as string,
langKeys,
});
await client.connect();
const response: ApiResponse<Record<string, string>> = {
success: true,
message: "다국어 텍스트 배치 조회 성공",
data: translations,
};
try {
const multiLangService = new MultiLangService(client);
const translations = await multiLangService.getBatchTranslations({
companyCode: finalCompanyCode as string,
menuCode: finalMenuCode as string,
userLang: finalUserLang as string,
langKeys,
});
const response: ApiResponse<Record<string, string>> = {
success: true,
message: "다국어 텍스트 배치 조회 성공",
data: translations,
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("다국어 텍스트 배치 조회 실패:", error);
res.status(500).json({

View File

@ -2,7 +2,6 @@ import { Request, Response } from "express";
import { logger } from "../utils/logger";
import { AuthenticatedRequest } from "../types/auth";
import { ApiResponse } from "../types/common";
import { Client } from "pg";
import { TableManagementService } from "../services/tableManagementService";
import {
TableInfo,
@ -23,29 +22,18 @@ export async function getTableList(
try {
logger.info("=== 테이블 목록 조회 시작 ===");
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString: process.env.DATABASE_URL,
});
const tableManagementService = new TableManagementService();
const tableList = await tableManagementService.getTableList();
await client.connect();
logger.info(`테이블 목록 조회 결과: ${tableList.length}`);
try {
const tableManagementService = new TableManagementService(client);
const tableList = await tableManagementService.getTableList();
const response: ApiResponse<TableInfo[]> = {
success: true,
message: "테이블 목록을 성공적으로 조회했습니다.",
data: tableList,
};
logger.info(`테이블 목록 조회 결과: ${tableList.length}`);
const response: ApiResponse<TableInfo[]> = {
success: true,
message: "테이블 목록을 성공적으로 조회했습니다.",
data: tableList,
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("테이블 목록 조회 중 오류 발생:", error);
@ -86,29 +74,18 @@ export async function getColumnList(
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString: process.env.DATABASE_URL,
});
const tableManagementService = new TableManagementService();
const columnList = await tableManagementService.getColumnList(tableName);
await client.connect();
logger.info(`컬럼 정보 조회 결과: ${tableName}, ${columnList.length}`);
try {
const tableManagementService = new TableManagementService(client);
const columnList = await tableManagementService.getColumnList(tableName);
const response: ApiResponse<ColumnTypeInfo[]> = {
success: true,
message: "컬럼 목록을 성공적으로 조회했습니다.",
data: columnList,
};
logger.info(`컬럼 정보 조회 결과: ${tableName}, ${columnList.length}`);
const response: ApiResponse<ColumnTypeInfo[]> = {
success: true,
message: "컬럼 목록을 성공적으로 조회했습니다.",
data: columnList,
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("컬럼 정보 조회 중 오류 발생:", error);
@ -164,32 +141,21 @@ export async function updateColumnSettings(
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString: process.env.DATABASE_URL,
});
const tableManagementService = new TableManagementService();
await tableManagementService.updateColumnSettings(
tableName,
columnName,
settings
);
await client.connect();
logger.info(`컬럼 설정 업데이트 완료: ${tableName}.${columnName}`);
try {
const tableManagementService = new TableManagementService(client);
await tableManagementService.updateColumnSettings(
tableName,
columnName,
settings
);
const response: ApiResponse<null> = {
success: true,
message: "컬럼 설정을 성공적으로 저장했습니다.",
};
logger.info(`컬럼 설정 업데이트 완료: ${tableName}.${columnName}`);
const response: ApiResponse<null> = {
success: true,
message: "컬럼 설정을 성공적으로 저장했습니다.",
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("컬럼 설정 업데이트 중 오류 발생:", error);
@ -245,33 +211,22 @@ export async function updateAllColumnSettings(
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString: process.env.DATABASE_URL,
});
const tableManagementService = new TableManagementService();
await tableManagementService.updateAllColumnSettings(
tableName,
columnSettings
);
await client.connect();
logger.info(
`전체 컬럼 설정 일괄 업데이트 완료: ${tableName}, ${columnSettings.length}`
);
try {
const tableManagementService = new TableManagementService(client);
await tableManagementService.updateAllColumnSettings(
tableName,
columnSettings
);
const response: ApiResponse<null> = {
success: true,
message: "모든 컬럼 설정을 성공적으로 저장했습니다.",
};
logger.info(
`전체 컬럼 설정 일괄 업데이트 완료: ${tableName}, ${columnSettings.length}`
);
const response: ApiResponse<null> = {
success: true,
message: "모든 컬럼 설정을 성공적으로 저장했습니다.",
};
res.status(200).json(response);
} finally {
await client.end();
}
res.status(200).json(response);
} catch (error) {
logger.error("전체 컬럼 설정 일괄 업데이트 중 오류 발생:", error);
@ -312,43 +267,31 @@ export async function getTableLabels(
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString: process.env.DATABASE_URL,
});
const tableManagementService = new TableManagementService();
const tableLabels = await tableManagementService.getTableLabels(tableName);
await client.connect();
try {
const tableManagementService = new TableManagementService(client);
const tableLabels =
await tableManagementService.getTableLabels(tableName);
if (!tableLabels) {
const response: ApiResponse<null> = {
success: false,
message: "테이블 라벨 정보를 찾을 수 없습니다.",
error: {
code: "TABLE_LABELS_NOT_FOUND",
details: `테이블 ${tableName}의 라벨 정보가 존재하지 않습니다.`,
},
};
res.status(404).json(response);
return;
}
logger.info(`테이블 라벨 정보 조회 완료: ${tableName}`);
const response: ApiResponse<any> = {
success: true,
message: "테이블 라벨 정보를 성공적으로 조회했습니다.",
data: tableLabels,
if (!tableLabels) {
const response: ApiResponse<null> = {
success: false,
message: "테이블 라벨 정보를 찾을 수 없습니다.",
error: {
code: "TABLE_LABELS_NOT_FOUND",
details: `테이블 ${tableName}의 라벨 정보가 존재하지 않습니다.`,
},
};
res.status(200).json(response);
} finally {
await client.end();
res.status(404).json(response);
return;
}
logger.info(`테이블 라벨 정보 조회 완료: ${tableName}`);
const response: ApiResponse<any> = {
success: true,
message: "테이블 라벨 정보를 성공적으로 조회했습니다.",
data: tableLabels,
};
res.status(200).json(response);
} catch (error) {
logger.error("테이블 라벨 정보 조회 중 오류 발생:", error);
@ -389,45 +332,34 @@ export async function getColumnLabels(
return;
}
// PostgreSQL 클라이언트 생성
const client = new Client({
connectionString: process.env.DATABASE_URL,
});
const tableManagementService = new TableManagementService();
const columnLabels = await tableManagementService.getColumnLabels(
tableName,
columnName
);
await client.connect();
try {
const tableManagementService = new TableManagementService(client);
const columnLabels = await tableManagementService.getColumnLabels(
tableName,
columnName
);
if (!columnLabels) {
const response: ApiResponse<null> = {
success: false,
message: "컬럼 라벨 정보를 찾을 수 없습니다.",
error: {
code: "COLUMN_LABELS_NOT_FOUND",
details: `컬럼 ${tableName}.${columnName}의 라벨 정보가 존재하지 않습니다.`,
},
};
res.status(404).json(response);
return;
}
logger.info(`컬럼 라벨 정보 조회 완료: ${tableName}.${columnName}`);
const response: ApiResponse<any> = {
success: true,
message: "컬럼 라벨 정보를 성공적으로 조회했습니다.",
data: columnLabels,
if (!columnLabels) {
const response: ApiResponse<null> = {
success: false,
message: "컬럼 라벨 정보를 찾을 수 없습니다.",
error: {
code: "COLUMN_LABELS_NOT_FOUND",
details: `컬럼 ${tableName}.${columnName}의 라벨 정보가 존재하지 않습니다.`,
},
};
res.status(200).json(response);
} finally {
await client.end();
res.status(404).json(response);
return;
}
logger.info(`컬럼 라벨 정보 조회 완료: ${tableName}.${columnName}`);
const response: ApiResponse<any> = {
success: true,
message: "컬럼 라벨 정보를 성공적으로 조회했습니다.",
data: columnLabels,
};
res.status(200).json(response);
} catch (error) {
logger.error("컬럼 라벨 정보 조회 중 오류 발생:", error);

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
import { Client } from "pg";
import { PrismaClient } from "@prisma/client";
import { logger } from "../utils/logger";
import {
TableInfo,
@ -8,21 +8,21 @@ import {
ColumnLabels,
} from "../types/tableManagement";
export class TableManagementService {
private client: Client;
const prisma = new PrismaClient();
constructor(client: Client) {
this.client = client;
}
export class TableManagementService {
constructor() {}
/**
* (PostgreSQL information_schema )
* Prisma로
*/
async getTableList(): Promise<TableInfo[]> {
try {
logger.info("테이블 목록 조회 시작");
const query = `
// information_schema는 여전히 $queryRaw 사용
const tables = await prisma.$queryRaw<TableInfo[]>`
SELECT
t.table_name as "tableName",
COALESCE(tl.table_label, t.table_name) as "displayName",
@ -38,10 +38,8 @@ export class TableManagementService {
ORDER BY t.table_name
`;
const result = await this.client.query(query);
logger.info(`테이블 목록 조회 완료: ${result.rows.length}`);
return result.rows;
logger.info(`테이블 목록 조회 완료: ${tables.length}`);
return tables;
} catch (error) {
logger.error("테이블 목록 조회 중 오류 발생:", error);
throw new Error(
@ -52,12 +50,14 @@ export class TableManagementService {
/**
*
* Prisma로
*/
async getColumnList(tableName: string): Promise<ColumnTypeInfo[]> {
try {
logger.info(`컬럼 정보 조회 시작: ${tableName}`);
const query = `
// information_schema는 여전히 $queryRaw 사용
const columns = await prisma.$queryRaw<ColumnTypeInfo[]>`
SELECT
c.column_name as "columnName",
COALESCE(cl.column_label, c.column_name) as "displayName",
@ -78,14 +78,12 @@ export class TableManagementService {
cl.is_visible as "isVisible"
FROM information_schema.columns c
LEFT JOIN column_labels cl ON c.table_name = cl.table_name AND c.column_name = cl.column_name
WHERE c.table_name = $1
WHERE c.table_name = ${tableName}
ORDER BY c.ordinal_position
`;
const result = await this.client.query(query, [tableName]);
logger.info(`컬럼 정보 조회 완료: ${tableName}, ${result.rows.length}`);
return result.rows;
logger.info(`컬럼 정보 조회 완료: ${tableName}, ${columns.length}`);
return columns;
} catch (error) {
logger.error(`컬럼 정보 조회 중 오류 발생: ${tableName}`, error);
throw new Error(
@ -96,18 +94,22 @@ export class TableManagementService {
/**
* table_labels에
* Prisma ORM으로
*/
async insertTableIfNotExists(tableName: string): Promise<void> {
try {
logger.info(`테이블 라벨 자동 추가 시작: ${tableName}`);
const query = `
INSERT INTO table_labels (table_name, table_label, description)
VALUES ($1, $1, '')
ON CONFLICT (table_name) DO NOTHING
`;
await prisma.table_labels.upsert({
where: { table_name: tableName },
update: {}, // 이미 존재하면 변경하지 않음
create: {
table_name: tableName,
table_label: tableName,
description: "",
},
});
await this.client.query(query, [tableName]);
logger.info(`테이블 라벨 자동 추가 완료: ${tableName}`);
} catch (error) {
logger.error(`테이블 라벨 자동 추가 중 오류 발생: ${tableName}`, error);
@ -119,6 +121,7 @@ export class TableManagementService {
/**
* (UPSERT )
* Prisma ORM으로
*/
async updateColumnSettings(
tableName: string,
@ -131,38 +134,42 @@ export class TableManagementService {
// 테이블이 table_labels에 없으면 자동 추가
await this.insertTableIfNotExists(tableName);
const query = `
INSERT INTO column_labels (
table_name, column_name, column_label, web_type,
detail_settings, code_category, code_value,
reference_table, reference_column, display_order, is_visible
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
ON CONFLICT (table_name, column_name) DO UPDATE SET
column_label = EXCLUDED.column_label,
web_type = EXCLUDED.web_type,
detail_settings = EXCLUDED.detail_settings,
code_category = EXCLUDED.code_category,
code_value = EXCLUDED.code_value,
reference_table = EXCLUDED.reference_table,
reference_column = EXCLUDED.reference_column,
display_order = EXCLUDED.display_order,
is_visible = EXCLUDED.is_visible,
updated_date = now()
`;
await this.client.query(query, [
tableName,
columnName,
settings.columnLabel,
settings.webType,
settings.detailSettings,
settings.codeCategory,
settings.codeValue,
settings.referenceTable,
settings.referenceColumn,
settings.displayOrder || 0,
settings.isVisible !== undefined ? settings.isVisible : true,
]);
// column_labels 업데이트 또는 생성
await prisma.column_labels.upsert({
where: {
table_name_column_name: {
table_name: tableName,
column_name: columnName,
},
},
update: {
column_label: settings.columnLabel,
web_type: settings.webType,
detail_settings: settings.detailSettings,
code_category: settings.codeCategory,
code_value: settings.codeValue,
reference_table: settings.referenceTable,
reference_column: settings.referenceColumn,
display_order: settings.displayOrder || 0,
is_visible:
settings.isVisible !== undefined ? settings.isVisible : true,
updated_date: new Date(),
},
create: {
table_name: tableName,
column_name: columnName,
column_label: settings.columnLabel,
web_type: settings.webType,
detail_settings: settings.detailSettings,
code_category: settings.codeCategory,
code_value: settings.codeValue,
reference_table: settings.referenceTable,
reference_column: settings.referenceColumn,
display_order: settings.displayOrder || 0,
is_visible:
settings.isVisible !== undefined ? settings.isVisible : true,
},
});
logger.info(`컬럼 설정 업데이트 완료: ${tableName}.${columnName}`);
} catch (error) {
@ -178,6 +185,7 @@ export class TableManagementService {
/**
*
* Prisma
*/
async updateAllColumnSettings(
tableName: string,
@ -188,10 +196,8 @@ export class TableManagementService {
`전체 컬럼 설정 일괄 업데이트 시작: ${tableName}, ${columnSettings.length}`
);
// 트랜잭션 시작
await this.client.query("BEGIN");
try {
// Prisma 트랜잭션 사용
await prisma.$transaction(async (tx) => {
// 테이블이 table_labels에 없으면 자동 추가
await this.insertTableIfNotExists(tableName);
@ -207,15 +213,9 @@ export class TableManagementService {
);
}
}
});
// 트랜잭션 커밋
await this.client.query("COMMIT");
logger.info(`전체 컬럼 설정 일괄 업데이트 완료: ${tableName}`);
} catch (error) {
// 트랜잭션 롤백
await this.client.query("ROLLBACK");
throw error;
}
logger.info(`전체 컬럼 설정 일괄 업데이트 완료: ${tableName}`);
} catch (error) {
logger.error(
`전체 컬럼 설정 일괄 업데이트 중 오류 발생: ${tableName}`,
@ -229,30 +229,37 @@ export class TableManagementService {
/**
*
* Prisma ORM으로
*/
async getTableLabels(tableName: string): Promise<TableLabels | null> {
try {
logger.info(`테이블 라벨 정보 조회 시작: ${tableName}`);
const query = `
SELECT
table_name as "tableName",
table_label as "tableLabel",
description,
created_date as "createdDate",
updated_date as "updatedDate"
FROM table_labels
WHERE table_name = $1
`;
const tableLabel = await prisma.table_labels.findUnique({
where: { table_name: tableName },
select: {
table_name: true,
table_label: true,
description: true,
created_date: true,
updated_date: true,
},
});
const result = await this.client.query(query, [tableName]);
if (result.rows.length === 0) {
if (!tableLabel) {
return null;
}
const result: TableLabels = {
tableName: tableLabel.table_name,
tableLabel: tableLabel.table_label || undefined,
description: tableLabel.description || undefined,
createdDate: tableLabel.created_date || undefined,
updatedDate: tableLabel.updated_date || undefined,
};
logger.info(`테이블 라벨 정보 조회 완료: ${tableName}`);
return result.rows[0];
return result;
} catch (error) {
logger.error(`테이블 라벨 정보 조회 중 오류 발생: ${tableName}`, error);
throw new Error(
@ -263,6 +270,7 @@ export class TableManagementService {
/**
*
* Prisma ORM으로
*/
async getColumnLabels(
tableName: string,
@ -271,35 +279,56 @@ export class TableManagementService {
try {
logger.info(`컬럼 라벨 정보 조회 시작: ${tableName}.${columnName}`);
const query = `
SELECT
id,
table_name as "tableName",
column_name as "columnName",
column_label as "columnLabel",
web_type as "webType",
detail_settings as "detailSettings",
description,
display_order as "displayOrder",
is_visible as "isVisible",
code_category as "codeCategory",
code_value as "codeValue",
reference_table as "referenceTable",
reference_column as "referenceColumn",
created_date as "createdDate",
updated_date as "updatedDate"
FROM column_labels
WHERE table_name = $1 AND column_name = $2
`;
const columnLabel = await prisma.column_labels.findUnique({
where: {
table_name_column_name: {
table_name: tableName,
column_name: columnName,
},
},
select: {
id: true,
table_name: true,
column_name: true,
column_label: true,
web_type: true,
detail_settings: true,
description: true,
display_order: true,
is_visible: true,
code_category: true,
code_value: true,
reference_table: true,
reference_column: true,
created_date: true,
updated_date: true,
},
});
const result = await this.client.query(query, [tableName, columnName]);
if (result.rows.length === 0) {
if (!columnLabel) {
return null;
}
const result: ColumnLabels = {
id: columnLabel.id,
tableName: columnLabel.table_name || "",
columnName: columnLabel.column_name || "",
columnLabel: columnLabel.column_label || undefined,
webType: columnLabel.web_type || undefined,
detailSettings: columnLabel.detail_settings || undefined,
description: columnLabel.description || undefined,
displayOrder: columnLabel.display_order || undefined,
isVisible: columnLabel.is_visible || undefined,
codeCategory: columnLabel.code_category || undefined,
codeValue: columnLabel.code_value || undefined,
referenceTable: columnLabel.reference_table || undefined,
referenceColumn: columnLabel.reference_column || undefined,
createdDate: columnLabel.created_date || undefined,
updatedDate: columnLabel.updated_date || undefined,
};
logger.info(`컬럼 라벨 정보 조회 완료: ${tableName}.${columnName}`);
return result.rows[0];
return result;
} catch (error) {
logger.error(
`컬럼 라벨 정보 조회 중 오류 발생: ${tableName}.${columnName}`,