diff --git a/server/src/lib.rs b/server/src/lib.rs index f9fde03..8eaae8d 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -65,11 +65,12 @@ pub const INSTANCE_TAGS: [Tag; 3] = [ pub fn dicomweb_config(cfg: &mut actix_web::web::ServiceConfig) { cfg.service(store_instances) .service(store_instances_for_study) - .service(search_studies) - .service(search_series) + .service(search_studies_all) .service(search_series_all) - .service(search_instances) + .service(search_series_study_level) .service(search_instances_all) + .service(search_instances_study_level) + .service(search_instances_series_level) .service(retrieve_instance) .service(retrieve_series) .service(retrieve_study); diff --git a/server/src/qido.rs b/server/src/qido.rs index 964c4d7..8ef8c59 100644 --- a/server/src/qido.rs +++ b/server/src/qido.rs @@ -21,7 +21,7 @@ pub struct QidoStudyQuery { } #[get("/studies")] -pub async fn search_studies( +pub async fn search_studies_all( callbacks: web::Data, query: web::Query, ) -> impl Responder { @@ -56,7 +56,7 @@ pub struct QidoSeriesQuery { } #[get("/studies/{study_uid}/series")] -pub async fn search_series( +pub async fn search_series_study_level( callbacks: web::Data, study_uid: web::Path, query: web::Query, @@ -81,6 +81,32 @@ pub async fn search_series( } } +#[get("/studies/{study_uid}/instances")] +pub async fn search_instances_study_level( + callbacks: web::Data, + study_uid: web::Path, + query: web::Query, +) -> impl Responder { + let result = (callbacks.search_instances)(Some(&study_uid), None, &query); + + match result { + Ok(dcm_list) => { + // Apply the offset and the filter + let filtered: Vec = dcm_list + .iter() + .skip(query.offset.unwrap_or(0)) + .take(query.limit.unwrap_or(100)) + .cloned() + .collect(); + + // Convert the results to JSON + let dcm_json = DicomJson::from(filtered); + HttpResponse::Ok().json(dcm_json) + } + Err(e) => HttpResponse::InternalServerError().body(e.to_string()), + } +} + #[get("/series")] pub async fn search_series_all( callbacks: web::Data, @@ -116,7 +142,7 @@ pub struct QidoInstanceQuery { } #[get("/studies/{study_uid}/series/{series_uid}/instances")] -pub async fn search_instances( +pub async fn search_instances_series_level( callbacks: web::Data, study_uid: web::Path, series_uid: web::Path, @@ -168,9 +194,10 @@ pub async fn search_instances_all( } pub fn qido_config(cfg: &mut web::ServiceConfig) { - cfg.service(search_studies) - .service(search_series) + cfg.service(search_studies_all) .service(search_series_all) - .service(search_instances) - .service(search_instances_all); + .service(search_series_study_level) + .service(search_instances_all) + .service(search_instances_study_level) + .service(search_instances_series_level); }