import { BotEvent, MedplumClient } from '@medplum/core'; import { StructureDefinition, Practitioner } from '@medplum/fhirtypes'; export async function handler(medplum: MedplumClient, event: BotEvent): Promise { async function createYearsOfExperienceExtension(): Promise { const extensionDefinition: StructureDefinition = { resourceType: 'StructureDefinition', url: 'http://example.com/fhir/StructureDefinition/years-of-experience', name: 'YearsOfExperience', title: 'Years of Experience', status: 'active', fhirVersion: '4.0.1', kind: 'complex-type', abstract: false, type: 'Extension', baseDefinition: 'http://hl7.org/fhir/StructureDefinition/Extension', derivation: 'constraint', context: [ { type: 'element', expression: 'Practitioner' } ], differential: { element: [ { id: 'Extension', path: 'Extension', definition: 'Years of experience for a practitioner' }, { id: 'Extension.url', path: 'Extension.url', fixedUri: 'http://example.com/fhir/StructureDefinition/years-of-experience' }, { id: 'Extension.value[x]', path: 'Extension.value[x]', min: 1, type: [ { code: 'integer' } ] } ] } }; try { const createdExtension = await medplum.createResource(extensionDefinition); console.log('Years of Experience Extension created:', createdExtension); return createdExtension; } catch (error) { console.error('Error creating Years of Experience Extension:', error); throw error; } } async function createPractitionerProfile(): Promise { const practitionerProfile: StructureDefinition = { resourceType: 'StructureDefinition', url: 'http://example.com/fhir/StructureDefinition/practitioner-with-experience', name: 'PractitionerWithExperience', title: 'Practitioner With Years of Experience', status: 'active', fhirVersion: '4.0.1', kind: 'resource', abstract: false, type: 'Practitioner', baseDefinition: 'http://hl7.org/fhir/StructureDefinition/Practitioner', derivation: 'constraint', differential: { element: [ { id: 'Practitioner', path: 'Practitioner' }, { id: 'Practitioner.extension', path: 'Practitioner.extension', slicing: { discriminator: [ { type: 'value', path: 'url' } ], rules: 'open' } }, { id: 'Practitioner.extension:yearsOfExperience', path: 'Practitioner.extension', sliceName: 'yearsOfExperience', min: 0, max: '1', type: [ { code: 'Extension', profile: ['http://example.com/fhir/StructureDefinition/years-of-experience'] } ] } ] } }; try { const createdProfile = await medplum.createResource(practitionerProfile); console.log('Practitioner Profile created:', createdProfile); return createdProfile; } catch (error) { console.error('Error creating Practitioner Profile:', error); throw error; } } async function createPractitionerWithProfile(yearsOfExperience: number): Promise { const practitioner: Practitioner = { resourceType: 'Practitioner', meta: { profile: ['http://example.com/fhir/StructureDefinition/practitioner-with-experience'] }, name: [ { family: 'Smith', given: ['John'] } ], extension: [ { url: 'http://example.com/fhir/StructureDefinition/years-of-experience', valueInteger: yearsOfExperience } ] }; try { const createdPractitioner = await medplum.createResource(practitioner); console.log('Practitioner created:', createdPractitioner); return createdPractitioner; } catch (error) { console.error('Error creating Practitioner:', error); throw error; } } // Main execution try { // First, create the Years of Experience Extension await createYearsOfExperienceExtension(); // Then, create the Practitioner Profile await createPractitionerProfile(); // Finally, create a Practitioner using the new profile const newPractitioner = await createPractitionerWithProfile(10); // 10 years of experience return newPractitioner; } catch (error) { console.error('Error in bot execution:', error); throw error; } }