comparison OrthancServer/OrthancRestApi/OrthancRestResources.cpp @ 1281:8dac11c78d71

URIs to get all the parents of a given resource in a single REST call
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 03 Feb 2015 10:53:35 +0100
parents 6164f7200c43
children 6e7e5ed91c2d
comparison
equal deleted inserted replaced
1280:d6a65dc6d0ac 1281:8dac11c78d71
910 call.GetOutput().AnswerJson(result); 910 call.GetOutput().AnswerJson(result);
911 } 911 }
912 912
913 913
914 914
915 template <enum ResourceType start,
916 enum ResourceType end>
917 static void GetParentResource(RestApiGetCall& call)
918 {
919 assert(start > end);
920
921 ServerIndex& index = OrthancRestApi::GetIndex(call);
922
923 std::string current = call.GetUriComponent("id", "");
924 ResourceType currentType = start;
925 while (currentType > end)
926 {
927 std::string parent;
928 if (!index.LookupParent(parent, current))
929 {
930 // Error that could happen if the resource gets deleted by
931 // another concurrent call
932 return;
933 }
934
935 current = parent;
936 switch (currentType)
937 {
938 case ResourceType_Instance: currentType = ResourceType_Series; break;
939 case ResourceType_Series: currentType = ResourceType_Study; break;
940 case ResourceType_Study: currentType = ResourceType_Patient; break;
941 default: throw OrthancException(ErrorCode_InternalError);
942 }
943 }
944
945 assert(currentType == end);
946
947 Json::Value result;
948 if (index.LookupResource(result, current, end))
949 {
950 call.GetOutput().AnswerJson(result);
951 }
952 }
953
954
955
915 void OrthancRestApi::RegisterResources() 956 void OrthancRestApi::RegisterResources()
916 { 957 {
917 Register("/instances", ListResources<ResourceType_Instance>); 958 Register("/instances", ListResources<ResourceType_Instance>);
918 Register("/patients", ListResources<ResourceType_Patient>); 959 Register("/patients", ListResources<ResourceType_Patient>);
919 Register("/series", ListResources<ResourceType_Series>); 960 Register("/series", ListResources<ResourceType_Series>);
987 Register("/patients/{id}/instances", GetChildResources<ResourceType_Patient, ResourceType_Instance>); 1028 Register("/patients/{id}/instances", GetChildResources<ResourceType_Patient, ResourceType_Instance>);
988 Register("/studies/{id}/series", GetChildResources<ResourceType_Study, ResourceType_Series>); 1029 Register("/studies/{id}/series", GetChildResources<ResourceType_Study, ResourceType_Series>);
989 Register("/studies/{id}/instances", GetChildResources<ResourceType_Study, ResourceType_Instance>); 1030 Register("/studies/{id}/instances", GetChildResources<ResourceType_Study, ResourceType_Instance>);
990 Register("/series/{id}/instances", GetChildResources<ResourceType_Series, ResourceType_Instance>); 1031 Register("/series/{id}/instances", GetChildResources<ResourceType_Series, ResourceType_Instance>);
991 1032
1033 Register("/studies/{id}/patient", GetParentResource<ResourceType_Study, ResourceType_Patient>);
1034 Register("/series/{id}/patient", GetParentResource<ResourceType_Series, ResourceType_Patient>);
1035 Register("/series/{id}/study", GetParentResource<ResourceType_Series, ResourceType_Study>);
1036 Register("/instances/{id}/patient", GetParentResource<ResourceType_Instance, ResourceType_Patient>);
1037 Register("/instances/{id}/study", GetParentResource<ResourceType_Instance, ResourceType_Study>);
1038 Register("/instances/{id}/series", GetParentResource<ResourceType_Instance, ResourceType_Series>);
1039
992 Register("/patients/{id}/instances-tags", GetChildInstancesTags); 1040 Register("/patients/{id}/instances-tags", GetChildInstancesTags);
993 Register("/studies/{id}/instances-tags", GetChildInstancesTags); 1041 Register("/studies/{id}/instances-tags", GetChildInstancesTags);
994 Register("/series/{id}/instances-tags", GetChildInstancesTags); 1042 Register("/series/{id}/instances-tags", GetChildInstancesTags);
995 1043
996 Register("/instances/{id}/content/*", GetRawContent); 1044 Register("/instances/{id}/content/*", GetRawContent);