Skip to content

Commit

Permalink
Support all QIDO endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
feliwir committed Feb 22, 2024
1 parent 65837ac commit 1749e71
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 10 deletions.
7 changes: 4 additions & 3 deletions server/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
41 changes: 34 additions & 7 deletions server/src/qido.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ pub struct QidoStudyQuery {
}

#[get("/studies")]
pub async fn search_studies(
pub async fn search_studies_all(
callbacks: web::Data<DicomWebServer>,
query: web::Query<QidoStudyQuery>,
) -> impl Responder {
Expand Down Expand Up @@ -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<DicomWebServer>,
study_uid: web::Path<String>,
query: web::Query<QidoSeriesQuery>,
Expand All @@ -81,6 +81,32 @@ pub async fn search_series(
}
}

#[get("/studies/{study_uid}/instances")]
pub async fn search_instances_study_level(
callbacks: web::Data<DicomWebServer>,
study_uid: web::Path<String>,
query: web::Query<QidoInstanceQuery>,
) -> 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<InMemDicomObject> = 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<DicomWebServer>,
Expand Down Expand Up @@ -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<DicomWebServer>,
study_uid: web::Path<String>,
series_uid: web::Path<String>,
Expand Down Expand Up @@ -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);
}

0 comments on commit 1749e71

Please sign in to comment.