fix(backend): medication get/update/delete use medication_id (UUID), not Mongo _id

The handlers parsed the URL :id as a Mongo ObjectId, but the create handler
generates medication_id as a UUID — so update/delete/get-by-uuid returned 400.
Added find_by_medication_id/update_by_medication_id/delete_by_medication_id
(filter on the medicationId field) and switched the get/update/delete handlers
to use them. Update now actually persists.
This commit is contained in:
goose 2026-06-28 11:40:03 -03:00
parent d41256e05b
commit dadcc8f1e4
2 changed files with 128 additions and 22 deletions

View file

@ -2,7 +2,6 @@ use axum::{
extract::{Extension, Json, Path, Query, State},
http::StatusCode,
};
use mongodb::bson::oid::ObjectId;
use std::time::SystemTime;
use crate::{
@ -109,13 +108,12 @@ pub async fn get_medication(
let database = state.db.get_database();
let repo = MedicationRepository::new(database.collection("medications"));
match ObjectId::parse_str(&id) {
Ok(oid) => match repo.find_by_id(&oid).await {
Ok(Some(medication)) => Ok(Json(medication.into())),
Ok(None) => Err(StatusCode::NOT_FOUND),
Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR),
},
Err(_) => Err(StatusCode::BAD_REQUEST),
// The path param is the application-level medication_id (a UUID), not the
// Mongo _id, so look it up directly instead of parsing as ObjectId.
match repo.find_by_medication_id(&id).await {
Ok(Some(medication)) => Ok(Json(medication.into())),
Ok(None) => Err(StatusCode::NOT_FOUND),
Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR),
}
}
@ -128,13 +126,11 @@ pub async fn update_medication(
let database = state.db.get_database();
let repo = MedicationRepository::new(database.collection("medications"));
match ObjectId::parse_str(&id) {
Ok(oid) => match repo.update(&oid, req).await {
Ok(Some(medication)) => Ok(Json(medication.into())),
Ok(None) => Err(StatusCode::NOT_FOUND),
Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR),
},
Err(_) => Err(StatusCode::BAD_REQUEST),
// Look up by medication_id (UUID) — the path param is not a Mongo ObjectId.
match repo.update_by_medication_id(&id, req).await {
Ok(Some(medication)) => Ok(Json(medication.into())),
Ok(None) => Err(StatusCode::NOT_FOUND),
Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR),
}
}
@ -146,13 +142,11 @@ pub async fn delete_medication(
let database = state.db.get_database();
let repo = MedicationRepository::new(database.collection("medications"));
match ObjectId::parse_str(&id) {
Ok(oid) => match repo.delete(&oid).await {
Ok(true) => Ok(StatusCode::NO_CONTENT),
Ok(false) => Err(StatusCode::NOT_FOUND),
Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR),
},
Err(_) => Err(StatusCode::BAD_REQUEST),
// Look up by medication_id (UUID), not Mongo _id.
match repo.delete_by_medication_id(&id).await {
Ok(true) => Ok(StatusCode::NO_CONTENT),
Ok(false) => Err(StatusCode::NOT_FOUND),
Err(_) => Err(StatusCode::INTERNAL_SERVER_ERROR),
}
}