comparison OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp @ 2868:abce036683cd

sharing code within OrthancRestAnonymizeModify
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 08 Oct 2018 17:05:19 +0200
parents 251614c2edac
children 2bd87764709c
comparison
equal deleted inserted replaced
2867:251614c2edac 2868:abce036683cd
55 uint64_t seq = context.GetIndex().IncrementGlobalSequence(GlobalProperty_AnonymizationSequence); 55 uint64_t seq = context.GetIndex().IncrementGlobalSequence(GlobalProperty_AnonymizationSequence);
56 return "Anonymized" + boost::lexical_cast<std::string>(seq); 56 return "Anonymized" + boost::lexical_cast<std::string>(seq);
57 } 57 }
58 58
59 59
60 static int GetPriority(const Json::Value& request) 60 static void ParseModifyRequest(Json::Value& request,
61 { 61 DicomModification& target,
62 static const char* PRIORITY = "Priority"; 62 const RestApiPostCall& call)
63 63 {
64 if (request.isMember(PRIORITY)) 64 // curl http://localhost:8042/series/95a6e2bf-9296e2cc-bf614e2f-22b391ee-16e010e0/modify -X POST -d '{"Replace":{"InstitutionName":"My own clinic"},"Priority":9}'
65 { 65
66 if (request[PRIORITY].type() == Json::intValue) 66 if (call.ParseJsonRequest(request))
67 { 67 {
68 return request[PRIORITY].asInt(); 68 target.ParseModifyRequest(request);
69 }
70 else
71 {
72 LOG(ERROR) << "Field \"" << PRIORITY << "\" of a modification request should be an integer";
73 throw OrthancException(ErrorCode_BadFileFormat);
74 }
75 } 69 }
76 else 70 else
77 { 71 {
78 return 0; // Default priority
79 }
80 }
81
82
83 static void ParseModifyRequest(DicomModification& target,
84 int& priority,
85 const RestApiPostCall& call)
86 {
87 // curl http://localhost:8042/series/95a6e2bf-9296e2cc-bf614e2f-22b391ee-16e010e0/modify -X POST -d '{"Replace":{"InstitutionName":"My own clinic"},"Priority":9}'
88
89 Json::Value request;
90 if (call.ParseJsonRequest(request))
91 {
92 priority = GetPriority(request);
93 target.ParseModifyRequest(request);
94 }
95 else
96 {
97 throw OrthancException(ErrorCode_BadFileFormat); 72 throw OrthancException(ErrorCode_BadFileFormat);
98 } 73 }
99 } 74 }
100 75
101 76
102 static void ParseAnonymizationRequest(DicomModification& target, 77 static void ParseAnonymizationRequest(Json::Value& request,
103 int& priority, 78 DicomModification& target,
104 RestApiPostCall& call) 79 RestApiPostCall& call)
105 { 80 {
106 // curl http://localhost:8042/instances/6e67da51-d119d6ae-c5667437-87b9a8a5-0f07c49f/anonymize -X POST -d '{"Replace":{"PatientName":"hello","0010-0020":"world"},"Keep":["StudyDescription", "SeriesDescription"],"KeepPrivateTags": true,"Remove":["Modality"]}' > Anonymized.dcm 81 // curl http://localhost:8042/instances/6e67da51-d119d6ae-c5667437-87b9a8a5-0f07c49f/anonymize -X POST -d '{"Replace":{"PatientName":"hello","0010-0020":"world"},"Keep":["StudyDescription", "SeriesDescription"],"KeepPrivateTags": true,"Remove":["Modality"]}' > Anonymized.dcm
107 82
108 Json::Value request;
109 if (call.ParseJsonRequest(request) && 83 if (call.ParseJsonRequest(request) &&
110 request.isObject()) 84 request.isObject())
111 { 85 {
112 priority = GetPriority(request);
113
114 bool patientNameReplaced; 86 bool patientNameReplaced;
115 target.ParseAnonymizationRequest(patientNameReplaced, request); 87 target.ParseAnonymizationRequest(patientNameReplaced, request);
116 88
117 if (patientNameReplaced) 89 if (patientNameReplaced)
118 { 90 {
143 modification.Apply(*modified); 115 modification.Apply(*modified);
144 modified->Answer(call.GetOutput()); 116 modified->Answer(call.GetOutput());
145 } 117 }
146 118
147 119
148 120 static void ModifyInstance(RestApiPostCall& call)
149 static void SubmitJob(std::auto_ptr<DicomModification>& modification, 121 {
150 bool isAnonymization, 122 DicomModification modification;
151 ResourceType level, 123 modification.SetAllowManualIdentifiers(true);
152 int priority, 124
153 RestApiPostCall& call) 125 Json::Value request;
126 ParseModifyRequest(request, modification, call);
127
128 if (modification.IsReplaced(DICOM_TAG_PATIENT_ID))
129 {
130 modification.SetLevel(ResourceType_Patient);
131 }
132 else if (modification.IsReplaced(DICOM_TAG_STUDY_INSTANCE_UID))
133 {
134 modification.SetLevel(ResourceType_Study);
135 }
136 else if (modification.IsReplaced(DICOM_TAG_SERIES_INSTANCE_UID))
137 {
138 modification.SetLevel(ResourceType_Series);
139 }
140 else
141 {
142 modification.SetLevel(ResourceType_Instance);
143 }
144
145 AnonymizeOrModifyInstance(modification, call);
146 }
147
148
149 static void AnonymizeInstance(RestApiPostCall& call)
150 {
151 DicomModification modification;
152 modification.SetAllowManualIdentifiers(true);
153
154 Json::Value request;
155 ParseAnonymizationRequest(request, modification, call);
156
157 AnonymizeOrModifyInstance(modification, call);
158 }
159
160
161 static void SubmitModificationJob(std::auto_ptr<DicomModification>& modification,
162 bool isAnonymization,
163 RestApiPostCall& call,
164 const Json::Value& body,
165 ResourceType level)
154 { 166 {
155 ServerContext& context = OrthancRestApi::GetContext(call); 167 ServerContext& context = OrthancRestApi::GetContext(call);
156 168
157 std::auto_ptr<ResourceModificationJob> job(new ResourceModificationJob(context)); 169 std::auto_ptr<ResourceModificationJob> job(new ResourceModificationJob(context));
158 170
159 boost::shared_ptr<ResourceModificationJob::Output> output(new ResourceModificationJob::Output(level)); 171 job->SetModification(modification.release(), level, isAnonymization);
160 job->SetModification(modification.release(), isAnonymization);
161 job->SetOutput(output);
162 job->SetOrigin(call); 172 job->SetOrigin(call);
163 job->SetDescription("REST API"); 173
164
165 context.AddChildInstances(*job, call.GetUriComponent("id", "")); 174 context.AddChildInstances(*job, call.GetUriComponent("id", ""));
166 175
167 Json::Value publicContent; 176 OrthancRestApi::GetApi(call).SubmitCommandsJob
168 if (context.GetJobsEngine().GetRegistry().SubmitAndWait 177 (call, job.release(), true /* synchronous by default */, body);
169 (publicContent, job.release(), priority))
170 {
171 Json::Value json;
172 if (output->Format(json))
173 {
174 call.GetOutput().AnswerJson(json);
175 return;
176 }
177 }
178
179 call.GetOutput().SignalError(HttpStatus_500_InternalServerError);
180 }
181
182
183
184 static void ModifyInstance(RestApiPostCall& call)
185 {
186 DicomModification modification;
187 modification.SetAllowManualIdentifiers(true);
188
189 int priority;
190 ParseModifyRequest(modification, priority, call);
191
192 if (modification.IsReplaced(DICOM_TAG_PATIENT_ID))
193 {
194 modification.SetLevel(ResourceType_Patient);
195 }
196 else if (modification.IsReplaced(DICOM_TAG_STUDY_INSTANCE_UID))
197 {
198 modification.SetLevel(ResourceType_Study);
199 }
200 else if (modification.IsReplaced(DICOM_TAG_SERIES_INSTANCE_UID))
201 {
202 modification.SetLevel(ResourceType_Series);
203 }
204 else
205 {
206 modification.SetLevel(ResourceType_Instance);
207 }
208
209 AnonymizeOrModifyInstance(modification, call);
210 }
211
212
213 static void AnonymizeInstance(RestApiPostCall& call)
214 {
215 DicomModification modification;
216 modification.SetAllowManualIdentifiers(true);
217
218 int priority;
219 ParseAnonymizationRequest(modification, priority, call);
220
221 AnonymizeOrModifyInstance(modification, call);
222 } 178 }
223 179
224 180
225 template <enum ResourceType resourceType> 181 template <enum ResourceType resourceType>
226 static void ModifyResource(RestApiPostCall& call) 182 static void ModifyResource(RestApiPostCall& call)
227 { 183 {
228 std::auto_ptr<DicomModification> modification(new DicomModification); 184 std::auto_ptr<DicomModification> modification(new DicomModification);
229 185
230 int priority; 186 Json::Value body;
231 ParseModifyRequest(*modification, priority, call); 187 ParseModifyRequest(body, *modification, call);
232 188
233 modification->SetLevel(resourceType); 189 modification->SetLevel(resourceType);
234 SubmitJob(modification, false, resourceType, priority, call); 190
191 SubmitModificationJob(modification, false /* not an anonymization */,
192 call, body, resourceType);
235 } 193 }
236 194
237 195
238 template <enum ResourceType resourceType> 196 template <enum ResourceType resourceType>
239 static void AnonymizeResource(RestApiPostCall& call) 197 static void AnonymizeResource(RestApiPostCall& call)
240 { 198 {
241 std::auto_ptr<DicomModification> modification(new DicomModification); 199 std::auto_ptr<DicomModification> modification(new DicomModification);
242 200
243 int priority; 201 Json::Value body;
244 ParseAnonymizationRequest(*modification, priority, call); 202 ParseAnonymizationRequest(body, *modification, call);
245 203
246 SubmitJob(modification, true, resourceType, priority, call); 204 SubmitModificationJob(modification, true /* anonymization */,
205 call, body, resourceType);
247 } 206 }
248 207
249 208
250 static void StoreCreatedInstance(std::string& id /* out */, 209 static void StoreCreatedInstance(std::string& id /* out */,
251 RestApiPostCall& call, 210 RestApiPostCall& call,