Initial commit
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
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 };
|
||||
Reference in New Issue
Block a user