88 lines
3.9 KiB
JavaScript
Executable File
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;
|