Files
corp-address-book/backend/db.js
T
2026-05-25 09:45:08 +00:00

247 lines
7.6 KiB
JavaScript

const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const fs = require('fs');
const dbPath = process.env.DATABASE_PATH || path.join(__dirname, 'database.db');
// Ensure database directory exists
const dbDir = path.dirname(dbPath);
if (!fs.existsSync(dbDir)) {
fs.mkdirSync(dbDir, { recursive: true });
}
// Database schema is initialized safely using CREATE TABLE IF NOT EXISTS below.
const db = new sqlite3.Database(dbPath, (err) => {
if (err) {
console.error('Error opening database:', err.message);
} else {
console.log('Connected to SQLite database at:', dbPath);
initializeTables();
}
});
function run(sql, params = []) {
return new Promise((resolve, reject) => {
db.run(sql, params, function (err) {
if (err) reject(err);
else resolve({ id: this.lastID, changes: this.changes });
});
});
}
function get(sql, params = []) {
return new Promise((resolve, reject) => {
db.get(sql, params, (err, row) => {
if (err) reject(err);
else resolve(row);
});
});
}
function all(sql, params = []) {
return new Promise((resolve, reject) => {
db.all(sql, params, (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
}
async function initializeTables() {
try {
// 1. Create Departments Table
await run(`
CREATE TABLE IF NOT EXISTS departments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL
)
`);
// 2. Create Companies Table (New dictionary table)
await run(`
CREATE TABLE IF NOT EXISTS companies (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL
)
`);
// 3. Create Employees Table (Updated Schema with foreign keys)
await run(`
CREATE TABLE IF NOT EXISTS employees (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
company_id INTEGER,
job_title TEXT NOT NULL,
department_id INTEGER,
phone TEXT,
email TEXT,
building TEXT,
floor TEXT,
FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE SET NULL,
FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE SET NULL
)
`);
// Seed data if database is fresh
const deptCount = await get('SELECT COUNT(*) as count FROM departments');
if (deptCount.count === 0) {
console.log('Seeding initial departments, companies, and employees...');
await seedData();
}
} catch (error) {
console.error('Error initializing tables:', error);
}
}
async function seedData() {
// Seed Departments
const depts = [
'Руководство',
'Производственно-технический отдел',
'Бухгалтерия',
'Отдел кадров',
'Информационные технологии',
'Монтажный участок',
'Цех металлоконструкций',
'Служба безопасности'
];
const deptIds = {};
for (const dept of depts) {
const res = await run('INSERT INTO departments (name) VALUES (?)', [dept]);
deptIds[dept] = res.id;
}
// Seed Companies (Melto Raboty)
const companiesList = [
'АО КМУ Гидромонтаж',
'ООО Гидромонтаж-Услуги',
'ООО Спецтранс'
];
const companyIds = {};
for (const comp of companiesList) {
const res = await run('INSERT INTO companies (name) VALUES (?)', [comp]);
companyIds[comp] = res.id;
}
// Seed Employees
const employees = [
{
name: 'Иванов Александр Сергеевич',
company: 'АО КМУ Гидромонтаж',
job_title: 'Генеральный директор',
department: 'Руководство',
phone: '+7 (391) 234-56-78',
email: 'a.ivanov@gidrom24.ru',
building: 'Административный корпус',
floor: '3'
},
{
name: 'Петров Дмитрий Васильевич',
company: 'АО КМУ Гидромонтаж',
job_title: 'Руководитель IT-отдела',
department: 'Информационные технологии',
phone: '+7 (391) 234-56-79',
email: 'd.petrov@gidrom24.ru',
building: 'Административный корпус',
floor: '2'
},
{
name: 'Сидоров Алексей Михайлович',
company: 'АО КМУ Гидромонтаж',
job_title: 'Системный администратор',
department: 'Информационные технологии',
phone: '+7 (923) 456-78-90',
email: 'sysadmin@gidrom24.ru',
building: 'Административный корпус',
floor: '2'
},
{
name: 'Смирнова Елена Николаевна',
company: 'ООО Гидромонтаж-Услуги',
job_title: 'Главный бухгалтер',
department: 'Бухгалтерия',
phone: '+7 (391) 234-56-80',
email: 'e.smirnova@gidrom24.ru',
building: 'Административный корпус',
floor: '3'
},
{
name: 'Кузнецов Сергей Петрович',
company: 'АО КМУ Гидромонтаж',
job_title: 'Начальник ПТО',
department: 'Производственно-технический отдел',
phone: '+7 (391) 234-56-81',
email: 's.kuznetsov@gidrom24.ru',
building: 'Производственный корпус №1',
floor: '2'
},
{
name: 'Козлова Мария Игоревна',
company: 'АО КМУ Гидромонтаж',
job_title: 'Начальник отдела кадров',
department: 'Отдел кадров',
phone: '+7 (391) 234-56-82',
email: 'm.kozlova@gidrom24.ru',
building: 'Административный корпус',
floor: '3'
},
{
name: 'Морозов Артем Александрович',
company: 'ООО Спецтранс',
job_title: 'Начальник цеха металлоконструкций',
department: 'Цех металлоконструкций',
phone: '+7 (913) 765-43-21',
email: 'a.morozov@gidrom24.ru',
building: 'Производственный корпус №1',
floor: '1'
},
{
name: 'Васильев Игорь Олегович',
company: 'ООО Гидромонтаж-Услуги',
job_title: 'Бригадир монтажников',
department: 'Монтажный участок',
phone: '+7 (902) 123-45-67',
email: 'i.vasiliev@gidrom24.ru',
building: 'Складской терминал',
floor: '1'
},
{
name: 'Федоров Роман Геннадьевич',
company: 'ООО Спецтранс',
job_title: 'Начальник службы безопасности',
department: 'Служба безопасности',
phone: '+7 (391) 234-56-99',
email: 'security@gidrom24.ru',
building: 'Административный корпус',
floor: '1'
}
];
for (const emp of employees) {
await run(`
INSERT INTO employees (name, company_id, job_title, department_id, phone, email, building, floor)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
`, [
emp.name,
companyIds[emp.company],
emp.job_title,
deptIds[emp.department],
emp.phone,
emp.email,
emp.building,
emp.floor
]);
}
console.log('Database initialized and seeded successfully.');
}
module.exports = {
db,
run,
get,
all
};