Initial commit apps directory with .gitignore
This commit is contained in:
132
Sistem-Pelanggaran-Siswa/routes/violation-rules.js
Normal file
132
Sistem-Pelanggaran-Siswa/routes/violation-rules.js
Normal file
@@ -0,0 +1,132 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user