Files
smanab/absensi-siswa/backend/routes/settings.js

88 lines
3.9 KiB
JavaScript
Executable File

// 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;