150 lines
5.9 KiB
JavaScript
150 lines
5.9 KiB
JavaScript
/**
|
|
* Script untuk TEST koneksi Firebase dan verify data penjadwalan
|
|
* Usage: node test-firebase-connection.js
|
|
*
|
|
* Script ini akan:
|
|
* 1. Connect ke Firebase
|
|
* 2. Baca data /kontrol/
|
|
* 3. Display struktur data dan format
|
|
* 4. Verify apakah data penjadwalan ada
|
|
*/
|
|
|
|
require('dotenv').config();
|
|
const admin = require('firebase-admin');
|
|
|
|
console.log('🔍 Testing Firebase Connection & Data Structure...\n');
|
|
|
|
// Initialize Firebase
|
|
try {
|
|
admin.initializeApp({
|
|
credential: admin.credential.cert({
|
|
projectId: process.env.FIREBASE_PROJECT_ID,
|
|
clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
|
|
privateKey: process.env.FIREBASE_PRIVATE_KEY?.replace(/\\n/g, '\n'),
|
|
}),
|
|
databaseURL: process.env.FIREBASE_DATABASE_URL,
|
|
});
|
|
console.log('✅ Firebase initialized\n');
|
|
} catch (error) {
|
|
console.error('❌ Firebase initialization failed:', error.message);
|
|
process.exit(1);
|
|
}
|
|
|
|
const db = admin.database();
|
|
|
|
async function testConnection() {
|
|
try {
|
|
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
console.log('📊 READING /kontrol/ FROM FIREBASE');
|
|
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
|
|
|
const snapshot = await db.ref('kontrol').once('value');
|
|
const kontrolData = snapshot.val();
|
|
|
|
if (!kontrolData) {
|
|
console.log('❌ NO DATA FOUND at /kontrol/\n');
|
|
console.log('💡 Kemungkinan masalah:');
|
|
console.log(' 1. Data belum di-set dari Flutter app');
|
|
console.log(' 2. Firebase credentials salah');
|
|
console.log(' 3. Database URL salah\n');
|
|
return;
|
|
}
|
|
|
|
console.log('✅ DATA FOUND! Structure:\n');
|
|
console.log(JSON.stringify(kontrolData, null, 2));
|
|
console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
console.log('🔍 VALIDATING WAKTU MODE DATA');
|
|
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
|
|
|
// Validate Waktu Mode
|
|
const checks = {
|
|
'waktu (mode enabled)': kontrolData.waktu,
|
|
'waktu_1 (jadwal 1)': kontrolData.waktu_1,
|
|
'waktu_2 (jadwal 2)': kontrolData.waktu_2,
|
|
'durasi_1 (detik)': kontrolData.durasi_1,
|
|
'durasi_2 (detik)': kontrolData.durasi_2,
|
|
};
|
|
|
|
let allValid = true;
|
|
for (const [key, value] of Object.entries(checks)) {
|
|
const exists = value !== undefined && value !== null;
|
|
const icon = exists ? '✅' : '❌';
|
|
console.log(`${icon} ${key.padEnd(25)} = ${value ?? 'NOT SET'}`);
|
|
if (!exists) allValid = false;
|
|
}
|
|
|
|
console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
console.log('⏰ CURRENT TIME vs SCHEDULE');
|
|
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
|
|
|
const now = new Date();
|
|
const currentTime = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`;
|
|
|
|
console.log(`🕐 Current time: ${currentTime}`);
|
|
console.log(`📅 Jadwal 1: ${kontrolData.waktu_1 || 'NOT SET'}`);
|
|
console.log(`📅 Jadwal 2: ${kontrolData.waktu_2 || 'NOT SET'}`);
|
|
|
|
if (kontrolData.waktu_1 === currentTime) {
|
|
console.log('\n🔥 JADWAL 1 SHOULD TRIGGER NOW!');
|
|
} else if (kontrolData.waktu_2 === currentTime) {
|
|
console.log('\n🔥 JADWAL 2 SHOULD TRIGGER NOW!');
|
|
} else {
|
|
console.log('\n⏳ No schedule at current time');
|
|
}
|
|
|
|
console.log('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
console.log('🎯 DIAGNOSIS RESULT');
|
|
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
|
|
|
if (allValid && kontrolData.waktu === true) {
|
|
console.log('✅ DATA STRUCTURE VALID');
|
|
console.log('✅ WAKTU MODE ENABLED');
|
|
console.log('\n💡 If Railway logs still empty, check:');
|
|
console.log(' 1. Railway root directory = "railway-worker"');
|
|
console.log(' 2. Environment variables di Railway');
|
|
console.log(' 3. Railway deployment status (Logs tab)');
|
|
console.log(' 4. Redis service is running\n');
|
|
} else {
|
|
console.log('❌ DATA STRUCTURE INCOMPLETE or MODE DISABLED\n');
|
|
|
|
if (!kontrolData.waktu) {
|
|
console.log('⚠️ waktu = false → Mode waktu TIDAK AKTIF');
|
|
console.log(' 💡 Aktifkan dari Flutter app!\n');
|
|
}
|
|
|
|
if (!kontrolData.waktu_1 || !kontrolData.waktu_2) {
|
|
console.log('⚠️ Jadwal belum di-set');
|
|
console.log(' 💡 Set jadwal dari Flutter app!\n');
|
|
}
|
|
}
|
|
|
|
// Check Sensor Mode
|
|
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
console.log('🌡️ SENSOR MODE DATA');
|
|
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
|
|
|
const sensorChecks = {
|
|
'otomatis (mode enabled)': kontrolData.otomatis,
|
|
'batas_bawah': kontrolData.batas_bawah,
|
|
'batas_atas': kontrolData.batas_atas,
|
|
'durasi_sensor': kontrolData.durasi_sensor,
|
|
};
|
|
|
|
for (const [key, value] of Object.entries(sensorChecks)) {
|
|
const exists = value !== undefined && value !== null;
|
|
const icon = exists ? '✅' : '❌';
|
|
console.log(`${icon} ${key.padEnd(25)} = ${value ?? 'NOT SET'}`);
|
|
}
|
|
|
|
console.log('\n✅ Test complete!\n');
|
|
process.exit(0);
|
|
|
|
} catch (error) {
|
|
console.error('\n❌ Error:', error.message);
|
|
console.error(error);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
testConnection();
|