Finished medication tracking and UI enhancements

This commit is contained in:
Corey Blais
2026-04-19 13:20:02 -04:00
parent 263b98d3d8
commit 872b6c8663
6 changed files with 589 additions and 253 deletions
+60 -1
View File
@@ -1,5 +1,14 @@
import { db } from '../db/client.js';
import type { BirdGender, BirdRow, LostBirdMatchRow, MedicationRow, PendingBirdTransferRow, VetVisitRow, WeightRow } from '../types.js';
import type {
BirdGender,
BirdRow,
LostBirdMatchRow,
MedicationAdministrationRow,
MedicationRow,
PendingBirdTransferRow,
VetVisitRow,
WeightRow,
} from '../types.js';
const birdSelectFields = `
birds.id,
@@ -482,3 +491,53 @@ export const deleteMedicationForBird = async (medicationId: string, birdId: stri
return (result.rowCount ?? 0) > 0;
};
export const listMedicationAdministrationsForBird = async (birdId: string, workspaceId: number) => {
const result = await db.query<MedicationAdministrationRow>(
`SELECT id, medication_id, bird_id, administered_on::text, status, notes, created_by_user_id, created_at
FROM medication_administrations
WHERE bird_id = $1
AND EXISTS (
SELECT 1
FROM birds
WHERE birds.id = medication_administrations.bird_id
AND birds.workspace_id = $2
)
ORDER BY administered_on DESC, created_at DESC`,
[birdId, workspaceId],
);
return result.rows;
};
export const upsertMedicationAdministrationForBird = async (
medicationId: string,
birdId: string,
workspaceId: number,
administeredOn: string,
status: 'administered' | 'missed',
notes: string | null,
createdByUserId: string | null,
) => {
const result = await db.query<MedicationAdministrationRow>(
`INSERT INTO medication_administrations (medication_id, bird_id, administered_on, status, notes, created_by_user_id)
SELECT $1, $2, $4, $5, $6, $7
WHERE EXISTS (
SELECT 1
FROM medications
JOIN birds ON birds.id = medications.bird_id
WHERE medications.id = $1
AND medications.bird_id = $2
AND birds.workspace_id = $3
)
ON CONFLICT (medication_id, administered_on)
DO UPDATE SET status = EXCLUDED.status,
notes = EXCLUDED.notes,
created_by_user_id = EXCLUDED.created_by_user_id,
created_at = CURRENT_TIMESTAMP
RETURNING id, medication_id, bird_id, administered_on::text, status, notes, created_by_user_id, created_at`,
[medicationId, birdId, workspaceId, administeredOn, status, notes, createdByUserId],
);
return result.rows[0] ?? null;
};