feat: full appointment feature (CRUD + Appointments tab)
Builds the complete appointment feature end-to-end, mirroring the medication feature structure. The model existed but was orphaned dead code (no handlers, routes, repo, or frontend) — this builds the whole stack. Backend: - models/appointment.rs: AppointmentData (deserializes the data blob, camelCase keys), AppointmentResponse (flat snake_case + From<Appointment>), Create/Update request structs, AppointmentRepository (create, find_by_user_filtered with optional status filter, find/update/delete by appointment_id). Mirrors the medication serialization pattern. Module added to models/mod.rs. - handlers/appointments.rs: full CRUD (create/list/get/update/delete) returning AppointmentResponse. Routes wired in app.rs (POST/GET /api/appointments, GET/POST /:id, POST /:id/delete). - 3 unit tests (AppointmentData deser, default status, response flatten). Frontend: - Appointment/Create/Update types; getAppointments/getAppointment/create/ update/deleteAppointment in api.ts; useAppointmentStore. - AppointmentsManager component (list with type+status chips, create/edit dialogs, delete confirm, empty state) as a 5th Dashboard tab. Verified: backend fmt/clippy 0 warnings, 26 tests pass; frontend build clean, 20 tests pass.
This commit is contained in:
parent
0921d73a6d
commit
4c4c29f72e
10 changed files with 1019 additions and 4 deletions
|
|
@ -78,6 +78,12 @@ pub fn build_app(state: AppState) -> Router {
|
|||
// Drug interactions (Phase 2.8)
|
||||
.route("/api/interactions/check", post(handlers::check_interactions))
|
||||
.route("/api/interactions/check-new", post(handlers::check_new_medication))
|
||||
// Appointments
|
||||
.route("/api/appointments", post(handlers::create_appointment))
|
||||
.route("/api/appointments", get(handlers::list_appointments))
|
||||
.route("/api/appointments/:id", get(handlers::get_appointment))
|
||||
.route("/api/appointments/:id", post(handlers::update_appointment))
|
||||
.route("/api/appointments/:id/delete", post(handlers::delete_appointment))
|
||||
.layer(axum::middleware::from_fn_with_state(
|
||||
state.clone(),
|
||||
middleware::jwt_auth_middleware,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue