From ac516a09114f74d3343f327d9a4936866eebcc0c Mon Sep 17 00:00:00 2001 From: jason Date: Sun, 8 Mar 2026 22:45:27 -0500 Subject: [PATCH] Add litters API routes --- server/routes/litters.js | 139 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 server/routes/litters.js diff --git a/server/routes/litters.js b/server/routes/litters.js new file mode 100644 index 0000000..e7832a6 --- /dev/null +++ b/server/routes/litters.js @@ -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; \ No newline at end of file