From ff1eb455dca7f1b34c9e035e1ae3da76fbbef70e Mon Sep 17 00:00:00 2001 From: Zenflow Date: Wed, 11 Mar 2026 13:07:04 -0500 Subject: [PATCH] "Fix_COI_and_routes" --- client/src/utils/pedigreeHelpers.js | 6 +++--- server/routes/pedigree.js | 30 +++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/client/src/utils/pedigreeHelpers.js b/client/src/utils/pedigreeHelpers.js index 1fda70e..7229a3d 100644 --- a/client/src/utils/pedigreeHelpers.js +++ b/client/src/utils/pedigreeHelpers.js @@ -144,16 +144,16 @@ export const formatCOI = (coi) => { } } - const value = coi.toFixed(2) + const value = (coi * 100).toFixed(2) - if (coi <= 5) { + if (coi <= 0.05) { return { value: `${value}%`, level: 'low', color: '#10b981', description: 'Low inbreeding - Excellent genetic diversity' } - } else if (coi <= 10) { + } else if (coi <= 0.10) { return { value: `${value}%`, level: 'medium', diff --git a/server/routes/pedigree.js b/server/routes/pedigree.js index 5b7940e..bf68b9a 100644 --- a/server/routes/pedigree.js +++ b/server/routes/pedigree.js @@ -124,8 +124,8 @@ function calculateCOI(db, sireId, damId) { // 'trial-pairing' as dog IDs and return 404/wrong data. // ===================================================================== -// POST /api/pedigree/trial-pairing -router.post('/trial-pairing', (req, res) => { +// POST /api/pedigree/trial-pairing (alias for /coi) +router.post(['/trial-pairing', '/coi'], (req, res) => { try { const { sire_id, dam_id } = req.body; if (!sire_id || !dam_id) { @@ -149,8 +149,8 @@ router.post('/trial-pairing', (req, res) => { coi: result.coefficient, commonAncestors: result.commonAncestors, directRelation: relation.related ? relation.relationship : null, - recommendation: result.coefficient < 5 ? 'Low risk' - : result.coefficient < 10 ? 'Moderate risk' + recommendation: result.coefficient < 0.05 ? 'Low risk' + : result.coefficient < 0.10 ? 'Moderate risk' : 'High risk' }); } catch (error) { @@ -158,6 +158,28 @@ router.post('/trial-pairing', (req, res) => { } }); +// GET /api/pedigree/:id/coi +router.get('/:id/coi', (req, res) => { + try { + const db = getDatabase(); + const parents = db.prepare('SELECT parent_type, parent_id FROM parents WHERE dog_id = ?').all(req.params.id); + const sire = parents.find(p => p.parent_type === 'sire'); + const dam = parents.find(p => p.parent_type === 'dam'); + + if (!sire || !dam) { + return res.json({ coi: 0, commonAncestors: [], message: 'Incomplete parent data' }); + } + + const result = calculateCOI(db, sire.parent_id, dam.parent_id); + res.json({ + coi: result.coefficient, + commonAncestors: result.commonAncestors + }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + // GET /api/pedigree/relations/:sireId/:damId router.get('/relations/:sireId/:damId', (req, res) => { try {