193 std::shared_ptr<rest_server_context> ctx) {
195 CROW_ROUTE(app,
"/api/v1/studies")
196 .methods(crow::HTTPMethod::GET)([ctx](
const crow::request &req) {
198 res.add_header(
"Content-Type",
"application/json");
199 add_cors_headers(res, *ctx);
201 if (!ctx->database) {
209 auto [limit, offset] = parse_pagination(req);
214 query.offset = offset;
216 auto patient_id = req.url_params.get(
"patient_id");
218 query.patient_id = patient_id;
221 auto patient_name = req.url_params.get(
"patient_name");
223 query.patient_name = patient_name;
226 auto study_uid = req.url_params.get(
"study_uid");
228 query.study_uid = study_uid;
231 auto study_id = req.url_params.get(
"study_id");
233 query.study_id = study_id;
236 auto study_date = req.url_params.get(
"study_date");
238 query.study_date = study_date;
241 auto study_date_from = req.url_params.get(
"study_date_from");
242 if (study_date_from) {
243 query.study_date_from = study_date_from;
246 auto study_date_to = req.url_params.get(
"study_date_to");
248 query.study_date_to = study_date_to;
251 auto accession_number = req.url_params.get(
"accession_number");
252 if (accession_number) {
253 query.accession_number = accession_number;
256 auto modality = req.url_params.get(
"modality");
258 query.modality = modality;
261 auto referring_physician = req.url_params.get(
"referring_physician");
262 if (referring_physician) {
263 query.referring_physician = referring_physician;
266 auto study_description = req.url_params.get(
"study_description");
267 if (study_description) {
268 query.study_description = study_description;
273 count_query.
limit = 0;
275 auto all_studies_result = ctx->database->search_studies(count_query);
276 if (!all_studies_result.is_ok()) {
279 all_studies_result.error().message);
282 size_t total_count = all_studies_result.value().size();
285 auto studies_result = ctx->database->search_studies(query);
286 if (!studies_result.is_ok()) {
289 studies_result.error().message);
294 res.body = studies_to_json(studies_result.value(), total_count);
299 CROW_ROUTE(app,
"/api/v1/studies/<string>")
300 .methods(crow::HTTPMethod::GET)(
301 [ctx](
const crow::request & ,
const std::string &study_uid) {
303 res.add_header(
"Content-Type",
"application/json");
304 add_cors_headers(res, *ctx);
306 if (!ctx->database) {
309 "Database not configured");
313 auto study = ctx->database->find_study(study_uid);
321 res.body = study_to_json(*study);
326 CROW_ROUTE(app,
"/api/v1/studies/<string>/series")
327 .methods(crow::HTTPMethod::GET)(
328 [ctx](
const crow::request & ,
const std::string &study_uid) {
330 res.add_header(
"Content-Type",
"application/json");
331 add_cors_headers(res, *ctx);
333 if (!ctx->database) {
336 "Database not configured");
341 auto study = ctx->database->find_study(study_uid);
348 auto series_list_result = ctx->database->list_series(study_uid);
349 if (!series_list_result.is_ok()) {
352 series_list_result.error().message);
357 res.body = series_list_to_json(series_list_result.value());
362 CROW_ROUTE(app,
"/api/v1/studies/<string>/instances")
363 .methods(crow::HTTPMethod::GET)(
364 [ctx](
const crow::request & ,
const std::string &study_uid) {
366 res.add_header(
"Content-Type",
"application/json");
367 add_cors_headers(res, *ctx);
369 if (!ctx->database) {
372 "Database not configured");
377 auto study = ctx->database->find_study(study_uid);
385 std::vector<storage::instance_record> all_instances;
386 auto series_list_result = ctx->database->list_series(study_uid);
387 if (!series_list_result.is_ok()) {
390 series_list_result.error().message);
393 for (
const auto &series : series_list_result.value()) {
394 auto instances_result = ctx->database->list_instances(series.series_uid);
395 if (!instances_result.is_ok()) {
398 instances_result.error().message);
401 const auto& instances = instances_result.value();
402 all_instances.insert(all_instances.end(), instances.begin(),
407 res.body = instances_to_json(all_instances);
412 CROW_ROUTE(app,
"/api/v1/studies/<string>")
413 .methods(crow::HTTPMethod::DELETE)(
414 [ctx](
const crow::request & ,
const std::string &study_uid) {
416 res.add_header(
"Content-Type",
"application/json");
417 add_cors_headers(res, *ctx);
419 if (!ctx->database) {
422 "Database not configured");
427 auto study = ctx->database->find_study(study_uid);
434 auto result = ctx->database->delete_study(study_uid);
435 if (result.is_err()) {
438 result.error().message);