hra-api
Version:
The Human Reference Atlas (HRA) API deployed to https://apps.humanatlas.io/api/
57 lines (50 loc) • 1.57 kB
JavaScript
import { getBlocks, updateBlockDescription } from './entities/blocks.js';
import { getDatasets } from './entities/datasets.js';
import { getSections } from './entities/sections.js';
export async function getDatasetGraph(endpoint, token) {
const [blocks, sections, datasets] = await Promise.all([
getBlocks(endpoint, token),
getSections(endpoint, token),
getDatasets(endpoint, token),
]);
const donors = {};
const blockLookup = {};
for (const block of blocks) {
const donor = (donors[block.donor.uuid] = donors[block.donor.uuid] ?? block.donor);
blockLookup[block.uuid] = block;
donor.samples.push(block);
delete donor.uuid;
delete block.donor;
delete block.uuid;
}
const sectionLookup = {};
for (const section of sections) {
for (const uuid of section.__ancestors) {
if (blockLookup[uuid]) {
blockLookup[uuid].sections.push(section);
sectionLookup[section.uuid] = section;
}
}
delete section.__ancestors;
delete section.uuid;
}
for (const block of blocks) {
updateBlockDescription(block);
}
for (const dataset of datasets) {
for (const uuid of dataset.__ancestors) {
if (sectionLookup[uuid]) {
sectionLookup[uuid].datasets.push(dataset);
}
if (blockLookup[uuid]) {
blockLookup[uuid].datasets.push(dataset);
}
}
delete dataset.__ancestors;
delete dataset.uuid;
}
return {
'@context': 'https://hubmapconsortium.github.io/ccf-ontology/ccf-context.jsonld',
'@graph': Object.values(donors),
};
}