const pool = require("./db/pool.js"); async function runPatch() { const client = await pool.connect(); try { console.log("๐Ÿš€ Starting Admin Dashboard DB Patch..."); // 1. code_master ํ…Œ์ด๋ธ” ์ƒ์„ฑ console.log("Creating ver4.code_master table..."); await client.query(` CREATE TABLE IF NOT EXISTS ver4.code_master ( main_code VARCHAR(30) PRIMARY KEY, main_code_nm VARCHAR(100) NOT NULL, use_yn CHAR(1) DEFAULT 'Y', rmk VARCHAR(255) ); `); // 2. code_detail ํ…Œ์ด๋ธ” ์ƒ์„ฑ console.log("Creating ver4.code_detail table..."); await client.query(` CREATE TABLE IF NOT EXISTS ver4.code_detail ( main_code VARCHAR(30) REFERENCES ver4.code_master(main_code) ON DELETE CASCADE, sub_code VARCHAR(30) NOT NULL, base_code VARCHAR(61) UNIQUE NOT NULL, code_nm VARCHAR(100) NOT NULL, sort_ord INT DEFAULT 1, use_yn CHAR(1) DEFAULT 'Y', rmk VARCHAR(255), PRIMARY KEY (main_code, sub_code) ); `); // 3. tb_system_policy ํ…Œ์ด๋ธ” ์ƒ์„ฑ console.log("Creating ver4.tb_system_policy table..."); await client.query(` CREATE TABLE IF NOT EXISTS ver4.tb_system_policy ( policy_id SERIAL PRIMARY KEY, policy_key VARCHAR(50) UNIQUE NOT NULL, limit_file_count INT DEFAULT 100, limit_days INT DEFAULT 30, is_active BOOLEAN DEFAULT FALSE, upd_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); `); // 4. tb_banner_notice ํ…Œ์ด๋ธ” ์ƒ์„ฑ console.log("Creating ver4.tb_banner_notice table..."); await client.query(` CREATE TABLE IF NOT EXISTS ver4.tb_banner_notice ( banner_id SERIAL PRIMARY KEY, project_id VARCHAR(50) REFERENCES ver4.tb_project(project_id), reg_date DATE DEFAULT CURRENT_DATE, start_date DATE NOT NULL, end_date DATE NOT NULL, notice_text TEXT NOT NULL, status_code VARCHAR(61) REFERENCES ver4.code_detail(base_code) ); `); // 5. tb_auto_clean_log ํ…Œ์ด๋ธ” ์ƒ์„ฑ console.log("Creating ver4.tb_auto_clean_log table..."); await client.query(` CREATE TABLE IF NOT EXISTS ver4.tb_auto_clean_log ( log_id SERIAL PRIMARY KEY, clean_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, project_id VARCHAR(50) DEFAULT 'SYSTEM', clean_path TEXT NOT NULL, criteria_info VARCHAR(100), result_status VARCHAR(20) NOT NULL ); `); console.log("Tables created successfully. Now Seeding data..."); // 6. code_master ๊ธฐ์ดˆ ๋ฐ์ดํ„ฐ Seeding const masterSeeds = [ { main_code: 'PROJECT_CATEGORY', main_code_nm: 'ํ”„๋กœ์ ํŠธ ๊ตฌ๋ถ„', use_yn: 'Y', rmk: 'ํ˜„์žฅ ๊ตฌ๋ถ„ ๋Œ€๋ถ„๋ฅ˜ ์ฝ”๋“œ' }, { main_code: 'USER_GROUP', main_code_nm: '์‚ฌ์šฉ์ž ๊ถŒํ•œ๊ทธ๋ฃน', use_yn: 'Y', rmk: '์–ด๋“œ๋ฏผ ๋ฐ ์œ ์ € ๊ถŒํ•œ๊ทธ๋ฃน ๋Œ€๋ถ„๋ฅ˜' }, { main_code: 'NOTICE_STATUS', main_code_nm: '๋ฐฐ๋„ˆ ์†ก์ถœ์ƒํƒœ', use_yn: 'Y', rmk: '์‹ค์‹œ๊ฐ„ ๋ฐฐ๋„ˆ ์†ก์ถœ ์ƒํƒœ ๋Œ€๋ถ„๋ฅ˜' } ]; for (const seed of masterSeeds) { await client.query(` INSERT INTO ver4.code_master (main_code, main_code_nm, use_yn, rmk) VALUES ($1, $2, $3, $4) ON CONFLICT (main_code) DO UPDATE SET main_code_nm = EXCLUDED.main_code_nm, use_yn = EXCLUDED.use_yn, rmk = EXCLUDED.rmk; `, [seed.main_code, seed.main_code_nm, seed.use_yn, seed.rmk]); } // 7. code_detail ๊ธฐ์ดˆ ๋ฐ์ดํ„ฐ Seeding const detailSeeds = [ // ํ”„๋กœ์ ํŠธ ์นดํ…Œ๊ณ ๋ฆฌ { main_code: 'PROJECT_CATEGORY', sub_code: 'tdc', base_code: 'PROJECT_CATEGORY_tdc', code_nm: 'TDC', sort_ord: 1 }, { main_code: 'PROJECT_CATEGORY', sub_code: 'gpd', base_code: 'PROJECT_CATEGORY_gpd', code_nm: 'GPD', sort_ord: 2 }, { main_code: 'PROJECT_CATEGORY', sub_code: 'bimproject', base_code: 'PROJECT_CATEGORY_bimproject', code_nm: 'BIMํ”„๋กœ์ ํŠธ', sort_ord: 3 }, { main_code: 'PROJECT_CATEGORY', sub_code: 'overseas', base_code: 'PROJECT_CATEGORY_overseas', code_nm: 'ํ•ด์™ธํ˜„์žฅ', sort_ord: 4 }, // ์‚ฌ์šฉ์ž ๊ทธ๋ฃน { main_code: 'USER_GROUP', sub_code: 'super', base_code: 'USER_GROUP_super', code_nm: '์ˆ˜ํผ๊ด€๋ฆฌ์ž', sort_ord: 1 }, { main_code: 'USER_GROUP', sub_code: 'dev', base_code: 'USER_GROUP_dev', code_nm: '๊ฐœ๋ฐœ์ž', sort_ord: 2 }, { main_code: 'USER_GROUP', sub_code: 'general', base_code: 'USER_GROUP_general', code_nm: '์ผ๋ฐ˜์‚ฌ์šฉ์ž', sort_ord: 3 }, // ๋ฐฐ๋„ˆ ์ƒํƒœ { main_code: 'NOTICE_STATUS', sub_code: 'active', base_code: 'NOTICE_STATUS_active', code_nm: '์†ก์ถœ์ค‘', sort_ord: 1 }, { main_code: 'NOTICE_STATUS', sub_code: 'scheduled', base_code: 'NOTICE_STATUS_scheduled', code_nm: '์˜ˆ์•ฝ๋จ', sort_ord: 2 }, { main_code: 'NOTICE_STATUS', sub_code: 'expired', base_code: 'NOTICE_STATUS_expired', code_nm: '๋งŒ๋ฃŒ', sort_ord: 3 } ]; for (const seed of detailSeeds) { await client.query(` INSERT INTO ver4.code_detail (main_code, sub_code, base_code, code_nm, sort_ord) VALUES ($1, $2, $3, $4, $5) ON CONFLICT (main_code, sub_code) DO UPDATE SET base_code = EXCLUDED.base_code, code_nm = EXCLUDED.code_nm, sort_ord = EXCLUDED.sort_ord; `, [seed.main_code, seed.sub_code, seed.base_code, seed.code_nm, seed.sort_ord]); } // 8. tb_system_policy ๊ธ€๋กœ๋ฒŒ ๊ณตํ†ต ์ž๋™ ์‚ญ์ œ ์ •์ฑ… 1๊ฑด Seeding await client.query(` INSERT INTO ver4.tb_system_policy (policy_key, limit_file_count, limit_days, is_active) VALUES ('GLOBAL_DELETE_POLICY', 100, 30, FALSE) ON CONFLICT (policy_key) DO NOTHING; `); console.log("๐ŸŽ‰ Seeding completed successfully!"); } catch (err) { console.error("โŒ DB Patch Error:", err); } finally { client.release(); await pool.end(); } } runPatch();