Skip to content

Commit

Permalink
refactor: observation recording to update observation categories dyna…
Browse files Browse the repository at this point in the history
…mically

Signed-off-by: Kathurima Kimathi <kathurimakimathi415@gmail.com>
  • Loading branch information
KathurimaKimathi committed Jan 30, 2024
1 parent 302fd72 commit f9e8fc1
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 31 deletions.
51 changes: 20 additions & 31 deletions pkg/clinical/usecases/clinical/observation.go
Original file line number Diff line number Diff line change
Expand Up @@ -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, nil)
temperatureObservation, err := c.RecordObservation(ctx, input, common.TemperatureCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
if err != nil {
return nil, err
}
Expand All @@ -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, nil)
muacObservation, err := c.RecordObservation(ctx, input, common.MuacCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
if err != nil {
return nil, err
}
Expand All @@ -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, nil)
oxygenSaturationObservation, err := c.RecordObservation(ctx, input, common.OxygenSaturationCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
if err != nil {
return nil, err
}
Expand All @@ -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, nil)
heightObservation, err := c.RecordObservation(ctx, input, common.HeightCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -125,7 +125,7 @@ func (c *UseCasesClinicalImpl) PatchPatientMuac(ctx context.Context, id string,

// 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, nil)
weightObservation, err := c.RecordObservation(ctx, input, common.WeightCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
if err != nil {
return nil, err
}
Expand All @@ -135,7 +135,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, nil)
viralLoadObservation, err := c.RecordObservation(ctx, input, common.ViralLoadCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -165,7 +165,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, nil)
respiratoryRateObservation, err := c.RecordObservation(ctx, input, common.RespiratoryRateCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
if err != nil {
return nil, err
}
Expand All @@ -180,7 +180,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, nil)
pulseRateObservation, err := c.RecordObservation(ctx, input, common.PulseCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
if err != nil {
return nil, err
}
Expand All @@ -195,7 +195,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, nil)
bloodPressureObservation, err := c.RecordObservation(ctx, input, common.BloodPressureCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
if err != nil {
return nil, err
}
Expand All @@ -210,7 +210,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, nil)
bmiObservation, err := c.RecordObservation(ctx, input, common.BMICIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
if err != nil {
return nil, err
}
Expand All @@ -225,7 +225,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, nil)
return c.RecordObservation(ctx, input, common.BloodSugarCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
}

// GetPatientBloodSugarEntries retrieves all blood sugar entries for a patient
Expand All @@ -235,7 +235,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, nil)
return c.RecordObservation(ctx, input, common.LastMenstrualPeriodCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
}

// GetPatientLastMenstrualPeriodEntries retrieves all blood sugar entries for a patient
Expand All @@ -245,12 +245,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, nil)
return c.RecordObservation(ctx, input, common.DiastolicBloodPressureCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
}

// RecordColposcopy records colposcopy findings
func (c *UseCasesClinicalImpl) RecordColposcopy(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) {
return c.RecordObservation(ctx, input, common.ColposcopyCIELTerminologyCode, nil)
return c.RecordObservation(ctx, input, common.ColposcopyCIELTerminologyCode, []ObservationInputMutatorFunc{addVitalSignCategory})
}

// RecordVIA records Visual Inspection with Acetic Acid results
Expand Down Expand Up @@ -300,7 +300,7 @@ func (c *UseCasesClinicalImpl) RecordVIA(ctx context.Context, input dto.Observat
return nil
}

return c.RecordObservation(ctx, input, common.VIACIELCode, []ObservationInputMutatorFunc{addInterpretation})
return c.RecordObservation(ctx, input, common.VIACIELCode, []ObservationInputMutatorFunc{addInterpretation, addLabCategory})
}

// GetPatientDiastolicBloodPressureEntries retrieves all diastolic blood pressure entries for a patient
Expand Down Expand Up @@ -335,22 +335,11 @@ func (c *UseCasesClinicalImpl) RecordObservation(ctx context.Context, input dto.
return nil, err
}

system := "http://terminology.hl7.org/CodeSystem/observation-category"
instant := scalarutils.Instant(time.Now().Format(time.RFC3339))

observation := domain.FHIRObservationInput{
Status: (*domain.ObservationStatusEnum)(&input.Status),
Category: []*domain.FHIRCodeableConceptInput{
{
Coding: []*domain.FHIRCodingInput{
{
System: (*scalarutils.URI)(&system),
Code: "vital-signs",
Display: "Vital Signs",
},
},
Text: "Vital Signs",
},
},
Status: (*domain.ObservationStatusEnum)(&input.Status),
Category: []*domain.FHIRCodeableConceptInput{},
EffectiveInstant: &instant,
Code: &domain.FHIRCodeableConceptInput{
Coding: []*domain.FHIRCodingInput{
Expand Down Expand Up @@ -542,10 +531,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, nil)
return c.RecordObservation(ctx, input, common.HPVCIELTerminologyCode, []ObservationInputMutatorFunc{addLabCategory})
}

// 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, nil)
return c.RecordObservation(ctx, input, common.PapSmearTerminologyCode, []ObservationInputMutatorFunc{addLabCategory})
}
56 changes: 56 additions & 0 deletions pkg/clinical/usecases/clinical/observation_helpers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package clinical

import (
"context"

"github.com/savannahghi/clinical/pkg/clinical/domain"
"github.com/savannahghi/scalarutils"
)

// NOTE: This file contains simplified helper functions to map observation categories to their FHIR observation categories

var (
system = "http://terminology.hl7.org/CodeSystem/observation-category"
)

// 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)(&system),
Code: "vital-signs",
Display: "Vital Signs",
UserSelected: &userSelected,
},
},
Text: "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)(&system),
Code: "laboratory",
Display: "Laboratory",
UserSelected: &userSelected,
},
},
Text: "Laboratory",
},
}

observation.Category = append(observation.Category, category...)
return nil
}

0 comments on commit f9e8fc1

Please sign in to comment.