- Conditions now use the same database/detail-page model as medicines, terminology, and symptoms.

What changed:
Rebuilt the Conditions page into a searchable condition database: 
[public/workouts.php (line 
1)](/Users/tyemeclifford/Documents/GH/workout/public/workouts.php:1)
Added dynamic condition detail pages, e.g. 
/condition.php?name=Type%202%20Diabetes or /condition.php?id=2: 
[public/condition.php (line 
1)](/Users/tyemeclifford/Documents/GH/workout/public/condition.php:1)
Added condition detail/link lookup helpers: [app/bootstrap.php (line 
1680)](/Users/tyemeclifford/Documents/GH/workout/app/bootstrap.php:1680)
Expanded the seeded condition catalog to 203 conditions with categories, 
tracking notes, and MedlinePlus links: [app/bootstrap.php (line 
636)](/Users/tyemeclifford/Documents/GH/workout/app/bootstrap.php:636)
Updated combined medical search to link conditions internally with “View 
condition”: [public/medical.php (line 
48)](/Users/tyemeclifford/Documents/GH/workout/public/medical.php:48)
Updated related records on symptom/term pages to point to condition 
detail pages.
Updated README route docs: [README.md (line 
21)](/Users/tyemeclifford/Documents/GH/workout/README.md:21)
This commit is contained in:
Ty Clifford
2026-06-30 16:35:27 -04:00
parent 0d492451c7
commit e45324fde4
8 changed files with 462 additions and 42 deletions
+239 -2
View File
@@ -580,6 +580,7 @@ function seed_medical_library(PDO $pdo): void
}
}
seed_expanded_condition_catalog($pdo, $created);
seed_medical_symptom_catalog($pdo, $created);
$medicineCount = (int) $pdo->query('SELECT COUNT(*) FROM medication_catalog')->fetchColumn();
@@ -632,6 +633,207 @@ function seed_medical_library(PDO $pdo): void
}
}
function seed_expanded_condition_catalog(PDO $pdo, string $created): void
{
$rows = condition_catalog_rows();
$existing = (int) db_value($pdo, 'SELECT COUNT(*) FROM medical_conditions');
$uniqueTarget = count(array_unique(array_map(static fn(array $row): string => strtolower($row[0]), $rows)));
if ($existing >= $uniqueTarget) {
return;
}
$stmt = $pdo->prepare(
"INSERT INTO medical_conditions
(name, category, overview, common_tracking, source_name, source_url, created_at)
SELECT ?, ?, ?, ?, ?, ?, ?
WHERE NOT EXISTS (SELECT 1 FROM medical_conditions WHERE lower(name) = lower(?))"
);
$startedTransaction = !$pdo->inTransaction();
if ($startedTransaction) {
$pdo->beginTransaction();
}
try {
foreach ($rows as $row) {
$stmt->execute([...$row, $created, $row[0]]);
}
if ($startedTransaction) {
$pdo->commit();
}
} catch (Throwable $exception) {
if ($startedTransaction && $pdo->inTransaction()) {
$pdo->rollBack();
}
throw $exception;
}
}
function condition_catalog_rows(): array
{
$groups = [
[
'Cardiovascular',
'{condition} is a heart, blood vessel, blood-pressure, clotting, or circulation-related condition.',
'Track blood pressure, pulse, weight, swelling, chest symptoms, shortness of breath, medicines, labs, procedures, and care-team instructions.',
['Hypertension', 'High Cholesterol', 'Coronary Artery Disease', 'Angina', 'Heart Attack', 'Heart Failure', 'Atrial Fibrillation', 'Arrhythmia', 'Stroke', 'Transient Ischemic Attack', 'Peripheral Artery Disease', 'Deep Vein Thrombosis', 'Pulmonary Embolism', 'Aortic Aneurysm', 'Raynaud Disease'],
],
[
'Respiratory',
'{condition} is a lung, airway, breathing, or oxygen-related condition.',
'Track cough, breathing effort, oxygen saturation, wheezing, triggers, fever, inhaler use, smoking or exposure history, and activity tolerance.',
['Asthma', 'Chronic Obstructive Pulmonary Disease', 'Pneumonia', 'Bronchitis', 'Sleep Apnea', 'Pulmonary Fibrosis', 'Tuberculosis', 'Cystic Fibrosis', 'Pleural Effusion', 'Respiratory Syncytial Virus Infection', 'COVID-19', 'Influenza', 'Allergic Rhinitis', 'Sinusitis'],
],
[
'Endocrine / metabolic',
'{condition} is a hormone, blood-sugar, thyroid, weight, or metabolism-related condition.',
'Track glucose if relevant, A1C, weight, blood pressure, medicines, energy, thirst, urination, labs, nutrition context, and clinician goals.',
['Type 1 Diabetes', 'Type 2 Diabetes', 'Prediabetes', 'Gestational Diabetes', 'Hypoglycemia', 'Hyperthyroidism', 'Hypothyroidism', 'Hashimoto Thyroiditis', 'Graves Disease', 'Cushing Syndrome', 'Addison Disease', 'Polycystic Ovary Syndrome', 'Obesity', 'Metabolic Syndrome', 'Vitamin D Deficiency', 'Osteoporosis'],
],
[
'Digestive / liver',
'{condition} is a digestive tract, liver, gallbladder, pancreas, or bowel-related condition.',
'Track abdominal pain location, bowel pattern, nausea, vomiting, bleeding, diet triggers, hydration, weight changes, medicines, procedures, and lab or imaging follow-up.',
['Gastroesophageal Reflux Disease', 'Peptic Ulcer Disease', 'Gastritis', 'Irritable Bowel Syndrome', 'Crohn Disease', 'Ulcerative Colitis', 'Celiac Disease', 'Diverticulitis', 'Gallstones', 'Pancreatitis', 'Hepatitis A', 'Hepatitis B', 'Hepatitis C', 'Cirrhosis', 'Fatty Liver Disease', 'Appendicitis', 'Hemorrhoids', 'Constipation', 'Diarrhea'],
],
[
'Kidney / urinary',
'{condition} is a kidney, bladder, urinary tract, or fluid-balance-related condition.',
'Track urination pattern, pain, fever, fluid intake, urine test results, kidney labs, blood pressure, swelling, medicines, and procedure notes.',
['Chronic Kidney Disease', 'Kidney Stones', 'Urinary Tract Infection', 'Bladder Infection', 'Kidney Infection', 'Urinary Incontinence', 'Overactive Bladder', 'Benign Prostatic Hyperplasia', 'Interstitial Cystitis', 'Glomerulonephritis', 'Nephrotic Syndrome'],
],
[
'Neurologic',
'{condition} is a brain, spinal cord, nerve, movement, headache, seizure, or cognition-related condition.',
'Track onset, symptom episodes, weakness, speech or vision changes, headaches, seizures, falls, medicines, triggers, sleep, and safety events.',
['Migraine', 'Epilepsy', 'Multiple Sclerosis', 'Parkinson Disease', 'Alzheimer Disease', 'Dementia', 'Neuropathy', 'Bell Palsy', 'Meningitis', 'Concussion', 'Traumatic Brain Injury', 'Vertigo', 'Amyotrophic Lateral Sclerosis', 'Restless Legs Syndrome', 'Carpal Tunnel Syndrome'],
],
[
'Mental health',
'{condition} is a mood, anxiety, attention, behavior, substance-use, sleep, or psychiatric condition.',
'Track mood, sleep, appetite, concentration, safety concerns, triggers, medicines, therapy notes, substance use, and follow-up plans.',
['Depression', 'Anxiety Disorders', 'Generalized Anxiety Disorder', 'Panic Disorder', 'Bipolar Disorder', 'Post-Traumatic Stress Disorder', 'Obsessive-Compulsive Disorder', 'Attention Deficit Hyperactivity Disorder', 'Autism Spectrum Disorder', 'Schizophrenia', 'Eating Disorders', 'Alcohol Use Disorder', 'Substance Use Disorder', 'Insomnia'],
],
[
'Musculoskeletal / rheumatology',
'{condition} is a bone, joint, muscle, spine, autoimmune, or inflammation-related condition.',
'Track pain score, stiffness, swelling, range of motion, flares, activity limits, injuries, medicines, injections, imaging, and function.',
['Osteoarthritis', 'Rheumatoid Arthritis', 'Gout', 'Fibromyalgia', 'Lupus', 'Ankylosing Spondylitis', 'Psoriatic Arthritis', 'Bursitis', 'Tendinitis', 'Back Pain', 'Sciatica', 'Scoliosis', 'Fracture', 'Sprain', 'Carpal Tunnel Syndrome', 'Osteomyelitis'],
],
[
'Skin / dermatology',
'{condition} is a skin, hair, nail, wound, allergy, or visible-tissue condition.',
'Track location, appearance, spread, itch, pain, fever, drainage, new medicines, exposures, photos, treatment response, and recurrence.',
['Acne', 'Eczema', 'Psoriasis', 'Rosacea', 'Hives', 'Cellulitis', 'Shingles', 'Cold Sores', 'Fungal Skin Infection', 'Warts', 'Vitiligo', 'Alopecia Areata', 'Pressure Ulcers', 'Melanoma', 'Skin Cancer', 'Seborrheic Dermatitis'],
],
[
'Infectious disease',
'{condition} is an infection or infectious-disease-related condition.',
'Track fever, symptom onset, exposures, test results, isolation guidance, medicines, completion dates, hydration, and worsening symptoms.',
['Common Cold', 'Strep Throat', 'Mononucleosis', 'Lyme Disease', 'Sepsis', 'HIV', 'Herpes', 'Chickenpox', 'Measles', 'Mumps', 'Whooping Cough', 'Food Poisoning', 'MRSA Infection', 'C. difficile Infection'],
],
[
'Blood / immune',
'{condition} is a blood, clotting, anemia, immune, or allergy-related condition.',
'Track CBC results, bleeding or bruising, fatigue, infections, triggers, exposures, medicines, transfusions, and specialist follow-up.',
['Anemia', 'Iron Deficiency Anemia', 'Sickle Cell Disease', 'Hemophilia', 'Thrombocytopenia', 'Leukemia', 'Lymphoma', 'Multiple Myeloma', 'Allergies', 'Anaphylaxis', 'Autoimmune Diseases', 'Immunodeficiency Disorders'],
],
[
'Eye / ear / nose / throat',
'{condition} is an eye, ear, sinus, mouth, dental, hearing, or throat condition.',
'Track pain, side affected, vision or hearing changes, discharge, fever, allergies, dental symptoms, medicines, and procedure notes.',
['Conjunctivitis', 'Cataracts', 'Glaucoma', 'Macular Degeneration', 'Diabetic Eye Disease', 'Dry Eye', 'Ear Infection', 'Tinnitus', 'Hearing Loss', 'Tonsillitis', 'Dental Cavities', 'Gum Disease'],
],
[
'Reproductive / pregnancy',
'{condition} is a reproductive, menstrual, pregnancy, breast, prostate, or sexual-health-related condition.',
'Track cycle timing, bleeding, pelvic pain, discharge, pregnancy context, urinary symptoms, test results, medicines, and clinician instructions.',
['Endometriosis', 'Uterine Fibroids', 'Ovarian Cysts', 'Menopause', 'Pregnancy', 'Preeclampsia', 'Breast Cancer', 'Prostate Cancer', 'Prostatitis', 'Erectile Dysfunction', 'Sexually Transmitted Infections', 'Infertility'],
],
[
'Cancer / oncology',
'{condition} is a cancer, tumor, screening, treatment, or survivorship-related condition.',
'Track diagnosis details, stage if known, treatments, side effects, labs, imaging, symptoms, appointments, medicines, and care-team plans.',
['Lung Cancer', 'Colorectal Cancer', 'Breast Cancer', 'Prostate Cancer', 'Skin Cancer', 'Melanoma', 'Pancreatic Cancer', 'Kidney Cancer', 'Bladder Cancer', 'Thyroid Cancer', 'Ovarian Cancer', 'Cervical Cancer'],
],
[
'General medicine',
'{condition} is a general medical condition or care topic that may involve multiple body systems.',
'Track symptoms, onset, severity, medicines, vitals, labs, appointments, self-care steps, and clinician guidance.',
['Pain and Inflammation', 'Chronic Pain', 'Fever', 'Dehydration', 'Malnutrition', 'Falls', 'Frailty', 'Medication Side Effects', 'Adverse Drug Reaction', 'Postoperative Recovery'],
],
];
$rows = [];
foreach ($groups as [$category, $overviewTemplate, $tracking, $names]) {
foreach ($names as $name) {
$rows[] = [
$name,
$category,
str_replace('{condition}', $name, $overviewTemplate),
$tracking,
'MedlinePlus',
condition_source_url($name),
];
}
}
return $rows;
}
function condition_source_url(string $name): string
{
$map = [
'Alzheimer Disease' => 'https://medlineplus.gov/alzheimersdisease.html',
'Anemia' => 'https://medlineplus.gov/anemia.html',
'Anxiety Disorders' => 'https://medlineplus.gov/anxiety.html',
'Asthma' => 'https://medlineplus.gov/asthma.html',
'Back Pain' => 'https://medlineplus.gov/backpain.html',
'Breast Cancer' => 'https://medlineplus.gov/breastcancer.html',
'Chronic Kidney Disease' => 'https://medlineplus.gov/chronickidneydisease.html',
'Chronic Obstructive Pulmonary Disease' => 'https://medlineplus.gov/copd.html',
'COVID-19' => 'https://medlineplus.gov/covid19coronavirusdisease2019.html',
'Depression' => 'https://medlineplus.gov/depression.html',
'Diarrhea' => 'https://medlineplus.gov/diarrhea.html',
'Eczema' => 'https://medlineplus.gov/eczema.html',
'Epilepsy' => 'https://medlineplus.gov/epilepsy.html',
'Fibromyalgia' => 'https://medlineplus.gov/fibromyalgia.html',
'Gastroesophageal Reflux Disease' => 'https://medlineplus.gov/gerd.html',
'Gout' => 'https://medlineplus.gov/gout.html',
'Heart Attack' => 'https://medlineplus.gov/heartattack.html',
'Heart Failure' => 'https://medlineplus.gov/heartfailure.html',
'Hepatitis C' => 'https://medlineplus.gov/hepatitisc.html',
'High Cholesterol' => 'https://medlineplus.gov/cholesterol.html',
'HIV' => 'https://medlineplus.gov/hivaids.html',
'Hypertension' => 'https://medlineplus.gov/highbloodpressure.html',
'Influenza' => 'https://medlineplus.gov/flu.html',
'Insomnia' => 'https://medlineplus.gov/insomnia.html',
'Irritable Bowel Syndrome' => 'https://medlineplus.gov/irritablebowelsyndrome.html',
'Kidney Stones' => 'https://medlineplus.gov/kidneystones.html',
'Lupus' => 'https://medlineplus.gov/lupus.html',
'Migraine' => 'https://medlineplus.gov/migraine.html',
'Multiple Sclerosis' => 'https://medlineplus.gov/multiplesclerosis.html',
'Obesity' => 'https://medlineplus.gov/obesity.html',
'Osteoarthritis' => 'https://medlineplus.gov/osteoarthritis.html',
'Osteoporosis' => 'https://medlineplus.gov/osteoporosis.html',
'Parkinson Disease' => 'https://medlineplus.gov/parkinsonsdisease.html',
'Pneumonia' => 'https://medlineplus.gov/pneumonia.html',
'Pregnancy' => 'https://medlineplus.gov/pregnancy.html',
'Psoriasis' => 'https://medlineplus.gov/psoriasis.html',
'Rheumatoid Arthritis' => 'https://medlineplus.gov/rheumatoidarthritis.html',
'Shingles' => 'https://medlineplus.gov/shingles.html',
'Sickle Cell Disease' => 'https://medlineplus.gov/sicklecelldisease.html',
'Sleep Apnea' => 'https://medlineplus.gov/sleepapnea.html',
'Stroke' => 'https://medlineplus.gov/stroke.html',
'Type 1 Diabetes' => 'https://medlineplus.gov/diabetestype1.html',
'Type 2 Diabetes' => 'https://medlineplus.gov/diabetestype2.html',
'Urinary Tract Infection' => 'https://medlineplus.gov/urinarytractinfections.html',
];
return $map[$name] ?? 'https://medlineplus.gov/search/?query=' . rawurlencode($name);
}
function seed_medical_symptom_catalog(PDO $pdo, string $created): void
{
$rows = symptom_catalog_rows();
@@ -1475,6 +1677,11 @@ function symptom_detail_path(array $symptom): string
return '/symptom.php?id=' . rawurlencode((string) ($symptom['id'] ?? ''));
}
function condition_detail_path(array $condition): string
{
return '/condition.php?id=' . rawurlencode((string) ($condition['id'] ?? ''));
}
function find_medication_catalog_item(PDO $pdo, array $query): ?array
{
$id = filter_var($query['id'] ?? null, FILTER_VALIDATE_INT);
@@ -1529,6 +1736,29 @@ function find_medical_term_item(PDO $pdo, array $query): ?array
);
}
function find_medical_condition_item(PDO $pdo, array $query): ?array
{
$id = filter_var($query['id'] ?? null, FILTER_VALIDATE_INT);
if ($id !== false && $id > 0) {
return db_one($pdo, 'SELECT * FROM medical_conditions WHERE id = ?', [$id]);
}
$name = trim((string) ($query['name'] ?? $query['condition'] ?? $query['q'] ?? ''));
if ($name === '') {
return null;
}
return db_one(
$pdo,
"SELECT *
FROM medical_conditions
WHERE lower(name) = lower(?)
ORDER BY name
LIMIT 1",
[$name]
);
}
function find_medical_symptom_item(PDO $pdo, array $query): ?array
{
$id = filter_var($query['id'] ?? null, FILTER_VALIDATE_INT);
@@ -2029,7 +2259,7 @@ function library_search_payload(array $query): array
$like = '%' . $search . '%';
$termParams = array_fill(0, 5, $like);
$conditionParams = array_fill(0, 4, $like);
$conditionParams = [...array_fill(0, 4, $like), $search, $search . '%', $like];
$symptomParams = [...array_fill(0, 8, $like), $search, $search . '%', $like];
$medicineParams = array_fill(0, 10, $like);
$studyParams = array_fill(0, 6, $like);
@@ -2049,7 +2279,14 @@ function library_search_payload(array $query): array
$pdo,
"SELECT * FROM medical_conditions
WHERE name LIKE ? OR category LIKE ? OR overview LIKE ? OR common_tracking LIKE ?
ORDER BY category, name
ORDER BY
CASE
WHEN lower(name) = lower(?) THEN 0
WHEN name LIKE ? THEN 1
WHEN overview LIKE ? THEN 2
ELSE 3
END,
category, name
LIMIT {$limit}",
$conditionParams
),