From b74772f71de500942f387ce87d0c7aa81da483d9 Mon Sep 17 00:00:00 2001 From: Alexander Borg Date: Sat, 20 Sep 2025 23:11:57 +0200 Subject: [PATCH] Fix jwt-token --- server/docker-entrypoint.sh | 2 ++ server/index.js | 32 +++++++++++---------- server/scripts/setup-database.js | 48 +++++++++++++++++++++++++------- 3 files changed, 58 insertions(+), 24 deletions(-) diff --git a/server/docker-entrypoint.sh b/server/docker-entrypoint.sh index 293d8f1..a68a29a 100644 --- a/server/docker-entrypoint.sh +++ b/server/docker-entrypoint.sh @@ -43,6 +43,8 @@ fi # Check if setup/migrations were successful if [ $? -eq 0 ]; then echo "Database initialization completed successfully" + # Set flag to indicate database is already initialized + export DB_INITIALIZED=true else echo "Database initialization failed" exit 1 diff --git a/server/index.js b/server/index.js index 05b1100..e830017 100644 --- a/server/index.js +++ b/server/index.js @@ -169,20 +169,24 @@ async function startServer() { console.log('Database force synchronized.'); } - // STEP 2: Run migrations after tables exist - try { - await runMigrations(); - } catch (migrationError) { - console.error('Migration error:', migrationError); - throw migrationError; // Fatal error - don't continue - } - - // STEP 3: Seed database with initial data - try { - await seedDatabase(); - } catch (seedError) { - console.error('Seeding error:', seedError); - throw seedError; // Fatal error - don't continue + // STEP 2: Run migrations after tables exist (skip if DB_INITIALIZED is set) + if (!process.env.DB_INITIALIZED) { + try { + await runMigrations(); + } catch (migrationError) { + console.error('Migration error:', migrationError); + throw migrationError; // Fatal error - don't continue + } + + // STEP 3: Seed database with initial data + try { + await seedDatabase(); + } catch (seedError) { + console.error('Seeding error:', seedError); + throw seedError; // Fatal error - don't continue + } + } else { + console.log('â„šī¸ Database already initialized by setup script, skipping migrations and seeding'); } server.listen(PORT, () => { diff --git a/server/scripts/setup-database.js b/server/scripts/setup-database.js index 301901a..a7b3bd8 100644 --- a/server/scripts/setup-database.js +++ b/server/scripts/setup-database.js @@ -39,13 +39,32 @@ const setupDatabase = async () => { // Create sample data console.log('📊 Creating sample data...\n'); + // Create default tenant + console.log('đŸĸ Creating default tenant...'); + const defaultTenant = await Tenant.create({ + name: 'Default Organization', + slug: 'default', + subscription_type: 'enterprise', + is_active: true, + auth_provider: 'local', + features: { + max_devices: -1, + max_users: -1, + api_rate_limit: 50000, + data_retention_days: -1, + features: ['all'] + } + }); + console.log(`✅ Default tenant created: ${defaultTenant.name}`); + // Create admin user console.log('👤 Creating admin user...'); const adminUser = await User.create({ username: 'admin', email: 'admin@example.com', password_hash: await bcrypt.hash('admin123', 10), - role: 'admin' + role: 'admin', + tenant_id: defaultTenant.id }); console.log(`✅ Admin user created: ${adminUser.username}`); @@ -55,7 +74,8 @@ const setupDatabase = async () => { username: 'operator', email: 'operator@example.com', password_hash: await bcrypt.hash('operator123', 10), - role: 'operator' + role: 'operator', + tenant_id: defaultTenant.id }); console.log(`✅ Operator user created: ${operatorUser.username}`); @@ -69,7 +89,8 @@ const setupDatabase = async () => { geo_lat: 59.3293, geo_lon: 18.0686, status: 'online', - last_seen: new Date() + last_seen: new Date(), + tenant_id: defaultTenant.id }, { device_id: 1941875382, @@ -78,7 +99,8 @@ const setupDatabase = async () => { geo_lat: 57.7089, geo_lon: 11.9746, status: 'online', - last_seen: new Date() + last_seen: new Date(), + tenant_id: defaultTenant.id }, { device_id: 1941875383, @@ -87,7 +109,8 @@ const setupDatabase = async () => { geo_lat: 55.6050, geo_lon: 13.0038, status: 'offline', - last_seen: new Date(Date.now() - 2 * 60 * 60 * 1000) // 2 hours ago + last_seen: new Date(Date.now() - 2 * 60 * 60 * 1000), // 2 hours ago + tenant_id: defaultTenant.id } ]); console.log(`✅ Created ${devices.length} sample devices`); @@ -123,7 +146,8 @@ const setupDatabase = async () => { timestamp: new Date(), threat_level: 'high', estimated_distance: 150, - requires_action: true + requires_action: true, + tenant_id: defaultTenant.id }, { device_id: 1941875382, @@ -137,7 +161,8 @@ const setupDatabase = async () => { timestamp: new Date(Date.now() - 60 * 60 * 1000), threat_level: 'medium', estimated_distance: 800, - requires_action: false + requires_action: false, + tenant_id: defaultTenant.id }, { device_id: 1941875381, @@ -151,7 +176,8 @@ const setupDatabase = async () => { timestamp: new Date(Date.now() - 2 * 60 * 60 * 1000), threat_level: 'low', estimated_distance: 2500, - requires_action: false + requires_action: false, + tenant_id: defaultTenant.id } ]); console.log(`✅ Created ${detections.length} sample drone detections`); @@ -177,7 +203,8 @@ const setupDatabase = async () => { channels: ['sms', 'email'] }, cooldown_minutes: 2, - is_active: true + is_active: true, + tenant_id: defaultTenant.id }, { user_id: operatorUser.id, @@ -196,7 +223,8 @@ const setupDatabase = async () => { channels: ['sms'] }, cooldown_minutes: 10, - is_active: true + is_active: true, + tenant_id: defaultTenant.id }, { user_id: adminUser.id,