✨ Компактные hero секции и улучшенная инициализация БД
🎨 UI улучшения: - Уменьшена высота синих панелей с 100vh до 70vh на главной - Добавлен класс .compact (25vh) для всех остальных страниц - Улучшена адаптивность для мобильных устройств - Обновлены все шаблоны с hero секциями 🚀 Инфраструктура: - Автоматическая инициализация базы данных при деплое - Улучшены мокапные данные (больше отзывов, бронирований, сообщений) - Добавлены настройки сайта в базу данных - Создан скрипт автоматического деплоя deploy.sh 📦 Система сборки: - Обновлен .gitignore с полным покрытием файлов - Добавлена папка для загрузок с .gitkeep - Улучшен README с инструкциями по запуску - ES модули для инициализации базы данных 🐛 Исправления: - Совместимость с ES модулями в Node.js - Правильная обработка ошибок инициализации БД - Корректные SQL запросы для PostgreSQL
This commit is contained in:
77
database/init-database.js
Normal file
77
database/init-database.js
Normal file
@@ -0,0 +1,77 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
import { dirname } from 'path';
|
||||
import db from '../src/config/database.js';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
|
||||
export async function initDatabase() {
|
||||
try {
|
||||
console.log('🚀 Starting complete database initialization...');
|
||||
|
||||
// Check if database is connected
|
||||
await db.query('SELECT 1');
|
||||
console.log('✅ Database connection successful');
|
||||
|
||||
// 1. Create schema
|
||||
console.log('📋 Creating database schema...');
|
||||
const schemaPath = path.join(__dirname, 'schema.sql');
|
||||
const schema = fs.readFileSync(schemaPath, 'utf8');
|
||||
await db.query(schema);
|
||||
console.log('✅ Database schema created successfully');
|
||||
|
||||
// 2. Check if tables are empty (first run)
|
||||
const checkResult = await db.query('SELECT COUNT(*) FROM admins');
|
||||
const isEmpty = parseInt(checkResult.rows[0].count) === 0;
|
||||
|
||||
if (isEmpty) {
|
||||
console.log('📝 Database is empty, inserting mock data...');
|
||||
|
||||
// Insert mock data
|
||||
const mockDataPath = path.join(__dirname, 'mock-data.sql');
|
||||
const mockData = fs.readFileSync(mockDataPath, 'utf8');
|
||||
await db.query(mockData);
|
||||
console.log('✅ Mock data inserted successfully');
|
||||
} else {
|
||||
console.log('ℹ️ Database already contains data, skipping mock data insertion');
|
||||
}
|
||||
|
||||
// 3. Run any pending migrations
|
||||
console.log('🔄 Checking for pending migrations...');
|
||||
|
||||
// Check if rating system exists
|
||||
try {
|
||||
await db.query('SELECT 1 FROM route_ratings LIMIT 1');
|
||||
console.log('ℹ️ Rating system already exists');
|
||||
} catch (error) {
|
||||
console.log('📈 Installing rating system...');
|
||||
const ratingMigrationPath = path.join(__dirname, 'rating-system-migration.sql');
|
||||
if (fs.existsSync(ratingMigrationPath)) {
|
||||
const ratingMigration = fs.readFileSync(ratingMigrationPath, 'utf8');
|
||||
await db.query(ratingMigration);
|
||||
console.log('✅ Rating system installed successfully');
|
||||
}
|
||||
}
|
||||
|
||||
console.log('✨ Database initialization completed successfully!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ Database initialization failed:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// Run if called directly
|
||||
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
||||
initDatabase()
|
||||
.then(() => {
|
||||
console.log('🎉 All done!');
|
||||
process.exit(0);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('💥 Initialization failed:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user