Files
smanab/Sistem-Pelanggaran-Siswa/routes/violation-rules.js

133 lines
4.7 KiB
JavaScript

import express from 'express';
import pool from '../database.js';
const router = express.Router();
// GET all violation rules
router.get('/', async (req, res) => {
try {
const [rows] = await pool.execute(`
SELECT id, code, description, category, score, default_sanction
FROM violation_rules
ORDER BY category, score DESC
`);
res.json(rows);
} catch (error) {
console.error('Error fetching violation rules:', error);
res.status(500).json({ error: 'Failed to fetch violation rules' });
}
});
// POST create new violation rule
router.post('/', async (req, res) => {
try {
const { code, description, category, score, defaultSanction } = req.body;
// Check if code already exists
const [existing] = await pool.execute(
'SELECT id FROM violation_rules WHERE code = ?', [code]
);
if (existing.length > 0) {
return res.status(400).json({
status: 'error',
error: `Kode "${code}" sudah digunakan`
});
}
const [result] = await pool.execute(`
INSERT INTO violation_rules (code, description, category, score, default_sanction)
VALUES (?, ?, ?, ?, ?)
`, [code, description, category, score, defaultSanction || null]);
res.json({
status: 'success',
id: result.insertId,
message: 'Jenis pelanggaran berhasil ditambahkan'
});
} catch (error) {
console.error('Error creating violation rule:', error);
res.status(500).json({ status: 'error', error: 'Failed to create violation rule' });
}
});
// PUT update violation rule
router.put('/:id', async (req, res) => {
try {
const { code, description, category, score, defaultSanction } = req.body;
const { id } = req.params;
// Check if code already exists for other rules
const [existing] = await pool.execute(
'SELECT id FROM violation_rules WHERE code = ? AND id != ?', [code, id]
);
if (existing.length > 0) {
return res.status(400).json({
status: 'error',
error: `Kode "${code}" sudah digunakan`
});
}
await pool.execute(`
UPDATE violation_rules
SET code = ?, description = ?, category = ?, score = ?, default_sanction = ?
WHERE id = ?
`, [code, description, category, score, defaultSanction || null, id]);
res.json({ status: 'success', message: 'Jenis pelanggaran berhasil diperbarui' });
} catch (error) {
console.error('Error updating violation rule:', error);
res.status(500).json({ status: 'error', error: 'Failed to update violation rule' });
}
});
// DELETE violation rule
router.delete('/:id', async (req, res) => {
try {
await pool.execute('DELETE FROM violation_rules WHERE id = ?', [req.params.id]);
res.json({ status: 'success', message: 'Jenis pelanggaran berhasil dihapus' });
} catch (error) {
console.error('Error deleting violation rule:', error);
res.status(500).json({ status: 'error', error: 'Failed to delete violation rule' });
}
});
// POST import bulk violation rules
router.post('/import', async (req, res) => {
try {
const { rules } = req.body;
let success = 0;
let failed = 0;
const errors = [];
for (const rule of rules) {
try {
const { code, description, category, score, defaultSanction } = rule;
// Insert or update if code exists
await pool.execute(`
INSERT INTO violation_rules (code, description, category, score, default_sanction)
VALUES (?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
description = VALUES(description),
category = VALUES(category),
score = VALUES(score),
default_sanction = VALUES(default_sanction)
`, [code, description, category, score, defaultSanction || null]);
success++;
} catch (e) {
failed++;
errors.push(`${rule.code}: ${e.message}`);
}
}
res.json({ status: 'success', success, failed, errors });
} catch (error) {
console.error('Error importing violation rules:', error);
res.status(500).json({ status: 'error', error: 'Failed to import violation rules' });
}
});
export default router;