Skip to content

Commit

Permalink
Merge pull request #79 from beda-software/76-multiple-atomic-extract
Browse files Browse the repository at this point in the history
Added fullUrl unique check to $extract
  • Loading branch information
qscgyjqscgyj authored Feb 27, 2025
2 parents 3368d36 + da7688a commit 5657ea2
Show file tree
Hide file tree
Showing 3 changed files with 227 additions and 107 deletions.
8 changes: 7 additions & 1 deletion app/sdc/extract.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from aiohttp import ClientSession, web
from funcy.seqs import flatten

from .utils import check_mappers_bundles_full_url_duplicates


async def get_external_service_bundle(session, service, template, context):
async with session.post(
Expand All @@ -17,12 +19,16 @@ async def get_external_service_bundle(session, service, template, context):


async def execute_mappers_bundles(client, mappers_bundles):
flattened_mappers_bundles = list(flatten(bundle["entry"] for bundle in mappers_bundles))

check_mappers_bundles_full_url_duplicates(flattened_mappers_bundles)

not_transaction = any(bundle.get("type") != "transaction" for bundle in mappers_bundles)

result_bundle = {
"resourceType": "Bundle",
"type": "batch" if not_transaction else "transaction",
"entry": list(flatten(bundle["entry"] for bundle in mappers_bundles)),
"entry": flattened_mappers_bundles,
}

return await client.execute("/", data=result_bundle)
Expand Down
32 changes: 25 additions & 7 deletions app/sdc/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,7 @@ def get_type(item, data):
def walk_dict(d, transform):
for k, v in d.items():
if is_list(v):
d[k] = [
walk_dict(vi, transform) if is_mapping(vi) else transform(vi, k)
for vi in v
]
d[k] = [walk_dict(vi, transform) if is_mapping(vi) else transform(vi, k) for vi in v]
elif is_mapping(v):
d[k] = walk_dict(v, transform)
else:
Expand All @@ -68,9 +65,7 @@ def prepare_link_ids(questionnaire, variables):


def prepare_bundle(raw_bundle, env):
return walk_dict(
raw_bundle, lambda v, _k: resolve_string_template(v, env, encode_result=True)
)
return walk_dict(raw_bundle, lambda v, _k: resolve_string_template(v, env, encode_result=True))


def resolve_string_template(i, env, encode_result=False):
Expand Down Expand Up @@ -170,3 +165,26 @@ def validate_context(context_definition, env):
)
if len(errors) > 0:
raise ConstraintCheckOperationOutcome(errors)


def check_mappers_bundles_full_url_duplicates(flattened_mappers_bundles):
full_urls_set = set()

for bundle in flattened_mappers_bundles:
full_url = bundle.get("fullUrl")

if full_url is None:
continue

if full_url in full_urls_set:
raise ConstraintCheckOperationOutcome(
[
{
"severity": "error",
"key": "duplicate-full-url",
"human": f"Duplicate fullUrl '{full_url}' in mappers bundles",
}
]
)

full_urls_set.add(full_url)
Loading

0 comments on commit 5657ea2

Please sign in to comment.