Skip to content

Commit

Permalink
Clean up FetchCARIN file and getReferences utility function
Browse files Browse the repository at this point in the history
  • Loading branch information
daniellrgn committed Feb 13, 2025
1 parent 5d8fb86 commit 7120dda
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 108 deletions.
120 changes: 23 additions & 97 deletions src/lib/components/app/FetchCARINBB.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,7 @@
import { getReferences } from '$lib/utils/util';
import { authorize } from '$lib/utils/sofClient.js';
import { createEventDispatcher, onMount } from 'svelte';
import type { Resource } from 'fhir/r4';
// For "quick sample" in demo
import { EXAMPLE_IPS, IPS_DEFAULT } from '$lib/config';
import type { IPSRetrieveEvent } from '$lib/utils/types';
import type { BundleEntry, Resource } from 'fhir/r4';
const authDispatch = createEventDispatcher<{'sof-auth-init': SOFAuthEvent; 'sof-auth-fail': SOFAuthEvent}>();
const resourceDispatch = createEventDispatcher<{'update-resources': ResourceRetrieveEvent}>();
Expand Down Expand Up @@ -61,30 +57,28 @@
let retrievedResources = {} as {[key: string]: boolean};
while (resources.length > 0 && depth > 0) {
for (let resource of resources) {
let retrieved = `${resource.resourceType}/${resource.id}`;
retrievedResources[retrieved] = true;
let refs = getReferences(resource) as string[];
for (let i=0; i<refs.length; i++) {
referenceMap[refs[i]] = true;
}
}
let referencedResources = Object.keys(referenceMap);
let referencedResourcesToFetch = referencedResources.filter(x => {
return (!(x in retrievedResources) && CARIN_RESOURCES.indexOf(x.split('/')[0]) >= 0);
});
resources = (await Promise.allSettled(referencedResourcesToFetch.map(reference => {
return fetch(`${sofHost!.url}/${reference}`, {
headers: { Authorization: `Bearer ${token}` }
})
.then(response => response.json());
}))).filter(x => x.status == "fulfilled").map(x => x.value);
allResources = allResources.concat(...resources);
referenceMap = {};
depth--;
let retrieved = `${resource.resourceType}/${resource.id}`;
retrievedResources[retrieved] = true;
let refs = getReferences(resource);
for (let i=0; i<refs.length; i++) {
referenceMap[refs[i]] = true;
}
}
let referencedResources = Object.keys(referenceMap);
let referencedResourcesToFetch = referencedResources.filter(x => {
return (!(x in retrievedResources) && CARIN_RESOURCES.indexOf(x.split('/')[0]) >= 0);
});
resources = (await Promise.allSettled(referencedResourcesToFetch.map(reference => {
return fetch(`${sofHost!.url}/${reference}`, {
headers: { Authorization: `Bearer ${token}` }
}).then(response => response.json());
}))).filter(x => x.status == "fulfilled").map(x => x.value);
allResources = allResources.concat(...resources);
referenceMap = {};
depth--;
}
return allResources;
}
}
onMount(async function() {
let method = sessionStorage.getItem('AUTH_METHOD');
Expand Down Expand Up @@ -139,8 +133,8 @@
.then(data => {
console.log(`${resourceType} Data:`, data);
if (data.resourceType === 'Bundle') {
return data.entry.map(e => e.resource);
} else if (CARIN_RESOURCES.contains(data.resourceType)) {
return data.entry.map((e: BundleEntry) => e.resource);
} else if (CARIN_RESOURCES.includes(data.resourceType)) {
return [data];
}
throw Error (`Unexpected resource type ${data.resourceType}`);
Expand Down Expand Up @@ -170,59 +164,6 @@
}
}
async function fetchData() {
processing = true;
try {
let resources = await getResourcesWithReferences(1);
result.resources = resources;
console.log(resources)
processing = false;
return resourceDispatch('update-resources', result);
} catch (e: any) {
console.log(e.message);
fetchError = e.message;
processing = false;
endSession();
}
}
// Demo quick sample loader
let defaultUrl = EXAMPLE_IPS[IPS_DEFAULT];
const ipsDispatch = createEventDispatcher<{'ips-retrieved': IPSRetrieveEvent}>();
let ipsResult: IPSRetrieveEvent = {
ips: undefined
};
async function quickLoad() {
fetchError = "";
loadingSample = true;
try {
let content;
let hostname;
const contentResponse = await fetch(defaultUrl!, {
headers: { accept: 'application/fhir+json' }
}).then(function(response) {
if (!response.ok) {
// make the promise be rejected if we didn't get a 2xx response
throw new Error("Unable to fetch IPS", {cause: response});
} else {
return response;
}
});
content = await contentResponse.json();
hostname = defaultUrl?.hostname;
loadingSample = false
ipsResult = {
ips: content,
source: hostname
};
ipsDispatch('ips-retrieved', ipsResult);
} catch (e) {
loadingSample = false;
console.log('Failed', e);
fetchError = "Error preparing IPS";
}
}
</script>
<form on:submit|preventDefault={() => prepareIps()}>
<FormGroup>
Expand All @@ -247,21 +188,6 @@
{/if}
</Button>
</Col>
<Col xs="auto">
<Button
color="secondary"
outline
style="width:fit-content"
disabled={processing || loadingSample}
type="button"
on:click={() => quickLoad()}>
{#if !loadingSample}
Quick Sample
{:else}
Loading...
{/if}
</Button>
</Col>
{#if processing || loadingSample}
<Col xs="auto" class="d-flex align-items-center px-0">
<Spinner color="primary" type="border" size="md"/>
Expand Down
18 changes: 7 additions & 11 deletions src/lib/utils/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,25 +59,21 @@ export function download(filename:string, text:string) {
document.body.removeChild(element);
}

export function getReferences(resource: Resource, references: Resource[] | undefined): Resource[] | undefined {
let key = "reference";
export function getReferences(resourceContent: any, references: any[] | undefined=undefined): string[]{
let referenceFieldKey = "reference";
if (references === undefined) {
references = [];
}
if (typeof resource === "object") {
for (let k in resource) {
if (typeof resourceContent === "object") {
for (let k in resourceContent) {
if (k !== "subject" && k !== "patient") {
if (k === key && references !== undefined) {
references.push(resource[k]);
if (k === referenceFieldKey && references !== undefined) {
references.push(resourceContent[k]);
} else {
references = getReferences(resource[k], references);
references = getReferences(resourceContent[k], references);
}
}
}
} else if (resource instanceof Array) {
for (let i=0; i < resource.length; i++) {
references = getReferences(resource[i], references);
}
}
return references;
}
Expand Down

0 comments on commit 7120dda

Please sign in to comment.