58 lines
1.8 KiB
JavaScript
58 lines
1.8 KiB
JavaScript
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 };
|