Files
dashboard/backend/routes/kandangs.js
T
Alberto-Audrix 32a36cceff
CI / lint-and-test (push) Canceled after 0s
first commit
2026-07-28 08:55:05 +07:00

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;