Skip to content
This repository has been archived by the owner on Apr 13, 2023. It is now read-only.

Commit

Permalink
fix: bad substitution in absolute URL refs that match the server url (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
carvantes committed May 4, 2021
1 parent 1d09f48 commit 9974257
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/regExpressions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@ export const captureVersionIdRegExp = /\w+\/[-\w+]+\/_history\/(\w+)/;
// http://hl7.org/fhir/references.html#regex
// Exp. https://API_URL.com/fhir/Patient/14/_history/1
// match groups = [https://API_URL.com/fhir/Patient/14, https://API_URL.com/fhir/, Patient, 14, 1]
export const captureFullUrlParts = /(http|https:\/\/[(A-Za-z0-9_\-\\.:%$)*/]+)?(Account|ActivityDefinition|AdverseEvent|AllergyIntolerance|Appointment|AppointmentResponse|AuditEvent|Basic|Binary|BiologicallyDerivedProduct|BodyStructure|Bundle|CapabilityStatement|CarePlan|CareTeam|CatalogEntry|ChargeItem|ChargeItemDefinition|Claim|ClaimResponse|ClinicalImpression|CodeSystem|Communication|CommunicationRequest|CompartmentDefinition|Composition|ConceptMap|Condition|Consent|Contract|Coverage|CoverageEligibilityRequest|CoverageEligibilityResponse|DetectedIssue|Device|DeviceDefinition|DeviceMetric|DeviceRequest|DeviceUseStatement|DiagnosticReport|DocumentManifest|DocumentReference|EffectEvidenceSynthesis|Encounter|Endpoint|EnrollmentRequest|EnrollmentResponse|EpisodeOfCare|EventDefinition|Evidence|EvidenceVariable|ExampleScenario|ExplanationOfBenefit|FamilyMemberHistory|Flag|Goal|GraphDefinition|Group|GuidanceResponse|HealthcareService|ImagingStudy|Immunization|ImmunizationEvaluation|ImmunizationRecommendation|ImplementationGuide|InsurancePlan|Invoice|Library|Linkage|List|Location|Measure|MeasureReport|Media|Medication|MedicationAdministration|MedicationDispense|MedicationKnowledge|MedicationRequest|MedicationStatement|MedicinalProduct|MedicinalProductAuthorization|MedicinalProductContraindication|MedicinalProductIndication|MedicinalProductIngredient|MedicinalProductInteraction|MedicinalProductManufactured|MedicinalProductPackaged|MedicinalProductPharmaceutical|MedicinalProductUndesirableEffect|MessageDefinition|MessageHeader|MolecularSequence|NamingSystem|NutritionOrder|Observation|ObservationDefinition|OperationDefinition|OperationOutcome|Organization|OrganizationAffiliation|Patient|PaymentNotice|PaymentReconciliation|Person|PlanDefinition|Practitioner|PractitionerRole|Procedure|Provenance|Questionnaire|QuestionnaireResponse|RelatedPerson|RequestGroup|ResearchDefinition|ResearchElementDefinition|ResearchStudy|ResearchSubject|RiskAssessment|RiskEvidenceSynthesis|Schedule|SearchParameter|ServiceRequest|Slot|Specimen|SpecimenDefinition|StructureDefinition|StructureMap|Subscription|Substance|SubstanceNucleicAcid|SubstancePolymer|SubstanceProtein|SubstanceReferenceInformation|SubstanceSourceMaterial|SubstanceSpecification|SupplyDelivery|SupplyRequest|Task|TerminologyCapabilities|TestReport|TestScript|ValueSet|VerificationResult|VisionPrescription)\/([A-Za-z0-9\-.]{1,64})(\/_history\/[A-Za-z0-9\-.]{1,64})?/;
export const captureFullUrlParts = /((?:http|https):\/\/[(A-Za-z0-9_\-\\.:%$)*/]+)?(Account|ActivityDefinition|AdverseEvent|AllergyIntolerance|Appointment|AppointmentResponse|AuditEvent|Basic|Binary|BiologicallyDerivedProduct|BodyStructure|Bundle|CapabilityStatement|CarePlan|CareTeam|CatalogEntry|ChargeItem|ChargeItemDefinition|Claim|ClaimResponse|ClinicalImpression|CodeSystem|Communication|CommunicationRequest|CompartmentDefinition|Composition|ConceptMap|Condition|Consent|Contract|Coverage|CoverageEligibilityRequest|CoverageEligibilityResponse|DetectedIssue|Device|DeviceDefinition|DeviceMetric|DeviceRequest|DeviceUseStatement|DiagnosticReport|DocumentManifest|DocumentReference|EffectEvidenceSynthesis|Encounter|Endpoint|EnrollmentRequest|EnrollmentResponse|EpisodeOfCare|EventDefinition|Evidence|EvidenceVariable|ExampleScenario|ExplanationOfBenefit|FamilyMemberHistory|Flag|Goal|GraphDefinition|Group|GuidanceResponse|HealthcareService|ImagingStudy|Immunization|ImmunizationEvaluation|ImmunizationRecommendation|ImplementationGuide|InsurancePlan|Invoice|Library|Linkage|List|Location|Measure|MeasureReport|Media|Medication|MedicationAdministration|MedicationDispense|MedicationKnowledge|MedicationRequest|MedicationStatement|MedicinalProduct|MedicinalProductAuthorization|MedicinalProductContraindication|MedicinalProductIndication|MedicinalProductIngredient|MedicinalProductInteraction|MedicinalProductManufactured|MedicinalProductPackaged|MedicinalProductPharmaceutical|MedicinalProductUndesirableEffect|MessageDefinition|MessageHeader|MolecularSequence|NamingSystem|NutritionOrder|Observation|ObservationDefinition|OperationDefinition|OperationOutcome|Organization|OrganizationAffiliation|Patient|PaymentNotice|PaymentReconciliation|Person|PlanDefinition|Practitioner|PractitionerRole|Procedure|Provenance|Questionnaire|QuestionnaireResponse|RelatedPerson|RequestGroup|ResearchDefinition|ResearchElementDefinition|ResearchStudy|ResearchSubject|RiskAssessment|RiskEvidenceSynthesis|Schedule|SearchParameter|ServiceRequest|Slot|Specimen|SpecimenDefinition|StructureDefinition|StructureMap|Subscription|Substance|SubstanceNucleicAcid|SubstancePolymer|SubstanceProtein|SubstanceReferenceInformation|SubstanceSourceMaterial|SubstanceSpecification|SupplyDelivery|SupplyRequest|Task|TerminologyCapabilities|TestReport|TestScript|ValueSet|VerificationResult|VisionPrescription)\/([A-Za-z0-9\-.]{1,64})(\/_history\/[A-Za-z0-9\-.]{1,64})?/;
export const captureIdFromUrn = /(urn:uuid:|urn:oid:)([\w-]+)+/;
81 changes: 80 additions & 1 deletion src/router/bundle/bundleParser.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -513,7 +513,7 @@ describe('parseResource', () => {
],
},
subject: {
reference: 'Observation/47135b80-b721-430b-9d4b-1557edc64947',
reference: 'Patient/47135b80-b721-430b-9d4b-1557edc64947',
},
},
fullUrl: 'https://API_URL.com/Observation/3',
Expand Down Expand Up @@ -769,6 +769,85 @@ describe('parseResource', () => {
expect(actualRequests).toEqual(expectedRequests);
});

test('POST with absolute URL references that match the server url', async () => {
const bundleRequestJson = {
resourceType: 'Bundle',
type: 'transaction',
entry: [
{
resource: {
resourceType: 'Observation',
status: 'final',
code: {
coding: [
{
code: 'LQA',
display: 'display value for LQA',
},
],
},
subject: {
reference: `${serverUrl}/Patient/111`,
},
device: {
reference: `${serverUrl}/Device/222`,
},
effectiveDateTime: '2021-01-09T20:00:06Z',
valueQuantity: {
unit: 'cm',
value: 170,
},
},
request: {
method: 'POST',
url: 'Observation',
},
},
],
};

const batchReadWriteRequest = await BundleParser.parseResource(
bundleRequestJson,
DynamoDbDataService,
serverUrl,
);
expect(batchReadWriteRequest).toHaveLength(1);
expect(batchReadWriteRequest[0]).toMatchInlineSnapshot(
{ id: expect.stringMatching(uuidRegExp) },
`
Object {
"fullUrl": "",
"id": StringMatching /\\\\w\\{8\\}-\\\\w\\{4\\}-\\\\w\\{4\\}-\\\\w\\{4\\}-\\\\w\\{12\\}/,
"operation": "create",
"resource": Object {
"code": Object {
"coding": Array [
Object {
"code": "LQA",
"display": "display value for LQA",
},
],
},
"device": Object {
"reference": "Device/222",
},
"effectiveDateTime": "2021-01-09T20:00:06Z",
"resourceType": "Observation",
"status": "final",
"subject": Object {
"reference": "Patient/111",
},
"valueQuantity": Object {
"unit": "cm",
"value": 170,
},
},
"resourceType": "Observation",
}
`,
);
});

test('POST with missing fullUrl and relative references', async () => {
const bundleRequestJson = {
resourceType: 'Bundle',
Expand Down
2 changes: 1 addition & 1 deletion src/router/bundle/bundleParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ export default class BundleParser {
set(
requestWithRef,
`resource.${reference.referencePath}`,
`${requestWithRef.resourceType}/${reference.id}`,
`${reference.resourceType}/${reference.id}`,
);
referenceIsFound = true;
}
Expand Down

0 comments on commit 9974257

Please sign in to comment.