Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: add observation category helper #384

Merged
merged 1 commit into from
Mar 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
}
Loading