// Settings API Routes import express from 'express'; import pool from '../db.js'; const router = express.Router(); // GET /api/settings - Get all settings router.get('/', async (req, res) => { try { const [rows] = await pool.query('SELECT setting_key, setting_value FROM settings'); // Convert to object format const settings = {}; for (const row of rows) { settings[row.setting_key] = row.setting_value; } // Map to frontend AppSettings format const appSettings = { schoolName: settings['NAMA_SEKOLAH'] || 'SMA Negeri 1 Abiansemal', schoolLat: parseFloat(settings['LATITUDE']) || -8.5107893, schoolLng: parseFloat(settings['LONGITUDE']) || 115.2142912, allowedRadiusMeters: parseInt(settings['RADIUS_METER']) || 100, morningStart: settings['JAM_MASUK_PAGI'] || '07:00', morningEnd: settings['JAM_PULANG_PAGI'] || '12:00', afternoonStart: settings['JAM_MASUK_SIANG'] || '12:30', afternoonEnd: settings['JAM_PULANG_SIANG'] || '16:00', allowedDays: settings['HARI_AKTIF'] ? settings['HARI_AKTIF'].split(',').map(d => parseInt(d.trim())) : [1, 2, 3, 4, 5, 6], activeDates: settings['TANGGAL_AKTIF'] ? settings['TANGGAL_AKTIF'].split(',').filter(d => d.trim()) : [], fonnteToken: settings['FONNTE_TOKEN'] || '', availableClasses: settings['DAFTAR_KELAS'] ? settings['DAFTAR_KELAS'].split(',').map(c => c.trim()) : [], semester: settings['SEMESTER'] || 'Ganjil', academicYear: settings['TAHUN_AJARAN'] || '', faceMatchThreshold: parseFloat(settings['AMBANG_WAJAH']) || 0.45, autoRekapAlfaTime: settings['AUTO_REKAP_ALFA_TIME'] || '19:00' }; res.json(appSettings); } catch (error) { console.error('GET /api/settings Error:', error); res.status(500).json({ error: error.message }); } }); // POST /api/settings - Save settings router.post('/', async (req, res) => { try { const settings = req.body; // Map frontend format to database key-value pairs const settingsMap = { 'NAMA_SEKOLAH': settings.schoolName, 'LATITUDE': settings.schoolLat?.toString(), 'LONGITUDE': settings.schoolLng?.toString(), 'RADIUS_METER': settings.allowedRadiusMeters?.toString(), 'JAM_MASUK_PAGI': settings.morningStart, 'JAM_PULANG_PAGI': settings.morningEnd, 'JAM_MASUK_SIANG': settings.afternoonStart, 'JAM_PULANG_SIANG': settings.afternoonEnd, 'HARI_AKTIF': Array.isArray(settings.allowedDays) ? settings.allowedDays.join(',') : settings.allowedDays, 'TANGGAL_AKTIF': Array.isArray(settings.activeDates) ? settings.activeDates.join(',') : settings.activeDates, 'FONNTE_TOKEN': settings.fonnteToken, 'DAFTAR_KELAS': Array.isArray(settings.availableClasses) ? settings.availableClasses.join(',') : settings.availableClasses, 'SEMESTER': settings.semester, 'TAHUN_AJARAN': settings.academicYear, 'AMBANG_WAJAH': settings.faceMatchThreshold?.toString(), 'AUTO_REKAP_ALFA_TIME': settings.autoRekapAlfaTime }; for (const [key, value] of Object.entries(settingsMap)) { if (value !== undefined && value !== null) { await pool.query( `INSERT INTO settings (setting_key, setting_value) VALUES (?, ?) ON DUPLICATE KEY UPDATE setting_value = ?`, [key, value, value] ); } } res.json({ success: true }); } catch (error) { console.error('POST /api/settings Error:', error); res.status(500).json({ error: error.message }); } }); export default router;