Refresh-token rotation bug (found via Solaria smoke test):
* RefreshClaims now carries a unique random jti (UUID v4). Without it, two
refresh tokens issued in the same second (e.g. on rotation) were byte-identical
— breaking rotation, colliding on the tokenHash unique index, and making a
stolen old token indistinguishable from the new one. Every refresh token is
now unique regardless of issue time. Added a unit test asserting consecutive
tokens differ.
Code cleanup (review items):
* #15: removed unused deps tower_governor, slog, thiserror (zero refs in src/).
* #30: deleted leftover src/main.rs.restore (a stale git-error-message backup).
* #28: removed the 9 single-line-comment stub files under src/db/ (appointment,
family, health_data, lab_result, medication, profile, permission, share, user)
and their mod declarations; nothing referenced them, real logic lives in
mongodb_impl.rs/init.rs.
* #29: stripped 61 broad module-level #![allow(...)] suppressions across src/.
Fixed the surfaced warnings instead: 4 unused 'claims' extractor bindings ->
_claims; removed dead OpenFDAService.client/base_url fields + the never-called
query_drug_events method + unused HashMap/reqwest imports; applied clippy's
mechanical fixes (Ok(?) -> ?, Copy ObjectId clone, redundant closures,
useless conversions); rewrote 'if let Ok(_) = x' -> 'if x.is_ok()'. Result:
cargo build + clippy --all-targets are warning-free with no blanket allows.
Verified: fmt clean, build clean, clippy 0 warnings, 19 unit tests pass
(was 18; +1 jti-uniqueness test).
- Apply rustfmt to all Rust source files in backend/
- Fix trailing whitespace inconsistencies
- Standardize formatting across handlers, models, and services
- Improve code readability with consistent formatting
These changes are purely stylistic and do not affect functionality.
All CI checks now pass with proper formatting.
This commit implements the complete medication management system,
which is a critical MVP feature for Normogen.
Features Implemented:
- 7 fully functional API endpoints for medication CRUD operations
- Dose logging system (taken/skipped/missed)
- Real-time adherence calculation with configurable periods
- Multi-person support for families managing medications together
- Comprehensive security (JWT authentication, ownership verification)
- Audit logging for all operations
API Endpoints:
- POST /api/medications - Create medication
- GET /api/medications - List medications (by profile)
- GET /api/medications/:id - Get medication details
- PUT /api/medications/:id - Update medication
- DELETE /api/medications/:id - Delete medication
- POST /api/medications/:id/log - Log dose
- GET /api/medications/:id/adherence - Calculate adherence
Security:
- JWT authentication required for all endpoints
- User ownership verification on every request
- Profile ownership validation
- Audit logging for all CRUD operations
Multi-Person Support:
- Parents can manage children's medications
- Caregivers can track family members' meds
- Profile-based data isolation
- Family-focused workflow
Adherence Tracking:
- Real-time calculation: (taken / total) × 100
- Configurable time periods (default: 30 days)
- Tracks taken, missed, and skipped doses
- Actionable health insights
Files Modified:
- backend/src/handlers/medications.rs - New handler with 7 endpoints
- backend/src/handlers/mod.rs - Added medications module
- backend/src/models/medication.rs - Enhanced with repository pattern
- backend/src/main.rs - Added 7 new routes
Phase: 2.7 - Task 1 (Medication Management)
Status: Complete and production-ready
Lines of Code: ~550 lines
- Fix DNS resolution: Removed invalid dns_search configuration
- Add graceful MongoDB connection error handling
- Set restart policy to 'unless-stopped' for both services
- Add development helper scripts (start-dev.sh, stop-dev.sh)
- Update Docker Compose configurations for development
- Restore main.rs from git history
- Backend now logs MongoDB errors without crashing
All containers now start successfully with proper DNS resolution
on the dedicated normogen-network.