diff --git a/backend-node/src/controllers/multilangController.ts b/backend-node/src/controllers/multilangController.ts index 39aa2eac..ab1c395c 100644 --- a/backend-node/src/controllers/multilangController.ts +++ b/backend-node/src/controllers/multilangController.ts @@ -753,6 +753,66 @@ export const getLangText = async ( } }; +/** + * DELETE /api/multilang/languages/:langCode + * 언어 삭제 API + */ +export const deleteLanguage = async ( + req: AuthenticatedRequest, + res: Response +): Promise => { + try { + const { langCode } = req.params; + logger.info("언어 삭제 요청", { langCode, user: req.user }); + + if (!langCode) { + res.status(400).json({ + success: false, + message: "언어 코드가 필요합니다.", + error: { + code: "MISSING_LANG_CODE", + details: "langCode parameter is required", + }, + }); + return; + } + + // PostgreSQL 클라이언트 생성 + const client = new Client({ + connectionString: + process.env.DATABASE_URL || + "postgresql://postgres:postgres@localhost:5432/ilshin", + }); + + await client.connect(); + + try { + const multiLangService = new MultiLangService(client); + await multiLangService.deleteLanguage(langCode); + + const response: ApiResponse = { + success: true, + message: "언어가 성공적으로 삭제되었습니다.", + data: "삭제 완료", + }; + + res.status(200).json(response); + } finally { + await client.end(); + } + } catch (error) { + logger.error("언어 삭제 실패:", error); + res.status(500).json({ + success: false, + message: "언어 삭제 중 오류가 발생했습니다.", + error: { + code: "LANGUAGE_DELETE_ERROR", + details: error instanceof Error ? error.message : "Unknown error", + }, + }); + } +}; + /** * POST /api/multilang/batch * 다국어 텍스트 배치 조회 API diff --git a/backend-node/src/routes/multilangRoutes.ts b/backend-node/src/routes/multilangRoutes.ts index 07280d40..47137346 100644 --- a/backend-node/src/routes/multilangRoutes.ts +++ b/backend-node/src/routes/multilangRoutes.ts @@ -5,6 +5,7 @@ import { getLanguages, createLanguage, updateLanguage, + deleteLanguage, toggleLanguage, // 다국어 키 관리 API @@ -34,6 +35,7 @@ router.use(authenticateToken); router.get("/languages", getLanguages); // 언어 목록 조회 router.post("/languages", createLanguage); // 언어 생성 router.put("/languages/:langCode", updateLanguage); // 언어 수정 +router.delete("/languages/:langCode", deleteLanguage); // 언어 삭제 router.put("/languages/:langCode/toggle", toggleLanguage); // 언어 상태 토글 // 다국어 키 관리 API diff --git a/backend-node/src/services/multilangService.ts b/backend-node/src/services/multilangService.ts index 480b9c60..f8147bab 100644 --- a/backend-node/src/services/multilangService.ts +++ b/backend-node/src/services/multilangService.ts @@ -840,6 +840,67 @@ export class MultiLangService { } } + /** + * 언어 삭제 + */ + async deleteLanguage(langCode: string): Promise { + try { + logger.info("언어 삭제 시작", { langCode }); + + // 기존 언어 확인 + const checkQuery = ` + SELECT lang_code FROM language_master WHERE lang_code = $1 + `; + const checkResult = await this.client.query(checkQuery, [langCode]); + + if (checkResult.rows.length === 0) { + throw new Error(`언어를 찾을 수 없습니다: ${langCode}`); + } + + // 트랜잭션 시작 + await this.client.query("BEGIN"); + + try { + // 관련된 다국어 텍스트 삭제 + const deleteTextsQuery = ` + DELETE FROM multi_lang_text + WHERE key_id IN ( + SELECT key_id FROM multi_lang_key_master + WHERE company_code = '*' OR company_code = 'SYSTEM' + ) + `; + await this.client.query(deleteTextsQuery); + + // 관련된 다국어 키 삭제 (시스템 레벨) + const deleteKeysQuery = ` + DELETE FROM multi_lang_key_master + WHERE company_code = '*' OR company_code = 'SYSTEM' + `; + await this.client.query(deleteKeysQuery); + + // 언어 마스터 삭제 + const deleteLanguageQuery = ` + DELETE FROM language_master WHERE lang_code = $1 + `; + await this.client.query(deleteLanguageQuery, [langCode]); + + // 트랜잭션 커밋 + await this.client.query("COMMIT"); + + logger.info("언어 삭제 완료", { langCode }); + } catch (error) { + // 트랜잭션 롤백 + await this.client.query("ROLLBACK"); + throw error; + } + } catch (error) { + logger.error("언어 삭제 중 오류 발생:", error); + throw new Error( + `언어 삭제 실패: ${error instanceof Error ? error.message : "Unknown error"}` + ); + } + } + /** * 기본 번역 생성 (키를 그대로 반환) */ diff --git a/frontend/components/admin/MultiLang.tsx b/frontend/components/admin/MultiLang.tsx index db587e6a..d77e0110 100644 --- a/frontend/components/admin/MultiLang.tsx +++ b/frontend/components/admin/MultiLang.tsx @@ -293,7 +293,7 @@ export default function MultiLangPage() { try { const deletePromises = Array.from(selectedLanguages).map((langCode) => - apiClient.delete(`/admin/multilang/languages/${langCode}`), + apiClient.delete(`/multilang/languages/${langCode}`), ); const responses = await Promise.all(deletePromises);