Files
claboral.linkedcorp.net/backend/src/services/tenantProvision.js
T
2026-03-03 11:54:00 -05:00

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 };