97 lines
3.0 KiB
JavaScript
97 lines
3.0 KiB
JavaScript
import express from 'express';
|
|
import db from '../config/database.js';
|
|
import { authenticateToken, authorize } from '../middleware/auth.js';
|
|
|
|
const router = express.Router();
|
|
|
|
// Get all departments
|
|
router.get('/', authenticateToken, async (req, res) => {
|
|
try {
|
|
const [departments] = await db.query('SELECT * FROM departments ORDER BY name');
|
|
res.json(departments);
|
|
} catch (error) {
|
|
console.error('Get departments error:', error);
|
|
res.status(500).json({ error: 'Internal server error' });
|
|
}
|
|
});
|
|
|
|
// Get department by ID
|
|
router.get('/:id', authenticateToken, async (req, res) => {
|
|
try {
|
|
const [departments] = await db.query('SELECT * FROM departments WHERE id = ?', [req.params.id]);
|
|
|
|
if (departments.length === 0) {
|
|
return res.status(404).json({ error: 'Department not found' });
|
|
}
|
|
|
|
res.json(departments[0]);
|
|
} catch (error) {
|
|
console.error('Get department error:', error);
|
|
res.status(500).json({ error: 'Internal server error' });
|
|
}
|
|
});
|
|
|
|
// Get sub-departments by department ID
|
|
router.get('/:id/sub-departments', authenticateToken, async (req, res) => {
|
|
try {
|
|
const [subDepartments] = await db.query(
|
|
'SELECT * FROM sub_departments WHERE department_id = ? ORDER BY name',
|
|
[req.params.id]
|
|
);
|
|
res.json(subDepartments);
|
|
} catch (error) {
|
|
console.error('Get sub-departments error:', error);
|
|
res.status(500).json({ error: 'Internal server error' });
|
|
}
|
|
});
|
|
|
|
// Create department (SuperAdmin only)
|
|
router.post('/', authenticateToken, authorize('SuperAdmin'), async (req, res) => {
|
|
try {
|
|
const { name } = req.body;
|
|
|
|
if (!name) {
|
|
return res.status(400).json({ error: 'Department name required' });
|
|
}
|
|
|
|
const [result] = await db.query('INSERT INTO departments (name) VALUES (?)', [name]);
|
|
const [newDepartment] = await db.query('SELECT * FROM departments WHERE id = ?', [result.insertId]);
|
|
|
|
res.status(201).json(newDepartment[0]);
|
|
} catch (error) {
|
|
if (error.code === 'ER_DUP_ENTRY') {
|
|
return res.status(400).json({ error: 'Department already exists' });
|
|
}
|
|
console.error('Create department error:', error);
|
|
res.status(500).json({ error: 'Internal server error' });
|
|
}
|
|
});
|
|
|
|
// Create sub-department (SuperAdmin only)
|
|
router.post('/:id/sub-departments', authenticateToken, authorize('SuperAdmin'), async (req, res) => {
|
|
try {
|
|
const { name, primaryActivity } = req.body;
|
|
|
|
if (!name || !primaryActivity) {
|
|
return res.status(400).json({ error: 'Name and primary activity required' });
|
|
}
|
|
|
|
const [result] = await db.query(
|
|
'INSERT INTO sub_departments (department_id, name, primary_activity) VALUES (?, ?, ?)',
|
|
[req.params.id, name, primaryActivity]
|
|
);
|
|
|
|
const [newSubDepartment] = await db.query(
|
|
'SELECT * FROM sub_departments WHERE id = ?',
|
|
[result.insertId]
|
|
);
|
|
|
|
res.status(201).json(newSubDepartment[0]);
|
|
} catch (error) {
|
|
console.error('Create sub-department error:', error);
|
|
res.status(500).json({ error: 'Internal server error' });
|
|
}
|
|
});
|
|
|
|
export default router;
|