Mercurial > hg > orthanc
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, |