comparison OrthancServer/OrthancRestApi/OrthancRestResources.cpp @ 1140:94c5f6623b3a

URIs to get all the children of a given resource in a single REST call
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 10 Sep 2014 17:20:56 +0200
parents f167b672db94
children 0479d02c6778
comparison
equal deleted inserted replaced
1139:f167b672db94 1140:94c5f6623b3a
808 808
809 call.GetOutput().AnswerJson(result); 809 call.GetOutput().AnswerJson(result);
810 } 810 }
811 811
812 812
813 template <enum ResourceType start,
814 enum ResourceType end>
815 static void GetChildResources(RestApiGetCall& call)
816 {
817 ServerIndex& index = OrthancRestApi::GetIndex(call);
818
819 std::list<std::string> a, b, c;
820 a.push_back(call.GetUriComponent("id", ""));
821
822 ResourceType type = start;
823 while (type != end)
824 {
825 b.clear();
826
827 for (std::list<std::string>::const_iterator
828 it = a.begin(); it != a.end(); it++)
829 {
830 index.GetChildren(c, *it);
831 b.splice(b.begin(), c);
832 }
833
834 switch (type)
835 {
836 case ResourceType_Patient:
837 type = ResourceType_Study;
838 break;
839
840 case ResourceType_Study:
841 type = ResourceType_Series;
842 break;
843
844 case ResourceType_Series:
845 type = ResourceType_Instance;
846 break;
847
848 default:
849 throw OrthancException(ErrorCode_InternalError);
850 }
851
852 a.clear();
853 a.splice(a.begin(), b);
854 }
855
856 Json::Value result = Json::arrayValue;
857
858 for (std::list<std::string>::const_iterator
859 it = a.begin(); it != a.end(); it++)
860 {
861 Json::Value item;
862
863 if (OrthancRestApi::GetIndex(call).LookupResource(item, *it, end))
864 {
865 result.append(item);
866 }
867 }
868
869 call.GetOutput().AnswerJson(result);
870 }
871
872
873
813 void OrthancRestApi::RegisterResources() 874 void OrthancRestApi::RegisterResources()
814 { 875 {
815 Register("/instances", ListResources<ResourceType_Instance>); 876 Register("/instances", ListResources<ResourceType_Instance>);
816 Register("/patients", ListResources<ResourceType_Patient>); 877 Register("/patients", ListResources<ResourceType_Patient>);
817 Register("/series", ListResources<ResourceType_Series>); 878 Register("/series", ListResources<ResourceType_Series>);
878 Register("/{resourceType}/{id}/attachments/{name}/verify-md5", VerifyAttachment); 939 Register("/{resourceType}/{id}/attachments/{name}/verify-md5", VerifyAttachment);
879 Register("/{resourceType}/{id}/attachments/{name}", UploadAttachment); 940 Register("/{resourceType}/{id}/attachments/{name}", UploadAttachment);
880 941
881 Register("/tools/lookup", Lookup); 942 Register("/tools/lookup", Lookup);
882 943
944 Register("/patients/{id}/studies", GetChildResources<ResourceType_Patient, ResourceType_Study>);
945 Register("/patients/{id}/series", GetChildResources<ResourceType_Patient, ResourceType_Series>);
946 Register("/patients/{id}/instances", GetChildResources<ResourceType_Patient, ResourceType_Instance>);
947 Register("/studies/{id}/series", GetChildResources<ResourceType_Study, ResourceType_Series>);
948 Register("/studies/{id}/instances", GetChildResources<ResourceType_Study, ResourceType_Instance>);
949 Register("/series/{id}/instances", GetChildResources<ResourceType_Series, ResourceType_Instance>);
950
883 Register("/instances/{id}/content/*", GetRawContent); 951 Register("/instances/{id}/content/*", GetRawContent);
884 } 952 }
885 } 953 }