diff --git a/pkg/clinical/application/dto/output.go b/pkg/clinical/application/dto/output.go index 49f65a3c..588be4d4 100644 --- a/pkg/clinical/application/dto/output.go +++ b/pkg/clinical/application/dto/output.go @@ -160,3 +160,11 @@ type Section struct { type ConsentOutput struct { Status *ConsentStatusEnum `json:"status"` } + +// PatientMedicationHistoryOutput object models all information about a patient +type PatientMedicationHistoryOutput struct { + Conditions []*Condition `json:"condition"` + Observations []*Observation `json:"observations"` + Patient Patient `json:"patient"` + Medications []*MedicationStatement `json:"medications"` +} diff --git a/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir.go b/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir.go index d9c59d75..9c8499a5 100644 --- a/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir.go +++ b/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir.go @@ -49,7 +49,7 @@ type Dataset interface { DeleteFHIRResource(resourceType, fhirResourceID string) error PatchFHIRResource(resourceType, fhirResourceID string, payload map[string]interface{}, resource interface{}) error UpdateFHIRResource(resourceType, fhirResourceID string, payload map[string]interface{}, resource interface{}) error - SearchFHIRResource(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) + SearchFHIRResource(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) GetFHIRPatientAllData(fhirResourceID string) ([]byte, error) } @@ -75,7 +75,7 @@ func (fh StoreImpl) SearchPatientObservations( tenant dto.TenantIdentifiers, pagination dto.Pagination, ) (*domain.PagedFHIRObservations, error) { - observations, err := fh.Dataset.SearchFHIRResource(observationResourceType, searchParameters, tenant, pagination) + observations, err := fh.Dataset.SearchFHIRResource(observationResourceType, searchParameters, &tenant, pagination) if err != nil { return nil, err } @@ -125,7 +125,7 @@ func (fh StoreImpl) SearchPatientEncounters( params["status:exact"] = status.String() } - resources, err := fh.Dataset.SearchFHIRResource(encounterResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(encounterResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -164,7 +164,7 @@ func (fh StoreImpl) SearchPatientMedia(_ context.Context, patientReference strin "patient": patientReference, } - resources, err := fh.Dataset.SearchFHIRResource(mediaResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(mediaResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -201,7 +201,7 @@ func (fh StoreImpl) SearchPatientMedia(_ context.Context, patientReference strin func (fh StoreImpl) SearchFHIREpisodeOfCare(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIREpisodeOfCareRelayConnection, error) { output := domain.FHIREpisodeOfCareRelayConnection{} - resources, err := fh.Dataset.SearchFHIRResource(episodeOfCareResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(episodeOfCareResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -298,7 +298,7 @@ func (fh StoreImpl) CreateFHIROrganization(_ context.Context, input domain.FHIRO func (fh StoreImpl) SearchFHIROrganization(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIROrganizationRelayConnection, error) { output := domain.FHIROrganizationRelayConnection{} - resources, err := fh.Dataset.SearchFHIRResource(organizationResource, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(organizationResource, params, &tenant, pagination) if err != nil { return nil, err } @@ -359,7 +359,7 @@ func (fh StoreImpl) GetFHIRAllergyIntolerance(_ context.Context, id string) (*do // SearchEpisodesByParam search episodes by params func (fh StoreImpl) SearchEpisodesByParam(_ context.Context, searchParams map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIREpisodeOfCare, error) { - resources, err := fh.Dataset.SearchFHIRResource(episodeOfCareResourceType, searchParams, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(episodeOfCareResourceType, searchParams, &tenant, pagination) if err != nil { return nil, err } @@ -651,7 +651,7 @@ func (fh StoreImpl) GetActiveEpisode(_ context.Context, episodeID string, tenant "_id": episodeID, } - resources, err := fh.Dataset.SearchFHIRResource(episodeOfCareResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(episodeOfCareResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -680,7 +680,7 @@ func (fh StoreImpl) GetActiveEpisode(_ context.Context, episodeID string, tenant func (fh StoreImpl) SearchFHIRServiceRequest(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRServiceRequestRelayConnection, error) { output := domain.FHIRServiceRequestRelayConnection{} - resources, err := fh.Dataset.SearchFHIRResource(serviceRequestResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(serviceRequestResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -730,7 +730,7 @@ func (fh StoreImpl) CreateFHIRServiceRequest(_ context.Context, input domain.FHI // SearchFHIRAllergyIntolerance provides a search API for FHIRAllergyIntolerance func (fh StoreImpl) SearchFHIRAllergyIntolerance(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRAllergy, error) { - resources, err := fh.Dataset.SearchFHIRResource(allergyIntoleranceResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(allergyIntoleranceResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -813,7 +813,7 @@ func (fh StoreImpl) UpdateFHIRAllergyIntolerance(_ context.Context, input domain // SearchFHIRComposition provides a search API for FHIRComposition func (fh StoreImpl) SearchFHIRComposition(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRComposition, error) { - resources, err := fh.Dataset.SearchFHIRResource(compositionResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(compositionResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -904,7 +904,7 @@ func (fh StoreImpl) DeleteFHIRComposition(_ context.Context, id string) (bool, e } // SearchFHIRCondition provides a search API for FHIRCondition -func (fh StoreImpl) SearchFHIRCondition(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { +func (fh StoreImpl) SearchFHIRCondition(_ context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { resources, err := fh.Dataset.SearchFHIRResource(conditionResourceType, params, tenant, pagination) if err != nil { return nil, err @@ -945,7 +945,7 @@ func (fh StoreImpl) SearchPatientAllergyIntolerance(_ context.Context, patientRe "patient": patientReference, } - resources, err := fh.Dataset.SearchFHIRResource(allergyIntoleranceResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(allergyIntoleranceResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -1023,7 +1023,7 @@ func (fh StoreImpl) GetFHIREncounter(_ context.Context, id string) (*domain.FHIR // SearchFHIREncounter provides a search API for FHIREncounter func (fh StoreImpl) SearchFHIREncounter(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIREncounter, error) { - resources, err := fh.Dataset.SearchFHIRResource(encounterResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(encounterResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -1059,7 +1059,7 @@ func (fh StoreImpl) SearchFHIREncounter(_ context.Context, params map[string]int // SearchFHIREncounterAllData provides a search API for a FHIREncounter and all other resources that reference the encounter func (fh StoreImpl) SearchFHIREncounterAllData(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { - resources, err := fh.Dataset.SearchFHIRResource(encounterResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(encounterResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -1080,7 +1080,7 @@ func (fh StoreImpl) SearchFHIREncounterAllData(_ context.Context, params map[str func (fh StoreImpl) SearchFHIRMedicationRequest(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationRequestRelayConnection, error) { output := domain.FHIRMedicationRequestRelayConnection{} - resources, err := fh.Dataset.SearchFHIRResource(medicationRequestResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(medicationRequestResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -1168,7 +1168,7 @@ func (fh StoreImpl) DeleteFHIRMedicationRequest(_ context.Context, id string) (b } // SearchFHIRObservation provides a search API for FHIRObservation -func (fh StoreImpl) SearchFHIRObservation(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { +func (fh StoreImpl) SearchFHIRObservation(_ context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { resources, err := fh.Dataset.SearchFHIRResource(observationResourceType, params, tenant, pagination) if err != nil { return nil, err @@ -1503,7 +1503,7 @@ func (fh StoreImpl) CreateFHIRMedia(_ context.Context, input domain.FHIRMedia) ( } // SearchFHIRMedicationStatement used to search for a fhir medication statement -func (fh StoreImpl) SearchFHIRMedicationStatement(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { +func (fh StoreImpl) SearchFHIRMedicationStatement(_ context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { output := domain.FHIRMedicationStatementRelayConnection{} resources, err := fh.Dataset.SearchFHIRResource(medicationStatementResourceType, params, tenant, pagination) @@ -1610,7 +1610,7 @@ func (fh StoreImpl) SearchFHIRPatient(_ context.Context, searchParams string, te "_content": searchParams, } - resources, err := fh.Dataset.SearchFHIRResource(patientResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(patientResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -1709,7 +1709,7 @@ func (fh StoreImpl) PatchFHIRObservation(_ context.Context, id string, input dom // ListFHIRQuestionnaire is used to list questionnaire resource using the name or the title of the resource. func (fh StoreImpl) ListFHIRQuestionnaire(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRQuestionnaires, error) { - results, err := fh.Dataset.SearchFHIRResource(questionnaireResourceType, params, tenant, pagination) + results, err := fh.Dataset.SearchFHIRResource(questionnaireResourceType, params, &tenant, pagination) if err != nil { return nil, err } @@ -1818,7 +1818,7 @@ func (fh StoreImpl) CreateFHIRRiskAssessment(_ context.Context, input *domain.FH func (fh StoreImpl) SearchFHIRRiskAssessment(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRRiskAssessmentRelayConnection, error) { output := domain.FHIRRiskAssessmentRelayConnection{} - resources, err := fh.Dataset.SearchFHIRResource(riskAssessmentResourceType, params, tenant, pagination) + resources, err := fh.Dataset.SearchFHIRResource(riskAssessmentResourceType, params, &tenant, pagination) if err != nil { return nil, err } diff --git a/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir_unit_test.go b/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir_unit_test.go index 2224fc2b..545ecbb5 100644 --- a/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir_unit_test.go +++ b/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir_unit_test.go @@ -27,7 +27,7 @@ func TestStoreImpl_SearchFHIRObservation(t *testing.T) { type args struct { ctx context.Context params map[string]interface{} - tenant dto.TenantIdentifiers + tenant *dto.TenantIdentifiers pagination dto.Pagination } tests := []struct { @@ -62,7 +62,7 @@ func TestStoreImpl_SearchFHIRObservation(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "sad case: search resource error" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("failed to search fhir resource") } } @@ -302,7 +302,7 @@ func TestStoreImpl_GetFHIRPatient(t *testing.T) { return nil } - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { episode := domain.FHIREpisodeOfCare{ Period: &domain.FHIRPeriod{ Start: "2020-09-24T18:02:38.661033Z", @@ -820,7 +820,7 @@ func TestStoreImpl_SearchFHIRMedicationStatement(t *testing.T) { type args struct { ctx context.Context params map[string]interface{} - tenant dto.TenantIdentifiers + tenant *dto.TenantIdentifiers pagination dto.Pagination } tests := []struct { @@ -855,7 +855,7 @@ func TestStoreImpl_SearchFHIRMedicationStatement(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "sad case: search resource error" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("failed to search") } } @@ -1045,7 +1045,7 @@ func TestStoreImpl_SearchFHIRPatient(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "happy case: search patient" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { var payload map[string]interface{} switch resourceType { @@ -1085,7 +1085,7 @@ func TestStoreImpl_SearchFHIRPatient(t *testing.T) { } if tt.name == "sad case: search patient error" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { var payload map[string]interface{} switch resourceType { @@ -2568,7 +2568,7 @@ func TestStoreImpl_SearchFHIRServiceRequest(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad Case - fail to search a service request" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("failed to search resource") } } @@ -2624,7 +2624,7 @@ func TestStoreImpl_SearchFHIRAllergyIntolerance(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad Case - fail to search an allergy intolerance" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("failed to search resource") } } @@ -2680,7 +2680,7 @@ func TestStoreImpl_SearchFHIRComposition(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad Case - fail to search a composition" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("failed to search resource") } } @@ -2703,7 +2703,7 @@ func TestStoreImpl_SearchFHIRCondition(t *testing.T) { type args struct { ctx context.Context params map[string]interface{} - tenant dto.TenantIdentifiers + tenant *dto.TenantIdentifiers pagination dto.Pagination } tests := []struct { @@ -2738,7 +2738,7 @@ func TestStoreImpl_SearchFHIRCondition(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad Case - fail to search a condition" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("failed to search resource") } } @@ -2794,7 +2794,7 @@ func TestStoreImpl_SearchFHIREncounter(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad Case - fail to search an encounter" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("failed to search resource") } } @@ -2850,7 +2850,7 @@ func TestStoreImpl_SearchFHIRMedicationRequest(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad Case - fail to search a medication request" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("failed to search resource") } } @@ -3083,7 +3083,7 @@ func TestStoreImpl_SearchPatientEncounters(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad case: failed to search FHIR resource" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("an error occurred") } } @@ -3141,7 +3141,7 @@ func TestStoreImpl_SearchFHIREpisodeOfCare(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad case: failed to search FHIR resource" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("an error occurred") } } @@ -3231,13 +3231,13 @@ func TestStoreImpl_CreateEpisodeOfCare(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Happy case: create episode of care, episode does not exist" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, nil } } if tt.name == "Sad case: failed to create FHIR resource" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, nil } dataset.MockCreateFHIRResourceFn = func(resourceType string, payload map[string]interface{}, resource interface{}) error { @@ -3297,7 +3297,7 @@ func TestStoreImpl_SearchFHIROrganization(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad case: failed to search FHIR organisation" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("an error occurred") } } @@ -3359,7 +3359,7 @@ func TestStoreImpl_SearchEpisodesByParam(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad case: failed to search FHIR resource" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("an error occurred") } } @@ -3412,7 +3412,7 @@ func TestStoreImpl_OpenEpisodes(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad case: failed to search FHIR resource" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("an error occurred") } } @@ -3473,7 +3473,7 @@ func TestStoreImpl_HasOpenEpisode(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad case: failed to search FHIR resource" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("an error occurred") } } @@ -3525,7 +3525,7 @@ func TestStoreImpl_SearchEpisodeEncounter(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad case: failed to search FHIR resource" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("an error occurred") } } @@ -3585,13 +3585,13 @@ func TestStoreImpl_GetActiveEpisode(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad case: failed to search FHIR resource" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("an error occurred") } } if tt.name == "Sad case: empty FHIR resource" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return &domain.PagedFHIRResource{ Resources: []map[string]interface{}{}, }, nil @@ -4257,7 +4257,7 @@ func TestStoreImpl_SearchPatientObservations(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad Case - fail to search fhir resource" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("failed to search observation resource") } } @@ -4367,7 +4367,7 @@ func TestStoreImpl_SearchPatientAllergyIntolerance(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(fakeDataset) if tt.name == "Sad case: unable to search allergy intolerance" { - fakeDataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + fakeDataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, errors.New("some error") } } @@ -4487,7 +4487,7 @@ func TestStoreImpl_SearchPatientMedia(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(fakeDataset) if tt.name == "Sad case: unable to search patient media" { - fakeDataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + fakeDataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, errors.New("unable to search patient media") } } @@ -4552,7 +4552,7 @@ func TestStoreImpl_ListFHIRQuestionnaire(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(fakeDataset) if tt.name == "Sad case: unable to search questionnaire" { - fakeDataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + fakeDataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, errors.New("an error occurred") } } @@ -4959,7 +4959,7 @@ func TestStoreImpl_SearchFHIRRiskAssessment(t *testing.T) { fh := FHIR.NewFHIRStoreImpl(dataset) if tt.name == "Sad Case - fail to search a fhir risk assessment" { - dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return nil, fmt.Errorf("failed to search risk assessment") } } diff --git a/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhirdataset/dataset.go b/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhirdataset/dataset.go index d16162b4..a532fe14 100644 --- a/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhirdataset/dataset.go +++ b/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhirdataset/dataset.go @@ -420,7 +420,7 @@ func (fr Repository) GetFHIRResource(resourceType, fhirResourceID string, resour } // SearchFHIRResource ... -func (fr Repository) SearchFHIRResource(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { +func (fr Repository) SearchFHIRResource(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { err := pagination.Validate() if err != nil { return nil, err @@ -452,8 +452,10 @@ func (fr Repository) SearchFHIRResource(resourceType string, params map[string]i } } - urlParams.Add("_tag", fmt.Sprintf("http://mycarehub/tenant-identification/organisation|%s", tenant.OrganizationID)) - urlParams.Add("_tag", fmt.Sprintf("http://mycarehub/tenant-identification/facility|%s", tenant.FacilityID)) + if tenant != nil { + urlParams.Add("_tag", fmt.Sprintf("http://mycarehub/tenant-identification/organisation|%s", tenant.OrganizationID)) + urlParams.Add("_tag", fmt.Sprintf("http://mycarehub/tenant-identification/facility|%s", tenant.FacilityID)) + } path := "_search" diff --git a/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhirdataset/mock/dataset_mock.go b/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhirdataset/mock/dataset_mock.go index 6634a3ba..e01e6b42 100644 --- a/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhirdataset/mock/dataset_mock.go +++ b/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhirdataset/mock/dataset_mock.go @@ -18,7 +18,7 @@ type FakeFHIRRepository struct { MockUpdateFHIRResourceFn func(resourceType, fhirResourceID string, payload map[string]interface{}, resource interface{}) error MockGetFHIRPatientAllDataFn func(fhirResourceID string) ([]byte, error) MockGetFHIRResourceFn func(resourceType, fhirResourceID string, resource interface{}) error - MockSearchFHIRResourceFn func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) + MockSearchFHIRResourceFn func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) } // NewFakeFHIRRepositoryMock initializes a new FakeFHIRRepositoryMock @@ -46,7 +46,7 @@ func NewFakeFHIRRepositoryMock() *FakeFHIRRepository { MockGetFHIRResourceFn: func(resourceType, fhirResourceID string, resource interface{}) error { return nil }, - MockSearchFHIRResourceFn: func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { + MockSearchFHIRResourceFn: func(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { n := map[string]interface{}{"given": []string{"John"}, "family": []string{"Doe"}} p := map[string]interface{}{ "resourceType": "Patient/", @@ -106,6 +106,6 @@ func (f *FakeFHIRRepository) GetFHIRResource(resourceType, fhirResourceID string } // SearchFHIRResource ... -func (f *FakeFHIRRepository) SearchFHIRResource(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { +func (f *FakeFHIRRepository) SearchFHIRResource(resourceType string, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) { return f.MockSearchFHIRResourceFn(resourceType, params, tenant, pagination) } diff --git a/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go b/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go index 2c746d25..30a6158c 100644 --- a/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go +++ b/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go @@ -16,7 +16,7 @@ import ( // FHIRMock struct implements mocks of FHIR methods. type FHIRMock struct { MockCreateEpisodeOfCareFn func(ctx context.Context, episode domain.FHIREpisodeOfCareInput) (*domain.EpisodeOfCarePayload, error) - MockSearchFHIRConditionFn func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) + MockSearchFHIRConditionFn func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) MockCreateFHIRConditionFn func(ctx context.Context, input domain.FHIRConditionInput) (*domain.FHIRConditionRelayPayload, error) MockCreateFHIROrganizationFn func(ctx context.Context, input domain.FHIROrganizationInput) (*domain.FHIROrganizationRelayPayload, error) MockSearchFHIROrganizationFn func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIROrganizationRelayConnection, error) @@ -59,7 +59,7 @@ type FHIRMock struct { MockCreateFHIRMedicationRequestFn func(ctx context.Context, input domain.FHIRMedicationRequestInput) (*domain.FHIRMedicationRequestRelayPayload, error) MockUpdateFHIRMedicationRequestFn func(ctx context.Context, input domain.FHIRMedicationRequestInput) (*domain.FHIRMedicationRequestRelayPayload, error) MockDeleteFHIRMedicationRequestFn func(ctx context.Context, id string) (bool, error) - MockSearchFHIRObservationFn func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) + MockSearchFHIRObservationFn func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) MockCreateFHIRObservationFn func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) MockGetFHIRObservationFn func(ctx context.Context, id string) (*domain.FHIRObservationRelayPayload, error) MockPatchFHIRObservationFn func(ctx context.Context, id string, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) @@ -70,7 +70,7 @@ type FHIRMock struct { MockDeleteFHIRResourceTypeFn func(results []map[string]string) error MockCreateFHIRMedicationStatementFn func(ctx context.Context, input domain.FHIRMedicationStatementInput) (*domain.FHIRMedicationStatementRelayPayload, error) MockCreateFHIRMedicationFn func(ctx context.Context, input domain.FHIRMedicationInput) (*domain.FHIRMedicationRelayPayload, error) - MockSearchFHIRMedicationStatementFn func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) + MockSearchFHIRMedicationStatementFn func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) MockCreateFHIRPatientFn func(ctx context.Context, input domain.FHIRPatientInput) (*domain.PatientPayload, error) MockPatchFHIRPatientFn func(ctx context.Context, id string, input domain.FHIRPatientInput) (*domain.FHIRPatient, error) MockPatchFHIREpisodeOfCareFn func(ctx context.Context, id string, input domain.FHIREpisodeOfCareInput) (*domain.FHIREpisodeOfCare, error) @@ -1082,7 +1082,7 @@ func NewFHIRMock() *FHIRMock { MockDeleteFHIRCompositionFn: func(ctx context.Context, id string) (bool, error) { return true, nil }, - MockSearchFHIRConditionFn: func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { + MockSearchFHIRConditionFn: func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { id := gofakeit.UUID() statusSystem := scalarutils.URI("http://terminology.hl7.org/CodeSystem/condition-clinical") status := "inactive" @@ -1295,9 +1295,10 @@ func NewFHIRMock() *FHIRMock { MockDeleteFHIRMedicationRequestFn: func(ctx context.Context, id string) (bool, error) { return true, nil }, - MockSearchFHIRObservationFn: func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + MockSearchFHIRObservationFn: func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { uuid := uuid.New().String() finalStatus := domain.ObservationStatusEnumFinal + instant := gofakeit.TimeZone() return &domain.PagedFHIRObservations{ Observations: []domain.FHIRObservation{ { @@ -1309,6 +1310,18 @@ func NewFHIRMock() *FHIRMock { Encounter: &domain.FHIRReference{ ID: &uuid, }, + Code: &domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{ + { + ID: new(string), + Display: "Test", + UserSelected: new(bool), + }, + }, + Text: "", + }, + EffectiveInstant: (*scalarutils.Instant)(&instant), }, }, HasNextPage: false, @@ -1506,6 +1519,7 @@ func NewFHIRMock() *FHIRMock { MockGetFHIRPatientFn: func(ctx context.Context, id string) (*domain.FHIRPatientRelayPayload, error) { patientID := uuid.New().String() patientName := gofakeit.Name() + trueBool := true gender := domain.PatientGenderEnumFemale return &domain.FHIRPatientRelayPayload{ Resource: &domain.FHIRPatient{ @@ -1516,6 +1530,7 @@ func NewFHIRMock() *FHIRMock { }, }, Gender: &gender, + Active: &trueBool, BirthDate: &scalarutils.Date{ Year: 1990, Month: 12, @@ -1533,20 +1548,29 @@ func NewFHIRMock() *FHIRMock { MockDeleteFHIRServiceRequestFn: func(ctx context.Context, id string) (bool, error) { return true, nil }, - MockSearchFHIRMedicationStatementFn: func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + MockSearchFHIRMedicationStatementFn: func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { codingCode := "123" + patientID := "1" + status := domain.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ { Cursor: new(string), Node: &domain.FHIRMedicationStatement{ - ID: new(string), - Text: &domain.FHIRNarrative{}, - Identifier: []*domain.FHIRIdentifier{}, - BasedOn: []*domain.FHIRReference{}, - PartOf: []*domain.FHIRReference{}, - // Status: &"", + ID: new(string), + Text: &domain.FHIRNarrative{}, + Identifier: []*domain.FHIRIdentifier{}, + BasedOn: []*domain.FHIRReference{}, + PartOf: []*domain.FHIRReference{}, + Status: &status, StatusReason: []*domain.FHIRCodeableConcept{}, + MedicationCodeableConcept: &domain.FHIRCodeableConcept{ + Coding: []*domain.FHIRCoding{ + { + Display: "Panadol", + }, + }, + }, Category: &domain.FHIRCodeableConcept{ ID: new(string), Coding: []*domain.FHIRCoding{ @@ -1560,21 +1584,22 @@ func NewFHIRMock() *FHIRMock { }, Text: "", }, - MedicationCodeableConcept: &domain.FHIRCodeableConcept{}, - MedicationReference: &domain.FHIRMedication{}, - Subject: &domain.FHIRReference{}, - Context: &domain.FHIRReference{}, - EffectiveDateTime: &scalarutils.Date{}, - EffectivePeriod: &domain.FHIRPeriod{}, - DateAsserted: &scalarutils.Date{}, - InformationSource: &domain.FHIRReference{}, - DerivedFrom: []*domain.FHIRReference{}, - ReasonCode: []*domain.FHIRCodeableConcept{}, - ReasonReference: []*domain.FHIRReference{}, - Note: []*domain.FHIRAnnotation{}, - Dosage: []*domain.FHIRDosage{}, - Meta: &domain.FHIRMeta{}, - Extension: []*domain.FHIRExtension{}, + MedicationReference: &domain.FHIRMedication{}, + Subject: &domain.FHIRReference{ + ID: &patientID, + }, + Context: &domain.FHIRReference{}, + EffectiveDateTime: &scalarutils.Date{}, + EffectivePeriod: &domain.FHIRPeriod{}, + DateAsserted: &scalarutils.Date{}, + InformationSource: &domain.FHIRReference{}, + DerivedFrom: []*domain.FHIRReference{}, + ReasonCode: []*domain.FHIRCodeableConcept{}, + ReasonReference: []*domain.FHIRReference{}, + Note: []*domain.FHIRAnnotation{}, + Dosage: []*domain.FHIRDosage{}, + Meta: &domain.FHIRMeta{}, + Extension: []*domain.FHIRExtension{}, }, }, }, @@ -2234,7 +2259,7 @@ func (fh *FHIRMock) DeleteFHIRComposition(ctx context.Context, id string) (bool, } // SearchFHIRCondition is a mock implementation of SearchFHIRCondition method -func (fh *FHIRMock) SearchFHIRCondition(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { +func (fh *FHIRMock) SearchFHIRCondition(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { return fh.MockSearchFHIRConditionFn(ctx, params, tenant, pagination) } @@ -2279,7 +2304,7 @@ func (fh *FHIRMock) DeleteFHIRMedicationRequest(ctx context.Context, id string) } // SearchFHIRObservation is a mock implementation of SearchFHIRObservation method -func (fh *FHIRMock) SearchFHIRObservation(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { +func (fh *FHIRMock) SearchFHIRObservation(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { return fh.MockSearchFHIRObservationFn(ctx, params, tenant, pagination) } @@ -2314,7 +2339,7 @@ func (fh *FHIRMock) DeleteFHIRServiceRequest(ctx context.Context, id string) (bo } // SearchFHIRMedicationStatement is a mock implementation of SearchFHIRMedicationStatement method -func (fh *FHIRMock) SearchFHIRMedicationStatement(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { +func (fh *FHIRMock) SearchFHIRMedicationStatement(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { return fh.MockSearchFHIRMedicationStatementFn(ctx, params, tenant, pagination) } diff --git a/pkg/clinical/presentation/graph/clinical.graphql b/pkg/clinical/presentation/graph/clinical.graphql index 34a6bf56..6e2c522a 100644 --- a/pkg/clinical/presentation/graph/clinical.graphql +++ b/pkg/clinical/presentation/graph/clinical.graphql @@ -133,6 +133,8 @@ extend type Query { encounterID: String! screeningType: ScreeningTypeEnum! ): String! + + getPatientMedicationHistory(patientID: ID!, pagination: Pagination!): PatientMedicationHistoryOutput! } extend type Mutation { diff --git a/pkg/clinical/presentation/graph/clinical.resolvers.go b/pkg/clinical/presentation/graph/clinical.resolvers.go index fac4eb1f..71c41081 100644 --- a/pkg/clinical/presentation/graph/clinical.resolvers.go +++ b/pkg/clinical/presentation/graph/clinical.resolvers.go @@ -461,6 +461,13 @@ func (r *queryResolver) GetQuestionnaireResponseRiskLevel(ctx context.Context, e return r.usecases.GetQuestionnaireResponseRiskLevel(ctx, encounterID, screeningType) } +// GetPatientMedicationHistory is the resolver for the getPatientMedicationHistory field. +func (r *queryResolver) GetPatientMedicationHistory(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.PatientMedicationHistoryOutput, error) { + r.CheckDependencies() + + return r.usecases.PatientMedicationHistory(ctx, patientID, &pagination) +} + // Mutation returns generated.MutationResolver implementation. func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} } diff --git a/pkg/clinical/presentation/graph/generated/generated.go b/pkg/clinical/presentation/graph/generated/generated.go index 6fba85ff..ee46924c 100644 --- a/pkg/clinical/presentation/graph/generated/generated.go +++ b/pkg/clinical/presentation/graph/generated/generated.go @@ -406,6 +406,13 @@ type ComplexityRoot struct { PhoneNumber func(childComplexity int) int } + PatientMedicationHistoryOutput struct { + Conditions func(childComplexity int) int + Medications func(childComplexity int) int + Observations func(childComplexity int) int + Patient func(childComplexity int) int + } + Period struct { End func(childComplexity int) int ID func(childComplexity int) int @@ -430,6 +437,7 @@ type ComplexityRoot struct { GetPatientDiastolicBloodPressureEntries func(childComplexity int, patientID string, encounterID *string, date *scalarutils.Date, pagination dto.Pagination) int GetPatientHeightEntries func(childComplexity int, patientID string, encounterID *string, date *scalarutils.Date, pagination dto.Pagination) int GetPatientLastMenstrualPeriodEntries func(childComplexity int, patientID string, encounterID *string, date *scalarutils.Date, pagination dto.Pagination) int + GetPatientMedicationHistory func(childComplexity int, patientID string, pagination dto.Pagination) int GetPatientMuacEntries func(childComplexity int, patientID string, encounterID *string, date *scalarutils.Date, pagination dto.Pagination) int GetPatientOxygenSaturationEntries func(childComplexity int, patientID string, encounterID *string, date *scalarutils.Date, pagination dto.Pagination) int GetPatientPulseRateEntries func(childComplexity int, patientID string, encounterID *string, date *scalarutils.Date, pagination dto.Pagination) int @@ -757,6 +765,7 @@ type QueryResolver interface { ListPatientAllergies(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.AllergyConnection, error) ListPatientMedia(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.MediaConnection, error) GetQuestionnaireResponseRiskLevel(ctx context.Context, encounterID string, screeningType domain.ScreeningTypeEnum) (string, error) + GetPatientMedicationHistory(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.PatientMedicationHistoryOutput, error) } type executableSchema struct { @@ -2695,6 +2704,34 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Patient.PhoneNumber(childComplexity), true + case "PatientMedicationHistoryOutput.conditions": + if e.complexity.PatientMedicationHistoryOutput.Conditions == nil { + break + } + + return e.complexity.PatientMedicationHistoryOutput.Conditions(childComplexity), true + + case "PatientMedicationHistoryOutput.medications": + if e.complexity.PatientMedicationHistoryOutput.Medications == nil { + break + } + + return e.complexity.PatientMedicationHistoryOutput.Medications(childComplexity), true + + case "PatientMedicationHistoryOutput.observations": + if e.complexity.PatientMedicationHistoryOutput.Observations == nil { + break + } + + return e.complexity.PatientMedicationHistoryOutput.Observations(childComplexity), true + + case "PatientMedicationHistoryOutput.patient": + if e.complexity.PatientMedicationHistoryOutput.Patient == nil { + break + } + + return e.complexity.PatientMedicationHistoryOutput.Patient(childComplexity), true + case "Period.end": if e.complexity.Period.End == nil { break @@ -2859,6 +2896,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Query.GetPatientLastMenstrualPeriodEntries(childComplexity, args["patientID"].(string), args["encounterID"].(*string), args["date"].(*scalarutils.Date), args["pagination"].(dto.Pagination)), true + case "Query.getPatientMedicationHistory": + if e.complexity.Query.GetPatientMedicationHistory == nil { + break + } + + args, err := ec.field_Query_getPatientMedicationHistory_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.GetPatientMedicationHistory(childComplexity, args["patientID"].(string), args["pagination"].(dto.Pagination)), true + case "Query.getPatientMuacEntries": if e.complexity.Query.GetPatientMuacEntries == nil { break @@ -4439,6 +4488,8 @@ var sources = []*ast.Source{ encounterID: String! screeningType: ScreeningTypeEnum! ): String! + + getPatientMedicationHistory(patientID: ID!, pagination: Pagination!): PatientMedicationHistoryOutput! } extend type Mutation { @@ -5422,6 +5473,13 @@ type EncounterAssociatedResources { riskAssessment: RiskAssessment consent: Consent observation: Observation +} + +type PatientMedicationHistoryOutput { + observations: [Observation] + conditions: [Condition] + patient: Patient + medications: [MedicationStatement] }`, BuiltIn: false}, {Name: "../../../../../federation/directives.graphql", Input: ` directive @key(fields: _FieldSet!) repeatable on OBJECT | INTERFACE @@ -6696,6 +6754,30 @@ func (ec *executionContext) field_Query_getPatientLastMenstrualPeriodEntries_arg return args, nil } +func (ec *executionContext) field_Query_getPatientMedicationHistory_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 string + if tmp, ok := rawArgs["patientID"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("patientID")) + arg0, err = ec.unmarshalNID2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["patientID"] = arg0 + var arg1 dto.Pagination + if tmp, ok := rawArgs["pagination"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) + arg1, err = ec.unmarshalNPagination2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPagination(ctx, tmp) + if err != nil { + return nil, err + } + } + args["pagination"] = arg1 + return args, nil +} + func (ec *executionContext) field_Query_getPatientMuacEntries_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -19328,6 +19410,238 @@ func (ec *executionContext) fieldContext_Patient_birthDate(ctx context.Context, return fc, nil } +func (ec *executionContext) _PatientMedicationHistoryOutput_observations(ctx context.Context, field graphql.CollectedField, obj *dto.PatientMedicationHistoryOutput) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PatientMedicationHistoryOutput_observations(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Observations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]*dto.Observation) + fc.Result = res + return ec.marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservation(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PatientMedicationHistoryOutput_observations(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PatientMedicationHistoryOutput", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Observation_id(ctx, field) + case "status": + return ec.fieldContext_Observation_status(ctx, field) + case "patientID": + return ec.fieldContext_Observation_patientID(ctx, field) + case "encounterID": + return ec.fieldContext_Observation_encounterID(ctx, field) + case "name": + return ec.fieldContext_Observation_name(ctx, field) + case "value": + return ec.fieldContext_Observation_value(ctx, field) + case "timeRecorded": + return ec.fieldContext_Observation_timeRecorded(ctx, field) + case "interpretation": + return ec.fieldContext_Observation_interpretation(ctx, field) + case "note": + return ec.fieldContext_Observation_note(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Observation", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _PatientMedicationHistoryOutput_conditions(ctx context.Context, field graphql.CollectedField, obj *dto.PatientMedicationHistoryOutput) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PatientMedicationHistoryOutput_conditions(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Conditions, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]*dto.Condition) + fc.Result = res + return ec.marshalOCondition2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐCondition(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PatientMedicationHistoryOutput_conditions(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PatientMedicationHistoryOutput", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Condition_id(ctx, field) + case "status": + return ec.fieldContext_Condition_status(ctx, field) + case "name": + return ec.fieldContext_Condition_name(ctx, field) + case "code": + return ec.fieldContext_Condition_code(ctx, field) + case "system": + return ec.fieldContext_Condition_system(ctx, field) + case "category": + return ec.fieldContext_Condition_category(ctx, field) + case "onsetDate": + return ec.fieldContext_Condition_onsetDate(ctx, field) + case "recordedDate": + return ec.fieldContext_Condition_recordedDate(ctx, field) + case "note": + return ec.fieldContext_Condition_note(ctx, field) + case "patientID": + return ec.fieldContext_Condition_patientID(ctx, field) + case "encounterID": + return ec.fieldContext_Condition_encounterID(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Condition", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _PatientMedicationHistoryOutput_patient(ctx context.Context, field graphql.CollectedField, obj *dto.PatientMedicationHistoryOutput) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PatientMedicationHistoryOutput_patient(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Patient, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(dto.Patient) + fc.Result = res + return ec.marshalOPatient2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPatient(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PatientMedicationHistoryOutput_patient(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PatientMedicationHistoryOutput", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Patient_id(ctx, field) + case "active": + return ec.fieldContext_Patient_active(ctx, field) + case "name": + return ec.fieldContext_Patient_name(ctx, field) + case "phoneNumber": + return ec.fieldContext_Patient_phoneNumber(ctx, field) + case "gender": + return ec.fieldContext_Patient_gender(ctx, field) + case "birthDate": + return ec.fieldContext_Patient_birthDate(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Patient", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _PatientMedicationHistoryOutput_medications(ctx context.Context, field graphql.CollectedField, obj *dto.PatientMedicationHistoryOutput) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PatientMedicationHistoryOutput_medications(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.Medications, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]*dto.MedicationStatement) + fc.Result = res + return ec.marshalOMedicationStatement2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐMedicationStatement(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PatientMedicationHistoryOutput_medications(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PatientMedicationHistoryOutput", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_MedicationStatement_id(ctx, field) + case "status": + return ec.fieldContext_MedicationStatement_status(ctx, field) + case "medication": + return ec.fieldContext_MedicationStatement_medication(ctx, field) + case "patientID": + return ec.fieldContext_MedicationStatement_patientID(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type MedicationStatement", field.Name) + }, + } + return fc, nil +} + func (ec *executionContext) _Period_id(ctx context.Context, field graphql.CollectedField, obj *dto.Period) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Period_id(ctx, field) if err != nil { @@ -21109,6 +21423,71 @@ func (ec *executionContext) fieldContext_Query_getQuestionnaireResponseRiskLevel return fc, nil } +func (ec *executionContext) _Query_getPatientMedicationHistory(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_getPatientMedicationHistory(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().GetPatientMedicationHistory(rctx, fc.Args["patientID"].(string), fc.Args["pagination"].(dto.Pagination)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*dto.PatientMedicationHistoryOutput) + fc.Result = res + return ec.marshalNPatientMedicationHistoryOutput2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPatientMedicationHistoryOutput(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_getPatientMedicationHistory(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "observations": + return ec.fieldContext_PatientMedicationHistoryOutput_observations(ctx, field) + case "conditions": + return ec.fieldContext_PatientMedicationHistoryOutput_conditions(ctx, field) + case "patient": + return ec.fieldContext_PatientMedicationHistoryOutput_patient(ctx, field) + case "medications": + return ec.fieldContext_PatientMedicationHistoryOutput_medications(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PatientMedicationHistoryOutput", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_getPatientMedicationHistory_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _Query__service(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query__service(ctx, field) if err != nil { @@ -34913,6 +35292,48 @@ func (ec *executionContext) _Patient(ctx context.Context, sel ast.SelectionSet, return out } +var patientMedicationHistoryOutputImplementors = []string{"PatientMedicationHistoryOutput"} + +func (ec *executionContext) _PatientMedicationHistoryOutput(ctx context.Context, sel ast.SelectionSet, obj *dto.PatientMedicationHistoryOutput) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, patientMedicationHistoryOutputImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("PatientMedicationHistoryOutput") + case "observations": + out.Values[i] = ec._PatientMedicationHistoryOutput_observations(ctx, field, obj) + case "conditions": + out.Values[i] = ec._PatientMedicationHistoryOutput_conditions(ctx, field, obj) + case "patient": + out.Values[i] = ec._PatientMedicationHistoryOutput_patient(ctx, field, obj) + case "medications": + out.Values[i] = ec._PatientMedicationHistoryOutput_medications(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + var periodImplementors = []string{"Period"} func (ec *executionContext) _Period(ctx context.Context, sel ast.SelectionSet, obj *dto.Period) graphql.Marshaler { @@ -35480,6 +35901,28 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "getPatientMedicationHistory": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_getPatientMedicationHistory(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "_service": field := field @@ -37480,6 +37923,20 @@ func (ec *executionContext) unmarshalNPatientInput2githubᚗcomᚋsavannahghiᚋ return res, graphql.ErrorOnPath(ctx, err) } +func (ec *executionContext) marshalNPatientMedicationHistoryOutput2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPatientMedicationHistoryOutput(ctx context.Context, sel ast.SelectionSet, v dto.PatientMedicationHistoryOutput) graphql.Marshaler { + return ec._PatientMedicationHistoryOutput(ctx, sel, &v) +} + +func (ec *executionContext) marshalNPatientMedicationHistoryOutput2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPatientMedicationHistoryOutput(ctx context.Context, sel ast.SelectionSet, v *dto.PatientMedicationHistoryOutput) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._PatientMedicationHistoryOutput(ctx, sel, v) +} + func (ec *executionContext) unmarshalNQuestionnaireResponseInput2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐQuestionnaireResponse(ctx context.Context, v interface{}) (dto.QuestionnaireResponse, error) { res, err := ec.unmarshalInputQuestionnaireResponseInput(ctx, v) return res, graphql.ErrorOnPath(ctx, err) @@ -38377,6 +38834,54 @@ func (ec *executionContext) marshalOCondition2githubᚗcomᚋsavannahghiᚋclini return ec._Condition(ctx, sel, &v) } +func (ec *executionContext) marshalOCondition2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐCondition(ctx context.Context, sel ast.SelectionSet, v []*dto.Condition) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalOCondition2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐCondition(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + return ret +} + +func (ec *executionContext) marshalOCondition2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐCondition(ctx context.Context, sel ast.SelectionSet, v *dto.Condition) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._Condition(ctx, sel, v) +} + func (ec *executionContext) marshalOConditionConnection2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐConditionConnection(ctx context.Context, sel ast.SelectionSet, v *dto.ConditionConnection) graphql.Marshaler { if v == nil { return graphql.Null @@ -39242,6 +39747,10 @@ func (ec *executionContext) marshalOPageInfo2githubᚗcomᚋsavannahghiᚋclinic return ec._PageInfo(ctx, sel, &v) } +func (ec *executionContext) marshalOPatient2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPatient(ctx context.Context, sel ast.SelectionSet, v dto.Patient) graphql.Marshaler { + return ec._Patient(ctx, sel, &v) +} + func (ec *executionContext) marshalOPeriod2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPeriod(ctx context.Context, sel ast.SelectionSet, v *dto.Period) graphql.Marshaler { if v == nil { return graphql.Null diff --git a/pkg/clinical/presentation/graph/types.graphql b/pkg/clinical/presentation/graph/types.graphql index d83e3b2b..8c3f7373 100644 --- a/pkg/clinical/presentation/graph/types.graphql +++ b/pkg/clinical/presentation/graph/types.graphql @@ -547,4 +547,11 @@ type EncounterAssociatedResources { riskAssessment: RiskAssessment consent: Consent observation: Observation +} + +type PatientMedicationHistoryOutput { + observations: [Observation] + conditions: [Condition] + patient: Patient + medications: [MedicationStatement] } \ No newline at end of file diff --git a/pkg/clinical/repository/repository.go b/pkg/clinical/repository/repository.go index 8e4a7465..5514f15c 100644 --- a/pkg/clinical/repository/repository.go +++ b/pkg/clinical/repository/repository.go @@ -56,7 +56,7 @@ type FHIREpisodeOfCare interface { } type FHIRObservation interface { GetFHIRObservation(ctx context.Context, id string) (*domain.FHIRObservationRelayPayload, error) - SearchFHIRObservation(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) + SearchFHIRObservation(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) CreateFHIRObservation(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) DeleteFHIRObservation(ctx context.Context, id string) (bool, error) SearchPatientObservations(ctx context.Context, searchParameters map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) @@ -81,7 +81,7 @@ type FHIRMedicationRequest interface { DeleteFHIRMedicationRequest(ctx context.Context, id string) (bool, error) } type FHIRCondition interface { - SearchFHIRCondition(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) + SearchFHIRCondition(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) CreateFHIRCondition(ctx context.Context, input domain.FHIRConditionInput) (*domain.FHIRConditionRelayPayload, error) UpdateFHIRCondition(ctx context.Context, input domain.FHIRConditionInput) (*domain.FHIRConditionRelayPayload, error) } @@ -106,7 +106,7 @@ type FHIRComposition interface { } type FHIRMedicationStatement interface { CreateFHIRMedicationStatement(ctx context.Context, input domain.FHIRMedicationStatementInput) (*domain.FHIRMedicationStatementRelayPayload, error) - SearchFHIRMedicationStatement(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) + SearchFHIRMedicationStatement(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) } type FHIRMedication interface { diff --git a/pkg/clinical/usecases/clinical/condition.go b/pkg/clinical/usecases/clinical/condition.go index 6fcefa88..12f5d484 100644 --- a/pkg/clinical/usecases/clinical/condition.go +++ b/pkg/clinical/usecases/clinical/condition.go @@ -214,7 +214,7 @@ func (c UseCasesClinicalImpl) ListPatientConditions(ctx context.Context, patient params["recorded-date"] = date.AsTime().Format(dateFormatStr) } - conditionsResponse, err := c.infrastructure.FHIR.SearchFHIRCondition(ctx, params, *identifiers, pagination) + conditionsResponse, err := c.infrastructure.FHIR.SearchFHIRCondition(ctx, params, identifiers, pagination) if err != nil { return nil, err } diff --git a/pkg/clinical/usecases/clinical/condition_test.go b/pkg/clinical/usecases/clinical/condition_test.go index e5a56464..51693b80 100644 --- a/pkg/clinical/usecases/clinical/condition_test.go +++ b/pkg/clinical/usecases/clinical/condition_test.go @@ -588,7 +588,7 @@ func TestUseCasesClinicalImpl_ListPatientConditions(t *testing.T) { } if tt.name == "sad case: fail to search condition" { - fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { + fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { return nil, fmt.Errorf("failed to find condition") } } diff --git a/pkg/clinical/usecases/clinical/patient.go b/pkg/clinical/usecases/clinical/patient.go index f2b2f6d2..089c42d6 100644 --- a/pkg/clinical/usecases/clinical/patient.go +++ b/pkg/clinical/usecases/clinical/patient.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/google/uuid" "github.com/savannahghi/clinical/pkg/clinical/application/extensions" "github.com/savannahghi/scalarutils" @@ -55,7 +56,7 @@ func (c *UseCasesClinicalImpl) GetMedicalData(ctx context.Context, patientID str for _, field := range fields { switch field { case "Regimen": - conn, err := c.infrastructure.FHIR.SearchFHIRMedicationStatement(ctx, filterParams, *identifiers, dto.Pagination{Skip: true}) + conn, err := c.infrastructure.FHIR.SearchFHIRMedicationStatement(ctx, filterParams, identifiers, dto.Pagination{Skip: true}) if err != nil { utils.ReportErrorToSentry(err) return nil, fmt.Errorf("%s search error: %w", field, err) @@ -130,7 +131,7 @@ func (c *UseCasesClinicalImpl) GetMedicalData(ctx context.Context, patientID str case "Weight": filterParams["code"] = common.WeightCIELTerminologyCode - conn, err := c.infrastructure.FHIR.SearchFHIRObservation(ctx, filterParams, *identifiers, dto.Pagination{Skip: true}) + conn, err := c.infrastructure.FHIR.SearchFHIRObservation(ctx, filterParams, identifiers, dto.Pagination{Skip: true}) if err != nil { utils.ReportErrorToSentry(err) return nil, fmt.Errorf("%s search error: %w", field, err) @@ -145,7 +146,7 @@ func (c *UseCasesClinicalImpl) GetMedicalData(ctx context.Context, patientID str case "BMI": filterParams["code"] = common.BMICIELTerminologyCode - conn, err := c.infrastructure.FHIR.SearchFHIRObservation(ctx, filterParams, *identifiers, dto.Pagination{Skip: true}) + conn, err := c.infrastructure.FHIR.SearchFHIRObservation(ctx, filterParams, identifiers, dto.Pagination{Skip: true}) if err != nil { utils.ReportErrorToSentry(err) return nil, fmt.Errorf("%s search error: %w", field, err) @@ -160,7 +161,7 @@ func (c *UseCasesClinicalImpl) GetMedicalData(ctx context.Context, patientID str case "ViralLoad": filterParams["code"] = common.ViralLoadCIELTerminologyCode - conn, err := c.infrastructure.FHIR.SearchFHIRObservation(ctx, filterParams, *identifiers, dto.Pagination{Skip: true}) + conn, err := c.infrastructure.FHIR.SearchFHIRObservation(ctx, filterParams, identifiers, dto.Pagination{Skip: true}) if err != nil { utils.ReportErrorToSentry(err) return nil, fmt.Errorf("%s search error: %w", field, err) @@ -175,7 +176,7 @@ func (c *UseCasesClinicalImpl) GetMedicalData(ctx context.Context, patientID str case "CD4Count": filterParams["code"] = common.CD4CountCIELTerminologyCode - conn, err := c.infrastructure.FHIR.SearchFHIRObservation(ctx, filterParams, *identifiers, dto.Pagination{Skip: true}) + conn, err := c.infrastructure.FHIR.SearchFHIRObservation(ctx, filterParams, identifiers, dto.Pagination{Skip: true}) if err != nil { utils.ReportErrorToSentry(err) return nil, fmt.Errorf("%s search error: %w", field, err) @@ -511,3 +512,104 @@ func mapFHIRPatientToPatientDTO(patient *domain.FHIRPatient) *dto.Patient { BirthDate: *patient.BirthDate, } } + +// PatientMedicationHistory is used to retrieve all the patient clinical information. From Observations, Conditions, +// MedicationStatement etc. relevant to referral from one facility to another. +func (c *UseCasesClinicalImpl) PatientMedicationHistory(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.PatientMedicationHistoryOutput, error) { + _, err := uuid.Parse(patientID) + if err != nil { + return nil, fmt.Errorf("invalid patient id: %s", patientID) + } + + patient, err := c.infrastructure.FHIR.GetFHIRPatient(ctx, patientID) + if err != nil { + return nil, err + } + + patientReference := fmt.Sprintf("Patient/%s", *patient.Resource.ID) + + searchParams := map[string]interface{}{ + "patient": patientReference, + } + + identifiers, err := c.infrastructure.BaseExtension.GetTenantIdentifiers(ctx) + if err != nil { + return nil, fmt.Errorf("failed to get tenant identifiers from context: %w", err) + } + + observationsChan := make(chan *domain.PagedFHIRObservations) + conditionsChan := make(chan *domain.PagedFHIRCondition) + medicationStatementsChan := make(chan *domain.FHIRMedicationStatementRelayConnection) + errChan := make(chan error, 3) + + go func() { + result, err := c.infrastructure.FHIR.SearchFHIRObservation(ctx, searchParams, identifiers, *pagination) + if err != nil { + errChan <- err + return + } + observationsChan <- result + }() + + go func() { + result, err := c.infrastructure.FHIR.SearchFHIRCondition(ctx, searchParams, nil, *pagination) + if err != nil { + errChan <- err + return + } + conditionsChan <- result + }() + + go func() { + result, err := c.infrastructure.FHIR.SearchFHIRMedicationStatement(ctx, searchParams, nil, *pagination) + if err != nil { + errChan <- err + return + } + medicationStatementsChan <- result + }() + + var observations *domain.PagedFHIRObservations + + var conditions *domain.PagedFHIRCondition + + var medicationStatements *domain.FHIRMedicationStatementRelayConnection + + // ensure whichever goroutine finishes first is processed, whether it returns a result or an error. + for i := 0; i < 3; i++ { + select { + case obs := <-observationsChan: + observations = obs + case conds := <-conditionsChan: + conditions = conds + case meds := <-medicationStatementsChan: + medicationStatements = meds + case err := <-errChan: + return nil, err + } + } + + var conditionsResult []*dto.Condition + for _, item := range conditions.Conditions { + conditionsResult = append(conditionsResult, mapFHIRConditionToConditionDTO(item)) + } + + var observationList []*dto.Observation + for _, item := range observations.Observations { + observationList = append(observationList, mapFHIRObservationToObservationDTO(item)) + } + + var medicationStatement []*dto.MedicationStatement + for _, item := range medicationStatements.Edges { + medicationStatement = append(medicationStatement, mapFHIRMedicationStatementToMedicationStatementDTO(item.Node)) + } + + output := &dto.PatientMedicationHistoryOutput{ + Conditions: conditionsResult, + Observations: observationList, + Patient: *mapFHIRPatientToPatientDTO(patient.Resource), + Medications: medicationStatement, + } + + return output, nil +} diff --git a/pkg/clinical/usecases/clinical/patient_unit_test.go b/pkg/clinical/usecases/clinical/patient_unit_test.go index 24fe44a4..057b1920 100644 --- a/pkg/clinical/usecases/clinical/patient_unit_test.go +++ b/pkg/clinical/usecases/clinical/patient_unit_test.go @@ -338,7 +338,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { u := clinicalUsecase.NewUseCasesClinicalImpl(infra) if tt.name == "Happy Case - Successfully search medication statement" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive code := "123" system := gofakeit.URL() @@ -405,7 +405,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search medication statement - nil node" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ { @@ -418,7 +418,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search medication statement - nil node id" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive code := "123" return &domain.FHIRMedicationStatementRelayConnection{ @@ -445,7 +445,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } } if tt.name == "Sad Case - Fail to search medication statement - nil status" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { code := "123" return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ @@ -469,7 +469,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } } if tt.name == "Sad Case - Fail to search medication statement - nil coding" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ @@ -492,7 +492,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } } if tt.name == "Sad Case - Fail to search medication statement - empty coding" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ @@ -516,7 +516,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } } if tt.name == "Sad Case - Fail to search medication statement - nil subject id" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive code := "123" return &domain.FHIRMedicationStatementRelayConnection{ @@ -543,7 +543,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search medication statement" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { return nil, fmt.Errorf("failed to search medication statement") } } @@ -967,7 +967,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Happy Case - Successfully search observation" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal instant := gofakeit.TimeZone() valueConcept := "222" @@ -1043,7 +1043,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search observation - nil id" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal valueConcept := "222" UUID := gofakeit.UUID() @@ -1113,7 +1113,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search observation - nil coding" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal valueConcept := "222" UUID := gofakeit.UUID() @@ -1184,7 +1184,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search observation - empty coding" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal valueConcept := "222" UUID := gofakeit.UUID() @@ -1256,7 +1256,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search observation - nil status" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { valueConcept := "222" instant := gofakeit.TimeZone() UUID := gofakeit.UUID() @@ -1327,7 +1327,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search observation - nil subject" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal valueConcept := "222" UUID := gofakeit.UUID() @@ -1398,7 +1398,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search observation - nil subject id" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal valueConcept := "222" UUID := gofakeit.UUID() @@ -1470,7 +1470,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search observation - nil encounter" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal instant := gofakeit.TimeZone() valueConcept := "222" @@ -1543,7 +1543,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search observation - nil status" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal valueConcept := "222" instant := gofakeit.TimeZone() @@ -1616,7 +1616,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } } if tt.name == "Sad Case - Fail to search weight" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { if params["code"] == common.WeightCIELTerminologyCode { return nil, fmt.Errorf("failed to search observation") } @@ -1633,7 +1633,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search BMI" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { if params["code"] == common.BMICIELTerminologyCode { return nil, fmt.Errorf("failed to search observation") } @@ -1650,7 +1650,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search viralLoad" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { if params["code"] == common.ViralLoadCIELTerminologyCode { return nil, fmt.Errorf("failed to search observation") } @@ -1667,7 +1667,7 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { } if tt.name == "Sad Case - Fail to search cd4Count" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { if params["code"] == common.CD4CountCIELTerminologyCode { return nil, fmt.Errorf("failed to search observation") } @@ -2133,3 +2133,140 @@ func TestUseCasesClinicalImpl_DeletePatient(t *testing.T) { }) } } + +func TestUseCasesClinicalImpl_PatientMedicationHistory(t *testing.T) { + firstTen := 10 + type args struct { + ctx context.Context + patientID string + pagination *dto.Pagination + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Happy case: get patient medical information", + args: args{ + ctx: addTenantIdentifierContext(context.Background()), + patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &firstTen, + }, + }, + wantErr: false, + }, + { + name: "Sad case: invalid patient ID", + args: args{ + ctx: addTenantIdentifierContext(context.Background()), + patientID: "1", + pagination: &dto.Pagination{ + First: &firstTen, + }, + }, + wantErr: true, + }, + { + name: "Sad case: unable to get patient medical information", + args: args{ + ctx: addTenantIdentifierContext(context.Background()), + patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &firstTen, + }, + }, + wantErr: true, + }, + { + name: "Sad case: unable to get patient observations", + args: args{ + ctx: addTenantIdentifierContext(context.Background()), + patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &firstTen, + }, + }, + wantErr: true, + }, + { + name: "Sad case: unable to get patient conditions", + args: args{ + ctx: addTenantIdentifierContext(context.Background()), + patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &firstTen, + }, + }, + wantErr: true, + }, + { + name: "Sad case: unable to get patient medication statement", + args: args{ + ctx: addTenantIdentifierContext(context.Background()), + patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &firstTen, + }, + }, + wantErr: true, + }, + { + name: "Sad case: unable to get tenant identifiers from context", + args: args{ + ctx: addTenantIdentifierContext(context.Background()), + patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &firstTen, + }, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + fakeExt := fakeExtMock.NewFakeBaseExtensionMock() + fakeFHIR := fakeFHIRMock.NewFHIRMock() + fakeOCL := fakeOCLMock.NewFakeOCLMock() + fakePubSub := fakePubSubMock.NewPubSubServiceMock() + fakeUpload := fakeUploadMock.NewFakeUploadMock() + fakeAdvantage := fakeAdvantageMock.NewFakeAdvantageMock() + + infra := infrastructure.NewInfrastructureInteractor(fakeExt, fakeFHIR, fakeOCL, fakeUpload, fakePubSub, fakeAdvantage) + u := clinicalUsecase.NewUseCasesClinicalImpl(infra) + + if tt.name == "Sad case: unable to get patient medical information" { + fakeFHIR.MockGetFHIRPatientFn = func(ctx context.Context, id string) (*domain.FHIRPatientRelayPayload, error) { + return nil, fmt.Errorf("failed to get patient") + } + } + if tt.name == "Sad case: unable to get patient observations" { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + return nil, fmt.Errorf("failed to get patient observations") + } + } + if tt.name == "Sad case: unable to get patient conditions" { + fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { + return nil, fmt.Errorf("failed to get patient conditions") + } + } + if tt.name == "Sad case: unable to get patient medication statement" { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + return nil, fmt.Errorf("failed to get patient medications") + } + } + if tt.name == "Sad case: unable to get tenant identifiers from context" { + fakeExt.MockGetTenantIdentifiersFn = func(ctx context.Context) (*dto.TenantIdentifiers, error) { + return nil, fmt.Errorf("failed to get tenant identifiers") + } + } + + _, err := u.PatientMedicationHistory(tt.args.ctx, tt.args.patientID, tt.args.pagination) + if (err != nil) != tt.wantErr { + t.Errorf("UseCasesClinicalImpl.PatientMedicationHistory() error = %v, wantErr %v", err, tt.wantErr) + return + } + }) + } +} diff --git a/pkg/clinical/usecases/clinical/timeline.go b/pkg/clinical/usecases/clinical/timeline.go index 53208bcc..021ecf31 100644 --- a/pkg/clinical/usecases/clinical/timeline.go +++ b/pkg/clinical/usecases/clinical/timeline.go @@ -102,7 +102,7 @@ func (c *UseCasesClinicalImpl) PatientTimeline(ctx context.Context, patientID st observationResourceFunc := func(wg *sync.WaitGroup, mut *sync.Mutex) { defer wg.Done() - conn, err := c.infrastructure.FHIR.SearchFHIRObservation(ctx, patientFilterParams, *identifiers, dto.Pagination{Skip: true}) + conn, err := c.infrastructure.FHIR.SearchFHIRObservation(ctx, patientFilterParams, identifiers, dto.Pagination{Skip: true}) if err != nil { utils.ReportErrorToSentry(err) log.Errorf("Observation search error: %v", err) @@ -164,7 +164,7 @@ func (c *UseCasesClinicalImpl) PatientTimeline(ctx context.Context, patientID st medicationStatementResourceFunc := func(wg *sync.WaitGroup, mut *sync.Mutex) { defer wg.Done() - conn, err := c.infrastructure.FHIR.SearchFHIRMedicationStatement(ctx, patientFilterParams, *identifiers, dto.Pagination{Skip: true}) + conn, err := c.infrastructure.FHIR.SearchFHIRMedicationStatement(ctx, patientFilterParams, identifiers, dto.Pagination{Skip: true}) if err != nil { utils.ReportErrorToSentry(err) log.Errorf("MedicationStatement search error: %v", err) @@ -234,7 +234,7 @@ func (c *UseCasesClinicalImpl) PatientTimeline(ctx context.Context, patientID st conditionResourceFunc := func(wg *sync.WaitGroup, mut *sync.Mutex) { defer wg.Done() - conn, err := c.infrastructure.FHIR.SearchFHIRCondition(ctx, patientFilterParams, *identifiers, dto.Pagination{Skip: true}) + conn, err := c.infrastructure.FHIR.SearchFHIRCondition(ctx, patientFilterParams, identifiers, dto.Pagination{Skip: true}) if err != nil { utils.ReportErrorToSentry(err) log.Errorf("Condition search error: %v", err) diff --git a/pkg/clinical/usecases/clinical/timeline_test.go b/pkg/clinical/usecases/clinical/timeline_test.go index f1d7e3f1..85608e0d 100644 --- a/pkg/clinical/usecases/clinical/timeline_test.go +++ b/pkg/clinical/usecases/clinical/timeline_test.go @@ -381,7 +381,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { }, nil } - fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { + fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { id := gofakeit.UUID() statusSystem := scalarutils.URI("http://terminology.hl7.org/CodeSystem/condition-clinical") status := "inactive" @@ -457,7 +457,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { }, nil } - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal return &domain.PagedFHIRObservations{ Observations: []domain.FHIRObservation{ @@ -485,7 +485,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { }, nil } - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ @@ -921,13 +921,13 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to search observation" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { return &domain.PagedFHIRObservations{}, fmt.Errorf("failed to get observation") } } if tt.name == "Sad Case - Fail to get observation - nil node id" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal return &domain.PagedFHIRObservations{ Observations: []domain.FHIRObservation{ @@ -956,7 +956,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to get observation - nil coding" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal return &domain.PagedFHIRObservations{ Observations: []domain.FHIRObservation{ @@ -983,7 +983,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to get observation - empty coding" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal return &domain.PagedFHIRObservations{ Observations: []domain.FHIRObservation{ @@ -1011,7 +1011,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to get observation - nil status" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { return &domain.PagedFHIRObservations{ Observations: []domain.FHIRObservation{ { @@ -1039,7 +1039,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to get observation - nil date" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal return &domain.PagedFHIRObservations{ Observations: []domain.FHIRObservation{ @@ -1069,7 +1069,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to get observation - invalid date" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal return &domain.PagedFHIRObservations{ Observations: []domain.FHIRObservation{ @@ -1094,13 +1094,13 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to search medication statement" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { return &domain.FHIRMedicationStatementRelayConnection{}, fmt.Errorf("failed to get medication statement") } } if tt.name == "Sad Case - Fail to search medication statement - nil node" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ { @@ -1112,7 +1112,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } } if tt.name == "Sad Case - Fail to search medication statement - nil node id" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ @@ -1138,7 +1138,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to search medication statement - nil concept" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ @@ -1160,7 +1160,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to search medication statement - nil coding" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ @@ -1183,7 +1183,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to search medication statement - empty coding" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ @@ -1208,7 +1208,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to search medication statement - nil status" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ { @@ -1233,7 +1233,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to search medication statement - nil date" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ @@ -1259,7 +1259,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to search medication statement - nil subject" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ @@ -1283,7 +1283,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to search medication statement - invalid date" { - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{ @@ -1310,13 +1310,13 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to search condition" { - fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { + fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { return &domain.PagedFHIRCondition{}, fmt.Errorf("failed to get condition") } } if tt.name == "Sad Case - Fail to get condition - nil node id" { - fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { + fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { statusSystem := scalarutils.URI("http://terminology.hl7.org/CodeSystem/condition-clinical") status := "inactive" uri := scalarutils.URI("1234567345") @@ -1356,7 +1356,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to get condition - nil code" { - fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { + fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { id := gofakeit.UUID() return &domain.PagedFHIRCondition{ Conditions: []domain.FHIRCondition{ @@ -1378,7 +1378,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to get condition - nil code coding" { - fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { + fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { id := gofakeit.UUID() return &domain.PagedFHIRCondition{ Conditions: []domain.FHIRCondition{ @@ -1399,7 +1399,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to get condition - nil category" { - fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { + fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { id := gofakeit.UUID() uri := scalarutils.URI("1234567345") codingCode := "1234" @@ -1430,7 +1430,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to get condition - nil onset datetime" { - fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { + fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { id := gofakeit.UUID() uri := scalarutils.URI("1234567345") codingCode := "1234" @@ -1477,7 +1477,7 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { } if tt.name == "Sad Case - Fail to get condition - nil note" { - fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { + fakeFHIR.MockSearchFHIRConditionFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRCondition, error) { id := gofakeit.UUID() uri := scalarutils.URI("1234567345") note := scalarutils.Markdown("Fever Fever") @@ -1637,7 +1637,7 @@ func TestClinicalUseCaseImpl_PatientHealthTimeline(t *testing.T) { }, nil } - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal return &domain.PagedFHIRObservations{ Observations: []domain.FHIRObservation{ @@ -1665,7 +1665,7 @@ func TestClinicalUseCaseImpl_PatientHealthTimeline(t *testing.T) { }, nil } - fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { + fakeFHIR.MockSearchFHIRMedicationStatementFn = func(ctx context.Context, params map[string]interface{}, tenant *dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRMedicationStatementRelayConnection, error) { status := dto.MedicationStatementStatusEnumActive return &domain.FHIRMedicationStatementRelayConnection{ Edges: []*domain.FHIRMedicationStatementRelayEdge{