- The medicine database is now much bigger and has a real update path.

Added:
Live source updater for RxNorm, DailyMed, and openFDA.
Admin dashboard panel to refresh medicine sources.
CLI updater for periodic jobs: 
[scripts/update_medicine_catalog.php](/Users/tyemeclifford/Documents/GH/workout/scripts/update_medicine_catalog.php)
Update history table: medication_source_updates.
Curl fallback for external fetches when PHP stream DNS fails.
README instructions for periodic updates.
I also ran the imports:
Current medication catalog count: 6,002.
Latest source imports:RxNorm: 3,875 inserted, 1,125 updated.
openFDA: 912 inserted, 88 updated.
DailyMed: 95 inserted.

Periodic update command:
/Users/tyemeclifford/frankenphp php-cli 
scripts/update_medicine_catalog.php 5000 all
This commit is contained in:
Ty Clifford
2026-06-30 15:29:57 -04:00
parent 17ebaf21a3
commit 96de47be43
10 changed files with 594 additions and 14 deletions
+15
View File
@@ -31,6 +31,21 @@ require __DIR__ . '/partials/site-header.php';
<section class="admin-panel site-admin-panel" id="adminPanel" hidden>
<div class="admin-stats" id="adminStats"></div>
<section class="admin-source-panel">
<div class="site-section-heading">
<p class="site-eyebrow">Medicine source updater</p>
<h2>Refresh the medication catalog from public sources.</h2>
<p>Pull medicine concepts from RxNorm, DailyMed, and openFDA. Use a smaller limit for quick checks or a larger limit for periodic maintenance.</p>
</div>
<form class="admin-source-form" id="medicineSourceRefreshForm">
<label class="site-field"><span>Source</span><select name="source"><option value="all">All sources</option><option>RxNorm</option><option>DailyMed</option><option>openFDA</option></select></label>
<label class="site-field"><span>Max rows per source</span><input name="limit" type="number" min="25" max="5000" step="25" value="1000"></label>
<button class="site-primary" type="submit">Refresh medicines</button>
</form>
<div class="source-refresh-result" id="medicineSourceRefreshResult" role="status" aria-live="polite"></div>
</section>
<div class="admin-layout">
<div class="admin-user-list" id="adminUserList"></div>
<form class="admin-editor" id="adminUserForm">