Skip to content

Commit

Permalink
chore: add observation category helper
Browse files Browse the repository at this point in the history
  • Loading branch information
Muchogoc committed Mar 7, 2024
1 parent 789c60f commit 8ef8ff6
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 121 deletions.
10 changes: 5 additions & 5 deletions pkg/clinical/usecases/clinical/diagnostic_report.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand Down
34 changes: 17 additions & 17 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, []ObservationInputMutatorFunc{addVitalSignCategory})
temperatureObservation, err := c.RecordObservation(ctx, input, common.TemperatureCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")})
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, []ObservationInputMutatorFunc{addVitalSignCategory})
muacObservation, err := c.RecordObservation(ctx, input, common.MuacCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")})
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, []ObservationInputMutatorFunc{addVitalSignCategory})
oxygenSaturationObservation, err := c.RecordObservation(ctx, input, common.OxygenSaturationCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")})
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, []ObservationInputMutatorFunc{addVitalSignCategory})
heightObservation, err := c.RecordObservation(ctx, input, common.HeightCIELTerminologyCode, []ObservationInputMutatorFunc{addObservationCategory("vital-signs")})
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -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
}
Expand All @@ -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
}
Expand Down Expand Up @@ -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
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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")})
}
129 changes: 30 additions & 99 deletions pkg/clinical/usecases/clinical/observation_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit 8ef8ff6

Please sign in to comment.