const sequelize = require("../config/database"); const Inbox = require("../models/Inbox"); const Sent = require("../models/Sent"); const Trash = require("../models/Trash"); const Spam = require("../models/Spam"); const Draft = require("../models/Draft"); const Important = require("../models/Important"); const User = require("../models/User"); const SystemConfig = require("../models/SystemConfig"); const SmtpLog = require("../models/SmtpLog"); const SentLog = require("../models/SentLog"); const GeminiModel = require("../models/GeminiModel"); const EmailTranslation = require("../models/EmailTranslation"); const mysql = require("mysql2/promise"); async function initializeDatabase() { // 1. DB가 없으면 생성 (raw connection 사용) try { const connection = await mysql.createConnection({ host: process.env.DB_HOST || "mariadb", user: process.env.DB_USER || "root", password: process.env.DB_PASSWORD || "password", }); const dbName = process.env.DB_NAME || "mail"; await connection.query(`CREATE DATABASE IF NOT EXISTS \`${dbName}\`;`); await connection.end(); console.log(`${dbName} 데이터베이스 확인/생성됨.`); } catch (error) { console.error("데이터베이스 생성 오류:", error); // 에러를 던지지 않고 sequelize 연결 시도 (DB 생성 권한 없을 경우 대비) } // 2. 모델 동기화 try { await sequelize.authenticate(); console.log("데이터베이스 연결 성공."); // 테이블이 없을 때만 생성 (기존 테이블은 변경하지 않음) // alter: true는 인덱스 중복 생성 문제를 일으킬 수 있으므로 사용하지 않음 await sequelize.sync({ force: false }); // 관리자 계정 시드 const adminExists = await User.findOne({ where: { isAdmin: true } }); if (!adminExists) { const bcrypt = require("bcryptjs"); const hashedPrice = await bcrypt.hash("admin123", 10); await User.create({ email: "admin@caadiq.co.kr", password: hashedPrice, name: "Administrator", isAdmin: true, }); console.log("관리자 계정 생성됨: admin@caadiq.co.kr / admin123"); } // Gemini 모델 시드 await GeminiModel.seedDefaultModels(); console.log("데이터베이스 동기화 완료."); } catch (error) { console.error("데이터베이스 연결 실패:", error); process.exit(1); } } module.exports = initializeDatabase;