Skip to content

Commit e2143fe

Browse files
committed
use only FHIR format
1 parent caccde6 commit e2143fe

7 files changed

Lines changed: 257 additions & 231 deletions

File tree

app/aidbox/operations.py

Lines changed: 24 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import simplejson as json
22
from aiohttp import web
33

4-
from app.converter.aidbox import from_first_class_extension, to_first_class_extension
4+
from app.sdc.getters import get_launch_context, get_questionnaire_mapper
55

66
from ..sdc import (
77
assemble,
@@ -26,24 +26,14 @@
2626
@aidbox_operation(["GET"], ["Questionnaire", {"name": "id"}, "$assemble"])
2727
@prepare_args
2828
async def assemble_op(request: AidboxSdcRequest):
29-
def get_to_first_class_extension(fhir_resource):
30-
return to_first_class_extension(fhir_resource, request.aidbox_client)
31-
3229
fhir_questionnaire = (
3330
await request.fhir_client.resources("Questionnaire")
3431
.search(_id=request.route_params["id"])
3532
.get()
3633
)
37-
fce_questionnaire = await get_to_first_class_extension(fhir_questionnaire)
3834

39-
assembled_questionnaire_lazy = await assemble(
40-
request.fhir_client, fce_questionnaire, get_to_first_class_extension
41-
)
35+
assembled_questionnaire_lazy = await assemble(request.fhir_client, dict(fhir_questionnaire))
4236
assembled_questionnaire = json.loads(json.dumps(assembled_questionnaire_lazy, default=list))
43-
if request.is_fhir:
44-
assembled_questionnaire = await from_first_class_extension(
45-
assembled_questionnaire, request.aidbox_client
46-
)
4737
return web.json_response(assembled_questionnaire, dumps=json.dumps)
4838

4939

@@ -57,16 +47,10 @@ async def constraint_check_operation(request: AidboxSdcRequest):
5747
)
5848
env = await parameter_to_env(client, request.resource, request.is_fhir)
5949

60-
fce_questionnaire = (
61-
await to_first_class_extension(env["Questionnaire"], request.aidbox_client)
62-
if request.is_fhir
63-
else env["Questionnaire"]
64-
)
65-
6650
return web.json_response(
6751
await constraint_check(
6852
client,
69-
fce_questionnaire,
53+
env["Questionnaire"],
7054
env,
7155
legacy_behavior=settings.CONSTRAINT_LEGACY_BEHAVIOR,
7256
),
@@ -84,12 +68,7 @@ async def get_questionnaire_context_operation(request: AidboxSdcRequest):
8468
)
8569
env = await parameter_to_env(client, request.resource, request.is_fhir)
8670

87-
fce_questionnaire = (
88-
await to_first_class_extension(env["Questionnaire"], request.aidbox_client)
89-
if request.is_fhir
90-
else env["Questionnaire"]
91-
)
92-
result = await get_questionnaire_context(client, fce_questionnaire, env)
71+
result = await get_questionnaire_context(client, env["Questionnaire"], env)
9372

9473
return web.json_response(result, dumps=json.dumps)
9574

@@ -106,44 +85,36 @@ async def extract_questionnaire_operation(request: AidboxSdcRequest):
10685
if resource["resourceType"] == "QuestionnaireResponse":
10786
env = {}
10887
env_questionnaire_response = resource
109-
fhir_questionnaire = (
88+
questionnaire = (
11089
await request.fhir_client.resources("Questionnaire")
11190
.search(_id=resource["questionnaire"])
11291
.get()
11392
)
114-
fce_questionnaire = await to_first_class_extension(
115-
fhir_questionnaire, request.aidbox_client
116-
)
117-
env_questionnaire = fhir_questionnaire if request.is_fhir else fce_questionnaire
11893
elif resource["resourceType"] == "Parameters":
11994
env = await parameter_to_env(client, resource, request.is_fhir)
12095
if "Questionnaire" not in env:
12196
raise MissingParamOperationOutcome("`Questionnaire` parameter is required")
12297
if "QuestionnaireResponse" not in env:
12398
raise MissingParamOperationOutcome("`QuestionnaireResponse` parameter is required")
12499

125-
fce_questionnaire = (
126-
await to_first_class_extension(env["Questionnaire"], request.aidbox_client)
127-
if request.is_fhir
128-
else env["Questionnaire"]
129-
)
130-
env_questionnaire = env["Questionnaire"]
100+
questionnaire = env["Questionnaire"]
131101
env_questionnaire_response = env["QuestionnaireResponse"]
132102

103+
mapper_refs = get_questionnaire_mapper(questionnaire.get("extension", []))
133104
mappings = [
134-
await request.aidbox_client.resources("Mapping").search(_id=m["id"]).get()
135-
for m in fce_questionnaire.get("mapping", [])
105+
await request.aidbox_client.resources("Mapping").search(_id=ref["reference"].split("/")[-1]).get()
106+
for ref in mapper_refs
136107
]
137108

138109
context = {
139-
"Questionnaire": env_questionnaire,
110+
"Questionnaire": questionnaire,
140111
"QuestionnaireResponse": env_questionnaire_response,
141112
**env,
142113
}
143114

144115
await constraint_check(
145116
client,
146-
fce_questionnaire,
117+
questionnaire,
147118
context,
148119
legacy_behavior=settings.CONSTRAINT_LEGACY_BEHAVIOR,
149120
)
@@ -162,23 +133,19 @@ async def extract_questionnaire_instance_operation(request: AidboxSdcRequest):
162133
request.client,
163134
get_external_fhir_base_url_from_resource(resource, request.is_fhir),
164135
)
165-
fhir_questionnaire = (
136+
questionnaire = (
166137
await request.fhir_client.resources("Questionnaire")
167138
.search(_id=request.route_params["id"])
168139
.get()
169140
)
170-
fce_questionnaire = await to_first_class_extension(fhir_questionnaire, request.aidbox_client)
171-
env_questionnaire = fhir_questionnaire if request.is_fhir else fce_questionnaire
172141

173142
return web.json_response(
174143
await extract_questionnaire_instance(
175144
request.aidbox_client,
176145
extract_client,
177-
fce_questionnaire,
178-
env_questionnaire,
146+
dict(questionnaire),
179147
resource,
180148
get_extract_services(request.request["app"]),
181-
request.is_fhir,
182149
),
183150
dumps=json.dumps,
184151
)
@@ -187,17 +154,15 @@ async def extract_questionnaire_instance_operation(request: AidboxSdcRequest):
187154
async def extract_questionnaire_instance(
188155
aidbox_client,
189156
extract_client,
190-
fce_questionnaire,
191-
env_questionnaire,
157+
questionnaire,
192158
resource,
193159
extract_services,
194-
is_fhir,
195160
):
196161
if resource["resourceType"] == "QuestionnaireResponse":
197162
env = {}
198163
env_questionnaire_response = extract_client.resource("QuestionnaireResponse", **resource)
199164
elif resource["resourceType"] == "Parameters":
200-
env = await parameter_to_env(extract_client, resource, is_fhir)
165+
env = await parameter_to_env(extract_client, resource, True)
201166
if "QuestionnaireResponse" not in env:
202167
raise MissingParamOperationOutcome("`QuestionnaireResponse` parameter is required")
203168

@@ -207,20 +172,23 @@ async def extract_questionnaire_instance(
207172
"Either `QuestionnaireResponse` resource or Parameters containing QuestionnaireResponse are required",
208173
)
209174

210-
if "launchContext" in fce_questionnaire:
211-
validate_context(fce_questionnaire["launchContext"], env)
175+
launch_context = get_launch_context(questionnaire.get("extension", []))
176+
if launch_context:
177+
validate_context(launch_context, env)
178+
212179
context = {
213180
"QuestionnaireResponse": env_questionnaire_response,
214-
"Questionnaire": env_questionnaire,
181+
"Questionnaire": questionnaire,
215182
**env,
216183
}
184+
mapper_refs = get_questionnaire_mapper(questionnaire.get("extension", []))
217185
mappings = [
218-
await aidbox_client.resources("Mapping").search(_id=m["id"]).get()
219-
for m in fce_questionnaire.get("mapping", [])
186+
await aidbox_client.resources("Mapping").search(_id=ref["reference"].split("/")[-1]).get()
187+
for ref in mapper_refs
220188
]
221189
await constraint_check(
222190
extract_client,
223-
fce_questionnaire,
191+
questionnaire,
224192
context,
225193
legacy_behavior=settings.CONSTRAINT_LEGACY_BEHAVIOR,
226194
)

app/fhir_server/operations.py

Lines changed: 14 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
from aiohttp import web
55
from fhirpy.lib import AsyncFHIRClient
66

7-
from app.converter.fce_to_fhir import from_first_class_extension
8-
from app.converter.fhir_to_fce import to_first_class_extension
97
from app.sdc.exception import ConstraintCheckOperationOutcome
8+
from app.sdc.getters import get_launch_context
109

1110
from ..sdc import (
1211
assemble,
@@ -25,46 +24,21 @@
2524
@routes.get("/Questionnaire/{id}/$assemble")
2625
async def assemble_handler(request: web.BaseRequest):
2726
client: AsyncFHIRClient = request.app["client"]
28-
fce_converter_url = getattr(request.app["settings"], "FCE_CONVERTER_URL", None)
2927

3028
questionnaire = (
3129
await client.resources("Questionnaire").search(_id=request.match_info["id"]).get()
3230
)
3331

34-
if fce_converter_url:
35-
async with aiohttp.ClientSession() as session:
36-
37-
async def to_fce(fhir_resource):
38-
async with session.post(
39-
f"{fce_converter_url}/to-fce", json=dict(fhir_resource)
40-
) as resp:
41-
return await resp.json()
42-
43-
fce_questionnaire = await to_fce(dict(questionnaire))
44-
assembled_lazy = await assemble(client, fce_questionnaire, to_fce)
45-
assembled = json.loads(json.dumps(assembled_lazy, default=list))
46-
47-
async with session.post(f"{fce_converter_url}/to-fhir", json=assembled) as resp:
48-
return web.json_response(await resp.json())
49-
50-
async def get_to_first_class_extension(fhir_resource):
51-
return to_first_class_extension(fhir_resource)
52-
53-
assembled_questionnaire_lazy = await assemble(
54-
client, to_first_class_extension(questionnaire), get_to_first_class_extension
55-
)
32+
assembled_questionnaire_lazy = await assemble(client, dict(questionnaire))
5633
assembled_questionnaire = json.loads(json.dumps(assembled_questionnaire_lazy, default=list))
5734

58-
return web.json_response(from_first_class_extension(assembled_questionnaire))
35+
return web.json_response(assembled_questionnaire)
5936

6037

6138
@routes.post("/QuestionnaireResponse/$constraint-check")
6239
async def constraint_check_handler(request: web.BaseRequest):
6340
client = request.app["client"]
6441
env = await parameter_to_env(client, await request.json())
65-
# TODO: I believe there's a bug, it should be in FHIR format
66-
env["Questionnaire"] = to_first_class_extension(env["Questionnaire"])
67-
env["QuestionnaireResponse"] = to_first_class_extension(env["QuestionnaireResponse"])
6842

6943
return web.json_response(await constraint_check(client, env["Questionnaire"], env))
7044

@@ -75,7 +49,7 @@ async def get_questionnaire_context_handler(request: web.BaseRequest):
7549
env = await parameter_to_env(client, await request.json())
7650

7751
return web.json_response(
78-
await get_questionnaire_context(client, to_first_class_extension(env["Questionnaire"]), env)
52+
await get_questionnaire_context(client, env["Questionnaire"], env)
7953
)
8054

8155

@@ -92,7 +66,6 @@ async def extract_questionnaire_handler(request: web.BaseRequest):
9266
)
9367
elif resource["resourceType"] == "Parameters":
9468
env = await parameter_to_env(client, resource)
95-
# TODO: Use FHIR spec questionnaire
9669
questionnaire = env.get("Questionnaire")
9770
questionnaire_response = env.get("QuestionnaireResponse")
9871

@@ -119,14 +92,14 @@ async def extract_questionnaire_handler(request: web.BaseRequest):
11992
]
12093
)
12194
jute_templates.append(json.loads(template_string))
122-
# TODO: I believe there's a bug, it should be in FHIR
95+
12396
context = {
124-
"Questionnaire": to_first_class_extension(questionnaire),
125-
"QuestionnaireResponse": to_first_class_extension(questionnaire_response),
97+
"Questionnaire": questionnaire,
98+
"QuestionnaireResponse": questionnaire_response,
12699
**env,
127100
}
128101

129-
await constraint_check(client, to_first_class_extension(questionnaire), context)
102+
await constraint_check(client, questionnaire, context)
130103
extraction_result = await extract(
131104
client, jute_templates, context, get_extract_services(request.app)
132105
)
@@ -137,19 +110,17 @@ async def extract_questionnaire_handler(request: web.BaseRequest):
137110
async def extract_questionnaire_instance_operation(request: web.BaseRequest):
138111
resource = await request.json()
139112
client = request.app["client"]
140-
fhir_questionnaire = (
113+
questionnaire = (
141114
await client.resources("Questionnaire").search(_id=request.match_info["id"]).get()
142115
)
143116
jute_templates = []
144117
structure_map_extensions = [
145118
ext
146-
for ext in fhir_questionnaire.get("extension", [])
119+
for ext in questionnaire.get("extension", [])
147120
if ext["url"]
148121
== "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-targetStructureMap"
149122
]
150123

151-
questionnaire = to_first_class_extension(fhir_questionnaire)
152-
153124
for structure_map_extension in structure_map_extensions:
154125
structure_map_id = structure_map_extension["valueCanonical"].split("/")[-1]
155126
structure_map = await client.resources("StructureMap").search(_id=structure_map_id).get()
@@ -168,9 +139,8 @@ async def extract_questionnaire_instance_operation(request: web.BaseRequest):
168139

169140
if resource["resourceType"] == "QuestionnaireResponse":
170141
questionnaire_response = client.resource("QuestionnaireResponse", **resource)
171-
# TODO: I believe there's a bug, it should be in FHIR
172142
context = {
173-
"Questionnaire": to_first_class_extension(questionnaire),
143+
"Questionnaire": questionnaire,
174144
"QuestionnaireResponse": questionnaire_response,
175145
}
176146
await constraint_check(client, questionnaire, context)
@@ -196,8 +166,9 @@ async def extract_questionnaire_instance_operation(request: web.BaseRequest):
196166
questionnaire_response = client.resource(
197167
"QuestionnaireResponse", **questionnaire_response_data
198168
)
199-
if "launchContext" in questionnaire:
200-
validate_context(questionnaire["launchContext"], env)
169+
launch_context = get_launch_context(questionnaire.get("extension", []))
170+
if launch_context:
171+
validate_context(launch_context, env)
201172
context = {
202173
"QuestionnaireResponse": questionnaire_response,
203174
"Questionnaire": questionnaire,
@@ -227,7 +198,6 @@ async def populate_questionnaire_handler(request: web.BaseRequest):
227198
env = await parameter_to_env(client, body)
228199
questionnaire_data = env["Questionnaire"]
229200
if not questionnaire_data:
230-
# TODO: return OperationOutcome
231201
return web.json_response(
232202
{
233203
"error": "bad_request",

0 commit comments

Comments
 (0)