hra-api
Version:
The Human Reference Atlas (HRA) API deployed to https://apps.humanatlas.io/api/
74 lines (67 loc) • 2.65 kB
JavaScript
import { convertToJsonLd } from 'hra-rui-locations-processor/src/core/main.js';
import { normalizeRegistration } from 'hra-rui-locations-processor/src/core/normalizer.js';
import { fetchAllRows } from '../utils/atlas-d2k-fetch.js';
const ENDPOINT = 'https://www.atlas-d2k.org';
const EXTRACTION_SITES = `${ENDPOINT}/ermrest/catalog/2/attribute/Gene_Expression:HRA_3D_Coordinate/RID,File_URL`;
const ENTITIES = `${ENDPOINT}/ermrest/catalog/2/entity/Gene_Expression:Specimen/!(HRA_3D_Coordinate::null::)`;
const ENTITY_LINK = `${ENDPOINT}/chaise/record/#2/Gene_Expression:Specimen/RID=`;
const ENTITY_ID_PREFIX = `${ENDPOINT}/id/`;
const EXTRACTION_SITE_FILE_PATH = 'File_URL';
const ENTITY_EXTRACTION_SITE_RID = 'HRA_3D_Coordinate';
const CONSORTIUM = 'Consortium';
const CONSORTIUM_LOOKUP = {
GUDMAP: 'd7ea2910-7857-4f98-841b-895e7cd71897',
};
async function reformatResponse(entries) {
const registrations = entries.map((entry) => {
const ageStr = entry.Stage_Detail?.split(' ')[0] ?? undefined;
return {
consortium_name: entry[CONSORTIUM],
provider_name: entry[CONSORTIUM],
provider_uuid: CONSORTIUM_LOOKUP[entry[CONSORTIUM]] ?? entry[CONSORTIUM],
defaults: {
id: ENTITY_ID_PREFIX,
link: ENDPOINT,
},
donors: [
{
id: `${ENTITY_ID_PREFIX}${entry.RID}#Donor`,
sex: entry.Sex,
age: ageStr ? Number(ageStr) : undefined,
link: `${ENTITY_LINK}${entry.RID}`,
samples: [
{
id: `${ENTITY_ID_PREFIX}${entry.RID}`,
rui_location: entry.rui_location,
},
],
},
],
};
});
return convertToJsonLd(await normalizeRegistration(registrations), '', '');
}
export async function atlasD2kRegistrations() {
// Query for all extraction site information
const rows = await fetchAllRows(EXTRACTION_SITES, 500);
const coordLookup = {};
for (const row of rows) {
const registryFileURL = row[EXTRACTION_SITE_FILE_PATH];
if (registryFileURL) {
// Fetch HRA extraction site
const response = await fetch(`${ENDPOINT}${registryFileURL}`);
if (response.status === 200) {
coordLookup[row.RID] = await response.json();
}
}
}
// Query for all entries that have an extraction site
const entries = await fetchAllRows(ENTITIES, 500);
for (const entry of entries) {
if (entry[ENTITY_EXTRACTION_SITE_RID]) {
entry.rui_location = coordLookup[entry[ENTITY_EXTRACTION_SITE_RID]] ?? undefined;
}
}
// Reformat the response to standard rui_locations.jsonld format
return await reformatResponse(entries);
}