Add litters API routes
This commit is contained in:
139
server/routes/litters.js
Normal file
139
server/routes/litters.js
Normal file
@@ -0,0 +1,139 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { getDatabase } = require('../db/init');
|
||||
|
||||
// GET all litters
|
||||
router.get('/', (req, res) => {
|
||||
try {
|
||||
const db = getDatabase();
|
||||
const litters = db.prepare(`
|
||||
SELECT l.*,
|
||||
s.name as sire_name, s.registration_number as sire_reg,
|
||||
d.name as dam_name, d.registration_number as dam_reg
|
||||
FROM litters l
|
||||
JOIN dogs s ON l.sire_id = s.id
|
||||
JOIN dogs d ON l.dam_id = d.id
|
||||
ORDER BY l.breeding_date DESC
|
||||
`).all();
|
||||
|
||||
// Get puppies for each litter
|
||||
litters.forEach(litter => {
|
||||
litter.puppies = db.prepare(`
|
||||
SELECT d.* FROM dogs d
|
||||
JOIN parents ps ON d.id = ps.dog_id
|
||||
JOIN parents pd ON d.id = pd.dog_id
|
||||
WHERE ps.parent_id = ? AND pd.parent_id = ?
|
||||
`).all(litter.sire_id, litter.dam_id);
|
||||
|
||||
litter.puppies.forEach(puppy => {
|
||||
puppy.photo_urls = puppy.photo_urls ? JSON.parse(puppy.photo_urls) : [];
|
||||
});
|
||||
});
|
||||
|
||||
res.json(litters);
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// GET single litter
|
||||
router.get('/:id', (req, res) => {
|
||||
try {
|
||||
const db = getDatabase();
|
||||
const litter = db.prepare(`
|
||||
SELECT l.*,
|
||||
s.*, s.name as sire_name,
|
||||
d.*, d.name as dam_name
|
||||
FROM litters l
|
||||
JOIN dogs s ON l.sire_id = s.id
|
||||
JOIN dogs d ON l.dam_id = d.id
|
||||
WHERE l.id = ?
|
||||
`).get(req.params.id);
|
||||
|
||||
if (!litter) {
|
||||
return res.status(404).json({ error: 'Litter not found' });
|
||||
}
|
||||
|
||||
litter.puppies = db.prepare(`
|
||||
SELECT d.* FROM dogs d
|
||||
JOIN parents ps ON d.id = ps.dog_id
|
||||
JOIN parents pd ON d.id = pd.dog_id
|
||||
WHERE ps.parent_id = ? AND pd.parent_id = ?
|
||||
`).all(litter.sire_id, litter.dam_id);
|
||||
|
||||
litter.puppies.forEach(puppy => {
|
||||
puppy.photo_urls = puppy.photo_urls ? JSON.parse(puppy.photo_urls) : [];
|
||||
});
|
||||
|
||||
res.json(litter);
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// POST create new litter
|
||||
router.post('/', (req, res) => {
|
||||
try {
|
||||
const { sire_id, dam_id, breeding_date, whelping_date, notes } = req.body;
|
||||
|
||||
if (!sire_id || !dam_id || !breeding_date) {
|
||||
return res.status(400).json({ error: 'Sire, dam, and breeding date are required' });
|
||||
}
|
||||
|
||||
const db = getDatabase();
|
||||
|
||||
// Verify sire is male and dam is female
|
||||
const sire = db.prepare('SELECT sex FROM dogs WHERE id = ?').get(sire_id);
|
||||
const dam = db.prepare('SELECT sex FROM dogs WHERE id = ?').get(dam_id);
|
||||
|
||||
if (!sire || sire.sex !== 'male') {
|
||||
return res.status(400).json({ error: 'Invalid sire' });
|
||||
}
|
||||
if (!dam || dam.sex !== 'female') {
|
||||
return res.status(400).json({ error: 'Invalid dam' });
|
||||
}
|
||||
|
||||
const result = db.prepare(`
|
||||
INSERT INTO litters (sire_id, dam_id, breeding_date, whelping_date, notes)
|
||||
VALUES (?, ?, ?, ?, ?)
|
||||
`).run(sire_id, dam_id, breeding_date, whelping_date, notes);
|
||||
|
||||
const litter = db.prepare('SELECT * FROM litters WHERE id = ?').get(result.lastInsertRowid);
|
||||
|
||||
res.status(201).json(litter);
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// PUT update litter
|
||||
router.put('/:id', (req, res) => {
|
||||
try {
|
||||
const { breeding_date, whelping_date, puppy_count, notes } = req.body;
|
||||
|
||||
const db = getDatabase();
|
||||
db.prepare(`
|
||||
UPDATE litters
|
||||
SET breeding_date = ?, whelping_date = ?, puppy_count = ?, notes = ?
|
||||
WHERE id = ?
|
||||
`).run(breeding_date, whelping_date, puppy_count, notes, req.params.id);
|
||||
|
||||
const litter = db.prepare('SELECT * FROM litters WHERE id = ?').get(req.params.id);
|
||||
res.json(litter);
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// DELETE litter
|
||||
router.delete('/:id', (req, res) => {
|
||||
try {
|
||||
const db = getDatabase();
|
||||
db.prepare('DELETE FROM litters WHERE id = ?').run(req.params.id);
|
||||
res.json({ message: 'Litter deleted successfully' });
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user