/
kalugin66
/
FileBridge
Обзор
Документация
Войти
/
kalugin66
/
FileBridge
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
init.js
265 строк
10 KB
Калугин Олег Александрович
upload files
24 янв 2026, 15:45
Верифицирован
24 янв 2026, 15:45
510c02d
Код
Авторство
О чём код?
const { Client } = require('pg'); const dotenv = require('dotenv'); const crypto = require('crypto'); dotenv.config(); async function initDatabase() { const client = new Client({ host: process.env.DB_HOST, port: process.env.DB_PORT, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: 'postgres' }); try { await client.connect(); // Проверяем существование базы данных const dbExists = await client.query( `SELECT 1 FROM pg_database WHERE datname = $1`, [process.env.DB_NAME] ); if (dbExists.rows.length === 0) { // Создаем базу данных если не существует await client.query(`CREATE DATABASE ${process.env.DB_NAME}`); console.log(`Database ${process.env.DB_NAME} created`); } else { console.log(`Database ${process.env.DB_NAME} already exists`); } await client.end(); // Подключаемся к базе данных const dbClient = new Client({ host: process.env.DB_HOST, port: process.env.DB_PORT, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME }); await dbClient.connect(); // Создаем таблицу пользователей await dbClient.query(` CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, login VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, email VARCHAR(100), is_admin BOOLEAN DEFAULT false, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, last_login TIMESTAMP ) `); // Создаем таблицу файлов БЕЗ индексов await dbClient.query(` CREATE TABLE IF NOT EXISTS files ( id BIGSERIAL PRIMARY KEY, service_name VARCHAR(100) NOT NULL, login VARCHAR(50) NOT NULL, description TEXT, file_number BIGINT UNIQUE NOT NULL, original_filename VARCHAR(255) NOT NULL, extension VARCHAR(20) NOT NULL, file_size BIGINT NOT NULL, upload_date DATE NOT NULL, uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) `); // Создаем таблицу system await dbClient.query(` CREATE TABLE IF NOT EXISTS system ( key VARCHAR(50) PRIMARY KEY, value TEXT NOT NULL ) `); // Создаем индексы отдельно await dbClient.query(` CREATE INDEX IF NOT EXISTS idx_files_login ON files (login) `); await dbClient.query(` CREATE INDEX IF NOT EXISTS idx_files_service ON files (service_name) `); await dbClient.query(` CREATE INDEX IF NOT EXISTS idx_files_date ON files (upload_date) `); await dbClient.query(` CREATE INDEX IF NOT EXISTS idx_files_extension ON files (extension) `); // Добавляем индекс для быстрого поиска по номеру файла await dbClient.query(` CREATE INDEX IF NOT EXISTS idx_files_number ON files (file_number) `); // Создаем начального администратора const bcrypt = require('bcryptjs'); const hashedPassword = await bcrypt.hash(process.env.password || 'admin', 10); await dbClient.query(` INSERT INTO users (login, password, email, is_admin) VALUES ($1, $2, $3, true) ON CONFLICT (login) DO UPDATE SET password = EXCLUDED.password, email = EXCLUDED.email, is_admin = EXCLUDED.is_admin `, [ process.env.login || 'admin', hashedPassword, process.env.mail || 'admin@example.com' ]); console.log('Database tables created successfully'); console.log('Default admin user:'); console.log(` Login: ${process.env.login || 'admin'}`); console.log(` Password: ${process.env.password || 'admin'}`); console.log(` Email: ${process.env.mail || 'admin@example.com'}`); console.log(` Is Admin: true`); // Добавляем начальный токен в system const initialToken = crypto.randomBytes(32).toString('hex'); await dbClient.query(` INSERT INTO system (key, value) VALUES ('token', $1) ON CONFLICT (key) DO UPDATE SET value = $1 `, [initialToken]); console.log(`Initial dynamic token: ${initialToken}`); await dbClient.end(); } catch (err) { if (err.code === '42P04') { // Если база существует, пытаемся пересоздать таблицы console.log(`Database ${process.env.DB_NAME} already exists, recreating tables...`); const dbClient = new Client({ host: process.env.DB_HOST, port: process.env.DB_PORT, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME }); try { await dbClient.connect(); // Удаляем существующие таблицы await dbClient.query('DROP TABLE IF EXISTS files CASCADE'); await dbClient.query('DROP TABLE IF EXISTS users CASCADE'); await dbClient.query('DROP TABLE IF EXISTS system CASCADE'); // Создаем таблицы заново await dbClient.query(` CREATE TABLE users ( id SERIAL PRIMARY KEY, login VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, email VARCHAR(100), is_admin BOOLEAN DEFAULT false, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, last_login TIMESTAMP ) `); await dbClient.query(` CREATE TABLE files ( id BIGSERIAL PRIMARY KEY, service_name VARCHAR(100) NOT NULL, login VARCHAR(50) NOT NULL, description TEXT, file_number BIGINT UNIQUE NOT NULL, original_filename VARCHAR(255) NOT NULL, extension VARCHAR(20) NOT NULL, file_size BIGINT NOT NULL, upload_date DATE NOT NULL, uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) `); await dbClient.query(` CREATE TABLE system ( key VARCHAR(50) PRIMARY KEY, value TEXT NOT NULL ) `); // Создаем индексы await dbClient.query(` CREATE INDEX idx_files_login ON files (login) `); await dbClient.query(` CREATE INDEX idx_files_service ON files (service_name) `); await dbClient.query(` CREATE INDEX idx_files_date ON files (upload_date) `); await dbClient.query(` CREATE INDEX idx_files_extension ON files (extension) `); await dbClient.query(` CREATE INDEX idx_files_number ON files (file_number) `); // Создаем начального администратора const bcrypt = require('bcryptjs'); const hashedPassword = await bcrypt.hash(process.env.password || 'admin', 10); await dbClient.query(` INSERT INTO users (login, password, email, is_admin) VALUES ($1, $2, $3, true) `, [ process.env.login || 'admin', hashedPassword, process.env.mail || 'admin@example.com' ]); // Добавляем начальный токен const initialToken = crypto.randomBytes(32).toString('hex'); await dbClient.query(` INSERT INTO system (key, value) VALUES ('token', $1) `, [initialToken]); console.log('Database tables recreated successfully'); console.log(`Initial dynamic token: ${initialToken}`); await dbClient.end(); } catch (innerErr) { console.error('Error recreating tables:', innerErr); if (dbClient) await dbClient.end(); } } else { console.error('Database initialization error:', err); console.error('Error code:', err.code); console.error('Error message:', err.message); } } } // Запускаем инициализацию if (require.main === module) { initDatabase(); } module.exports = initDatabase;