From 8ef8ff64cc459a5e37b3d61292af392854494f37 Mon Sep 17 00:00:00 2001 From: Muchogo Date: Thu, 7 Mar 2024 15:39:59 +0300 Subject: [PATCH] chore: add observation category helper --- .../usecases/clinical/diagnostic_report.go | 10 +- pkg/clinical/usecases/clinical/observation.go | 34 ++--- .../usecases/clinical/observation_helpers.go | 129 ++++-------------- 3 files changed, 52 insertions(+), 121 deletions(-) diff --git a/pkg/clinical/usecases/clinical/diagnostic_report.go b/pkg/clinical/usecases/clinical/diagnostic_report.go index 51eb264c..c01b83c0 100644 --- a/pkg/clinical/usecases/clinical/diagnostic_report.go +++ b/pkg/clinical/usecases/clinical/diagnostic_report.go @@ -27,7 +27,7 @@ func (c *UseCasesClinicalImpl) RecordMammographyResult(ctx context.Context, inpu } // !NOTE: The terminology code used here is used TEMPORARILY. Pending discussion about how to represent BI-RADs conclusions/observation - observationOutput, err := c.RecordObservation(ctx, *observationInput, common.BenignNeoplasmOfBreastOfSkinTerminologyCode, []ObservationInputMutatorFunc{addImagingCategory}) + observationOutput, err := c.RecordObservation(ctx, *observationInput, common.BenignNeoplasmOfBreastOfSkinTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("imaging")}) if err != nil { return nil, err } @@ -50,7 +50,7 @@ func (c *UseCasesClinicalImpl) RecordBiopsy(ctx context.Context, input dto.Diagn Value: input.Findings, } - observationOutput, err := c.RecordObservation(ctx, *observationInput, common.BiopsyTerminologySystem, []ObservationInputMutatorFunc{addProcedureCategory}) + observationOutput, err := c.RecordObservation(ctx, *observationInput, common.BiopsyTerminologySystem, []ObservationInputMutatorFunc{addObservationCategory("procedure")}) if err != nil { return nil, err } @@ -71,7 +71,7 @@ func (c *UseCasesClinicalImpl) RecordMRI(ctx context.Context, input dto.Diagnost Value: input.Findings, } - observationOutput, err := c.RecordObservation(ctx, *observationInput, common.MRITerminologySystem, []ObservationInputMutatorFunc{addProcedureCategory}) + observationOutput, err := c.RecordObservation(ctx, *observationInput, common.MRITerminologySystem, []ObservationInputMutatorFunc{addObservationCategory("procedure")}) if err != nil { return nil, err } @@ -92,7 +92,7 @@ func (c *UseCasesClinicalImpl) RecordUltrasound(ctx context.Context, input dto.D Value: input.Findings, } - observationOutput, err := c.RecordObservation(ctx, *observationInput, common.BilateralConceptTerminologySystem, []ObservationInputMutatorFunc{addImagingCategory}) + observationOutput, err := c.RecordObservation(ctx, *observationInput, common.BilateralConceptTerminologySystem, []ObservationInputMutatorFunc{addObservationCategory("imaging")}) if err != nil { return nil, err } @@ -114,7 +114,7 @@ func (c *UseCasesClinicalImpl) RecordCBE(ctx context.Context, input *dto.Diagnos Value: input.Findings, } - observationOutput, err := c.RecordObservation(ctx, *observationInput, common.BreastExaminationCIELTerminologySystem, []ObservationInputMutatorFunc{addExamCategory}) + observationOutput, err := c.RecordObservation(ctx, *observationInput, common.BreastExaminationCIELTerminologySystem, []ObservationInputMutatorFunc{addObservationCategory("exam")}) if err != nil { return nil, err } diff --git a/pkg/clinical/usecases/clinical/observation.go b/pkg/clinical/usecases/clinical/observation.go index 6e61bbae..19573779 100644 --- a/pkg/clinical/usecases/clinical/observation.go +++ b/pkg/clinical/usecases/clinical/observation.go @@ -20,7 +20,7 @@ type ObservationInputMutatorFunc func(context.Context, *domain.FHIRObservationIn // RecordTemperature is used to record a patient's temperature and saves it as a FHIR observation func (c *UseCasesClinicalImpl) RecordTemperature(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - temperatureObservation, err := c.RecordObservation(ctx, input, common.TemperatureCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + temperatureObservation, err := c.RecordObservation(ctx, input, common.TemperatureCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) if err != nil { return nil, err } @@ -30,7 +30,7 @@ func (c *UseCasesClinicalImpl) RecordTemperature(ctx context.Context, input dto. // RecordMuac is used to record a patient's Muac func (c *UseCasesClinicalImpl) RecordMuac(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - muacObservation, err := c.RecordObservation(ctx, input, common.MuacCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + muacObservation, err := c.RecordObservation(ctx, input, common.MuacCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) if err != nil { return nil, err } @@ -40,7 +40,7 @@ func (c *UseCasesClinicalImpl) RecordMuac(ctx context.Context, input dto.Observa // RecordOxygenSaturation is used to record a patient's oxygen saturation func (c *UseCasesClinicalImpl) RecordOxygenSaturation(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - oxygenSaturationObservation, err := c.RecordObservation(ctx, input, common.OxygenSaturationCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + oxygenSaturationObservation, err := c.RecordObservation(ctx, input, common.OxygenSaturationCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) if err != nil { return nil, err } @@ -55,7 +55,7 @@ func (c *UseCasesClinicalImpl) GetPatientTemperatureEntries(ctx context.Context, // RecordHeight records a patient's height and saves it to fhir func (c *UseCasesClinicalImpl) RecordHeight(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - heightObservation, err := c.RecordObservation(ctx, input, common.HeightCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + heightObservation, err := c.RecordObservation(ctx, input, common.HeightCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) if err != nil { return nil, err } @@ -135,7 +135,7 @@ func (c *UseCasesClinicalImpl) PatchPatientBloodSugar(ctx context.Context, id st // RecordWeight records a patient's weight func (c *UseCasesClinicalImpl) RecordWeight(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - weightObservation, err := c.RecordObservation(ctx, input, common.WeightCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + weightObservation, err := c.RecordObservation(ctx, input, common.WeightCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) if err != nil { return nil, err } @@ -145,7 +145,7 @@ func (c *UseCasesClinicalImpl) RecordWeight(ctx context.Context, input dto.Obser // RecordViralLoad records the patient viral load func (c *UseCasesClinicalImpl) RecordViralLoad(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - viralLoadObservation, err := c.RecordObservation(ctx, input, common.ViralLoadCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + viralLoadObservation, err := c.RecordObservation(ctx, input, common.ViralLoadCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) if err != nil { return nil, err } @@ -175,7 +175,7 @@ func (c *UseCasesClinicalImpl) GetPatientViralLoad(ctx context.Context, patientI // RecordRespiratoryRate records a patient's respiratory rate func (c *UseCasesClinicalImpl) RecordRespiratoryRate(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - respiratoryRateObservation, err := c.RecordObservation(ctx, input, common.RespiratoryRateCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + respiratoryRateObservation, err := c.RecordObservation(ctx, input, common.RespiratoryRateCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) if err != nil { return nil, err } @@ -190,7 +190,7 @@ func (c *UseCasesClinicalImpl) GetPatientRespiratoryRateEntries(ctx context.Cont // RecordPulseRate records a patient's pulse rate func (c *UseCasesClinicalImpl) RecordPulseRate(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - pulseRateObservation, err := c.RecordObservation(ctx, input, common.PulseCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + pulseRateObservation, err := c.RecordObservation(ctx, input, common.PulseCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) if err != nil { return nil, err } @@ -205,7 +205,7 @@ func (c *UseCasesClinicalImpl) GetPatientPulseRateEntries(ctx context.Context, p // RecordBloodPressure records a patient's blood pressure func (c *UseCasesClinicalImpl) RecordBloodPressure(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - bloodPressureObservation, err := c.RecordObservation(ctx, input, common.BloodPressureCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + bloodPressureObservation, err := c.RecordObservation(ctx, input, common.BloodPressureCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) if err != nil { return nil, err } @@ -220,7 +220,7 @@ func (c *UseCasesClinicalImpl) GetPatientBloodPressureEntries(ctx context.Contex // RecordBMI records a patient's BMI func (c *UseCasesClinicalImpl) RecordBMI(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - bmiObservation, err := c.RecordObservation(ctx, input, common.BMICIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + bmiObservation, err := c.RecordObservation(ctx, input, common.BMICIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) if err != nil { return nil, err } @@ -235,7 +235,7 @@ func (c *UseCasesClinicalImpl) GetPatientBMIEntries(ctx context.Context, patient // RecordBloodSugar records a patient's blood sugar level (Serum glucose) func (c *UseCasesClinicalImpl) RecordBloodSugar(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - return c.RecordObservation(ctx, input, common.BloodSugarCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + return c.RecordObservation(ctx, input, common.BloodSugarCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) } // GetPatientBloodSugarEntries retrieves all blood sugar entries for a patient @@ -245,7 +245,7 @@ func (c *UseCasesClinicalImpl) GetPatientBloodSugarEntries(ctx context.Context, // RecordLastMenstrualPeriod records last menstrual period func (c *UseCasesClinicalImpl) RecordLastMenstrualPeriod(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - return c.RecordObservation(ctx, input, common.LastMenstrualPeriodCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + return c.RecordObservation(ctx, input, common.LastMenstrualPeriodCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) } // GetPatientLastMenstrualPeriodEntries retrieves all blood sugar entries for a patient @@ -255,12 +255,12 @@ func (c *UseCasesClinicalImpl) GetPatientLastMenstrualPeriodEntries(ctx context. // RecordDiastolicBloodPressure records diastolic blood pressure func (c *UseCasesClinicalImpl) RecordDiastolicBloodPressure(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - return c.RecordObservation(ctx, input, common.DiastolicBloodPressureCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + return c.RecordObservation(ctx, input, common.DiastolicBloodPressureCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) } // RecordColposcopy records colposcopy findings func (c *UseCasesClinicalImpl) RecordColposcopy(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - return c.RecordObservation(ctx, input, common.ColposcopyCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory}) + return c.RecordObservation(ctx, input, common.ColposcopyCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")}) } // RecordVIA records Visual Inspection with Acetic Acid results @@ -310,7 +310,7 @@ func (c *UseCasesClinicalImpl) RecordVIA(ctx context.Context, input dto.Observat return nil } - return c.RecordObservation(ctx, input, common.VIACIELCode, []ObservationInputMutatorFunc{addInterpretation, addLabCategory}) + return c.RecordObservation(ctx, input, common.VIACIELCode, []ObservationInputMutatorFunc{addInterpretation, addObservationCategory("laboratory")}) } // GetPatientDiastolicBloodPressureEntries retrieves all diastolic blood pressure entries for a patient @@ -552,10 +552,10 @@ func (c *UseCasesClinicalImpl) RecordHPV(ctx context.Context, input dto.Observat return nil, fmt.Errorf("cannot record HPV results for an age of %d. The patient has to be between 25 - 65 years", age) } - return c.RecordObservation(ctx, input, common.HPVCIELTerminologyCode, []ObservationInputMutatorFunc{addLabCategory}) + return c.RecordObservation(ctx, input, common.HPVCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("laboratory")}) } // RecordPapSmear records patients pap smear findings func (c *UseCasesClinicalImpl) RecordPapSmear(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) { - return c.RecordObservation(ctx, input, common.PapSmearTerminologyCode, []ObservationInputMutatorFunc{addLabCategory}) + return c.RecordObservation(ctx, input, common.PapSmearTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("laboratory")}) } diff --git a/pkg/clinical/usecases/clinical/observation_helpers.go b/pkg/clinical/usecases/clinical/observation_helpers.go index 1ce48644..e3121c35 100644 --- a/pkg/clinical/usecases/clinical/observation_helpers.go +++ b/pkg/clinical/usecases/clinical/observation_helpers.go @@ -12,110 +12,41 @@ var ( diagnosticReportCategorySystem = "http://terminology.hl7.org/CodeSystem/v2-0074" ) -// addVitalSignCategory is used to add laboratory categories for various observations records. -var addVitalSignCategory = func(ctx context.Context, observation *domain.FHIRObservationInput) error { - userSelected := false - category := []*domain.FHIRCodeableConceptInput{ - { - Coding: []*domain.FHIRCodingInput{ - { - System: (*scalarutils.URI)(&observationCategorySystem), - Code: "vital-signs", - Display: "Vital Signs", - UserSelected: &userSelected, - }, - }, - Text: "Vital Signs", - }, +// addObservationCategory changes category of an observation +func addObservationCategory(code string) ObservationInputMutatorFunc { + var display string + + switch code { + case "exam": + display = "Exam" + case "procedure": + display = "Procedure" + case "imaging": + display = "Imaging" + case "laboratory": + display = "Laboratory" + case "vital-signs": + display = "Vital Signs" } - observation.Category = append(observation.Category, category...) - return nil -} - -// addLabCategory is used to add laboratory categories for various observations records. -var addLabCategory = func(ctx context.Context, observation *domain.FHIRObservationInput) error { - userSelected := false - category := []*domain.FHIRCodeableConceptInput{ - { - Coding: []*domain.FHIRCodingInput{ - { - System: (*scalarutils.URI)(&observationCategorySystem), - Code: "laboratory", - Display: "Laboratory", - UserSelected: &userSelected, + return func(ctx context.Context, observation *domain.FHIRObservationInput) error { + userSelected := false + category := []*domain.FHIRCodeableConceptInput{ + { + Coding: []*domain.FHIRCodingInput{ + { + System: (*scalarutils.URI)(&observationCategorySystem), + Code: scalarutils.Code(code), + Display: display, + UserSelected: &userSelected, + }, }, + Text: display, }, - Text: "Laboratory", - }, - } + } - observation.Category = append(observation.Category, category...) - return nil -} + observation.Category = append(observation.Category, category...) -// addImagingCategory is used to add imaging categories for various observations records. -var addImagingCategory = func(ctx context.Context, observation *domain.FHIRObservationInput) error { - userSelected := false - category := []*domain.FHIRCodeableConceptInput{ - { - Coding: []*domain.FHIRCodingInput{ - { - System: (*scalarutils.URI)(&observationCategorySystem), - Code: "imaging", - Display: "Imaging", - UserSelected: &userSelected, - }, - }, - Text: "Imaging", - }, + return nil } - - observation.Category = append(observation.Category, category...) - return nil -} - -// addProcedureCategory is used to add procedure category for various observations records such as biopsy etc. -var addProcedureCategory = func(ctx context.Context, observation *domain.FHIRObservationInput) error { - userSelected := false - category := []*domain.FHIRCodeableConceptInput{ - { - Coding: []*domain.FHIRCodingInput{ - { - System: (*scalarutils.URI)(&observationCategorySystem), - Code: "procedure", - Display: "Procedure", - UserSelected: &userSelected, - }, - }, - Text: "Procedure", - }, - } - - observation.Category = append(observation.Category, category...) - return nil -} - -// addExamCategory is used to add exam categories for various observations records. -// This observation category is generated by physical exam findings including direct observations made -// by a clinician and use of simple instruments and the result of simple maneuvers performed directly -// on the patient's body. -var addExamCategory = func(ctx context.Context, observation *domain.FHIRObservationInput) error { - userSelected := false - category := []*domain.FHIRCodeableConceptInput{ - { - Coding: []*domain.FHIRCodingInput{ - { - System: (*scalarutils.URI)(&observationCategorySystem), - Code: "exam", - Display: "Exam", - UserSelected: &userSelected, - }, - }, - Text: "Exam", - }, - } - - observation.Category = append(observation.Category, category...) - return nil }