-
Notifications
You must be signed in to change notification settings - Fork 324
/
structuredefinitions.ts
72 lines (67 loc) · 3.02 KB
/
structuredefinitions.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import { readJson } from '@medplum/definitions';
import { Bundle, BundleEntry, Resource, StructureDefinition } from '@medplum/fhirtypes';
import { getDatabasePool } from '../database';
import { Repository, getSystemRepo } from '../fhir/repo';
import { globalLogger } from '../logger';
import { r4ProjectId } from '../seed';
import { RebuildOptions, buildRebuildOptions } from './common';
/**
* Creates all StructureDefinition resources.
* @param options - Optional options for how rebuild should be done.
*/
export async function rebuildR4StructureDefinitions(options?: Partial<RebuildOptions>): Promise<void> {
const rebuildOptions = buildRebuildOptions(options);
const client = getDatabasePool();
await client.query(`DELETE FROM "StructureDefinition" WHERE "projectId" = $1`, [r4ProjectId]);
const systemRepo = getSystemRepo();
if (rebuildOptions.parallel) {
await Promise.all([
createStructureDefinitionsForBundleParallel(systemRepo, readJson('fhir/r4/profiles-resources.json') as Bundle),
createStructureDefinitionsForBundleParallel(systemRepo, readJson('fhir/r4/profiles-medplum.json') as Bundle),
createStructureDefinitionsForBundleParallel(systemRepo, readJson('fhir/r4/profiles-others.json') as Bundle),
]);
} else {
await createStructureDefinitionsForBundleSerial(systemRepo, readJson('fhir/r4/profiles-resources.json') as Bundle);
await createStructureDefinitionsForBundleSerial(systemRepo, readJson('fhir/r4/profiles-medplum.json') as Bundle);
await createStructureDefinitionsForBundleSerial(systemRepo, readJson('fhir/r4/profiles-others.json') as Bundle);
}
}
async function createStructureDefinitionsForBundleParallel(
systemRepo: Repository,
structureDefinitions: Bundle
): Promise<void> {
const promises = [];
for (const entry of structureDefinitions.entry as BundleEntry[]) {
const resource = entry.resource as Resource;
if (resource.resourceType === 'StructureDefinition' && resource.name) {
promises.push(createAndLogStructureDefinition(systemRepo, resource));
}
}
await Promise.all(promises);
}
async function createStructureDefinitionsForBundleSerial(
systemRepo: Repository,
structureDefinitions: Bundle
): Promise<void> {
for (const entry of structureDefinitions.entry as BundleEntry[]) {
const resource = entry.resource as Resource;
if (resource.resourceType === 'StructureDefinition' && resource.name) {
await createAndLogStructureDefinition(systemRepo, resource);
}
}
}
async function createAndLogStructureDefinition(systemRepo: Repository, resource: StructureDefinition): Promise<void> {
globalLogger.debug('[StructureDefinition] creation started: ' + resource.name);
const result = await systemRepo.createResource<StructureDefinition>({
...resource,
meta: {
...resource.meta,
project: r4ProjectId,
lastUpdated: undefined,
versionId: undefined,
},
text: undefined,
differential: undefined,
});
globalLogger.debug(`[StructureDefinition] creation finished: ${result.name} - ID: ${result.id}`);
}