const fs = require('fs'); const path = require('path'); const { getCentralPool } = require('../db/central'); const { hashPassword } = require('../utils/password'); function splitSql(sql) { return sql .split(/;\s*\n/) .map((s) => s.trim()) .filter((s) => s.length); } async function runSqlStatements(pool, sqlText) { const statements = splitSql(sqlText); for (const stmt of statements) { await pool.query(stmt); } } async function provisionTenant({ name, code, dbName, dbHost, dbPort, dbUser, dbPass, adminName, adminEmail, adminPassword, startDate, endDate }) { const central = getCentralPool(); await central.query( 'INSERT INTO companies (name, code, start_date, end_date, db_host, db_port, db_name, db_user, db_pass) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', [name, code, startDate || null, endDate || null, dbHost, dbPort, dbName, dbUser, dbPass] ); await central.query(`CREATE DATABASE IF NOT EXISTS \`${dbName}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`); const mysql = require('mysql2/promise'); const tenantPool = mysql.createPool({ host: dbHost, port: dbPort, user: dbUser, password: dbPass, database: dbName, waitForConnections: true, connectionLimit: 5 }); const schemaSql = fs.readFileSync(path.join(__dirname, '../sql/tenant_schema.sql'), 'utf8'); const seedSql = fs.readFileSync(path.join(__dirname, '../sql/seed_questions.sql'), 'utf8'); await runSqlStatements(tenantPool, schemaSql); await runSqlStatements(tenantPool, seedSql); const passwordHash = await hashPassword(adminPassword); await tenantPool.query( 'INSERT INTO admins (name, email, password_hash, role, status) VALUES (?, ?, ?, "admin", "active")', [adminName, adminEmail, passwordHash] ); await tenantPool.end(); return true; } module.exports = { provisionTenant };