Mercurial > hg > orthanc
diff OrthancServer/OrthancRestApi/OrthancRestResources.cpp @ 1354:3dd494f201a1
ResourceFinder
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 13 May 2015 12:17:35 +0200 |
parents | 9ec7ac03152d |
children | ab9f3d5910bd |
line wrap: on
line diff
--- a/OrthancServer/OrthancRestApi/OrthancRestResources.cpp Tue May 12 18:27:14 2015 +0200 +++ b/OrthancServer/OrthancRestApi/OrthancRestResources.cpp Wed May 13 12:17:35 2015 +0200 @@ -35,6 +35,7 @@ #include "../ServerToolbox.h" #include "../FromDcmtkBridge.h" +#include "../ResourceFinder.h" #include <glog/logging.h> @@ -42,32 +43,44 @@ { // List all the patients, studies, series or instances ---------------------- + static void AnswerListOfResources(RestApiOutput& output, + ServerIndex& index, + const std::list<std::string>& resources, + ResourceType level, + bool expand) + { + Json::Value answer = Json::arrayValue; + + for (std::list<std::string>::const_iterator + resource = resources.begin(); resource != resources.end(); resource++) + { + if (expand) + { + Json::Value item; + if (index.LookupResource(item, *resource, level)) + { + answer.append(item); + } + } + else + { + answer.append(*resource); + } + } + + output.AnswerJson(answer); + } + + template <enum ResourceType resourceType> static void ListResources(RestApiGetCall& call) { ServerIndex& index = OrthancRestApi::GetIndex(call); - Json::Value result; + std::list<std::string> result; index.GetAllUuids(result, resourceType); - if (call.HasArgument("expand")) - { - Json::Value expanded = Json::arrayValue; - for (Json::Value::ArrayIndex i = 0; i < result.size(); i++) - { - Json::Value item; - if (index.LookupResource(item, result[i].asString(), resourceType)) - { - expanded.append(item); - } - } - - call.GetOutput().AnswerJson(expanded); - } - else - { - call.GetOutput().AnswerJson(result); - } + AnswerListOfResources(call.GetOutput(), index, result, resourceType, call.HasArgument("expand")); } template <enum ResourceType resourceType> @@ -835,6 +848,56 @@ } + static void Find(RestApiPostCall& call) + { + ServerIndex& index = OrthancRestApi::GetIndex(call); + + Json::Value request; + if (call.ParseJsonRequest(request) && + request.type() == Json::objectValue && + request.isMember("Level") && + request.isMember("Query") && + request["Level"].type() == Json::stringValue && + request["Query"].type() == Json::objectValue) + { + std::string level = request["Level"].asString(); + + ResourceFinder finder(index); + finder.SetLevel(StringToResourceType(level.c_str())); + + if (request.isMember("CaseSensitive")) + { + finder.SetCaseSensitive(request["CaseSensitive"].asBool()); + } + + bool expand = false; + if (request.isMember("Expand")) + { + expand = request["Expand"].asBool(); + } + + Json::Value::Members members = request["Query"].getMemberNames(); + for (size_t i = 0; i < members.size(); i++) + { + if (request["Query"][members[i]].type() != Json::stringValue) + { + throw OrthancException(ErrorCode_BadRequest); + } + + finder.AddTag(members[i], request["Query"][members[i]].asString()); + } + + std::list<std::string> resources; + finder.Apply(resources); + AnswerListOfResources(call.GetOutput(), index, resources, finder.GetLevel(), expand); + } + else + { + throw OrthancException(ErrorCode_BadRequest); + } + } + + template <enum ResourceType start, enum ResourceType end> static void GetChildResources(RestApiGetCall& call) @@ -1042,6 +1105,7 @@ Register("/{resourceType}/{id}/attachments/{name}", UploadAttachment); Register("/tools/lookup", Lookup); + Register("/tools/find", Find); Register("/patients/{id}/studies", GetChildResources<ResourceType_Patient, ResourceType_Study>); Register("/patients/{id}/series", GetChildResources<ResourceType_Patient, ResourceType_Series>);