134 lines
4.9 KiB
JavaScript
134 lines
4.9 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const Kandang = require('../models/Kandang');
|
|
|
|
// GET /api/kandangs - List all kandangs
|
|
router.get('/', async (req, res) => {
|
|
try {
|
|
const kandangs = await Kandang.getAll();
|
|
res.json({ success: true, data: kandangs });
|
|
} catch (error) {
|
|
res.status(500).json({ success: false, error: error.message });
|
|
}
|
|
});
|
|
|
|
// GET /api/kandangs/by-cycle/:cycleId - Get kandangs with doc_in_count for a cycle
|
|
router.get('/by-cycle/:cycleId', async (req, res) => {
|
|
try {
|
|
const kandangs = await Kandang.getByCycle(req.params.cycleId);
|
|
res.json({ success: true, data: kandangs });
|
|
} catch (error) {
|
|
console.error('Error fetching kandangs by cycle:', error);
|
|
res.status(500).json({ success: false, error: error.message });
|
|
}
|
|
});
|
|
|
|
// GET /api/kandangs/:id - Get single kandang
|
|
router.get('/:id', async (req, res) => {
|
|
try {
|
|
const id = parseInt(req.params.id, 10);
|
|
if (isNaN(id)) return res.status(400).json({ success: false, error: 'Invalid ID' });
|
|
const kandang = await Kandang.getById(id);
|
|
if (!kandang) return res.status(404).json({ success: false, error: 'Kandang not found' });
|
|
res.json({ success: true, data: kandang });
|
|
} catch (error) {
|
|
res.status(500).json({ success: false, error: error.message });
|
|
}
|
|
});
|
|
|
|
// POST /api/kandangs - Create new kandang
|
|
router.post('/', async (req, res) => {
|
|
try {
|
|
const { name } = req.body;
|
|
if (!name || !name.trim()) {
|
|
return res.status(400).json({ success: false, error: 'Name is required' });
|
|
}
|
|
const kandang = await Kandang.create(name.trim());
|
|
res.status(201).json({ success: true, data: kandang });
|
|
} catch (error) {
|
|
res.status(500).json({ success: false, error: error.message });
|
|
}
|
|
});
|
|
|
|
// PUT /api/kandangs/:id - Rename kandang
|
|
router.put('/:id', async (req, res) => {
|
|
try {
|
|
const id = parseInt(req.params.id, 10);
|
|
if (isNaN(id)) return res.status(400).json({ success: false, error: 'Invalid ID' });
|
|
const { name } = req.body;
|
|
if (!name || !name.trim()) {
|
|
return res.status(400).json({ success: false, error: 'Name is required' });
|
|
}
|
|
const kandang = await Kandang.update(id, name.trim());
|
|
if (!kandang) return res.status(404).json({ success: false, error: 'Kandang not found' });
|
|
res.json({ success: true, data: kandang });
|
|
} catch (error) {
|
|
res.status(500).json({ success: false, error: error.message });
|
|
}
|
|
});
|
|
|
|
// DELETE /api/kandangs/:id - Delete kandang
|
|
router.delete('/:id', async (req, res) => {
|
|
try {
|
|
const id = parseInt(req.params.id, 10);
|
|
if (isNaN(id)) return res.status(400).json({ success: false, error: 'Invalid ID' });
|
|
const deleted = await Kandang.delete(id);
|
|
if (!deleted) return res.status(404).json({ success: false, error: 'Kandang not found' });
|
|
res.json({ success: true, message: 'Kandang deleted successfully' });
|
|
} catch (error) {
|
|
res.status(500).json({ success: false, error: error.message });
|
|
}
|
|
});
|
|
|
|
// PUT /api/kandangs/:id/cycle/:cycleId - Set doc_in_count for kandang + cycle
|
|
router.put('/:id/cycle/:cycleId', async (req, res) => {
|
|
try {
|
|
const id = parseInt(req.params.id, 10);
|
|
if (isNaN(id)) return res.status(400).json({ success: false, error: 'Invalid ID' });
|
|
const { docInCount } = req.body;
|
|
if (docInCount === undefined || docInCount < 0) {
|
|
return res.status(400).json({ success: false, error: 'Valid docInCount is required' });
|
|
}
|
|
await Kandang.setDocInCount(id, req.params.cycleId, docInCount);
|
|
res.json({ success: true, message: 'doc_in_count updated' });
|
|
} catch (error) {
|
|
console.error('Error setting DOC count:', error);
|
|
res.status(500).json({ success: false, error: error.message });
|
|
}
|
|
});
|
|
|
|
// PUT /api/kandangs/:id/cage-uuid - Update cage UUID for a kandang
|
|
router.put('/:id/cage-uuid', async (req, res) => {
|
|
try {
|
|
const id = parseInt(req.params.id, 10);
|
|
if (isNaN(id)) return res.status(400).json({ success: false, error: 'Invalid ID' });
|
|
|
|
const { cageUuid } = req.body;
|
|
|
|
// Validate UUID format if provided (allow null/empty to clear)
|
|
if (cageUuid && cageUuid.trim()) {
|
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
if (!uuidRegex.test(cageUuid.trim())) {
|
|
return res.status(400).json({ success: false, error: 'Invalid UUID format' });
|
|
}
|
|
}
|
|
|
|
const kandang = await Kandang.updateCageUuid(id, cageUuid?.trim() || null);
|
|
if (!kandang) {
|
|
return res.status(404).json({ success: false, error: 'Kandang not found' });
|
|
}
|
|
|
|
res.json({ success: true, data: kandang });
|
|
} catch (error) {
|
|
// Handle unique constraint violation
|
|
if (error.code === '23505') {
|
|
return res
|
|
.status(409)
|
|
.json({ success: false, error: 'Cage UUID already assigned to another kandang' });
|
|
}
|
|
res.status(500).json({ success: false, error: error.message });
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|