diff --git a/pkg/clinical/domain/observation.go b/pkg/clinical/domain/observation.go index f66c23c9..483241df 100644 --- a/pkg/clinical/domain/observation.go +++ b/pkg/clinical/domain/observation.go @@ -3,7 +3,6 @@ package domain import ( "time" - "github.com/savannahghi/firebasetools" "github.com/savannahghi/scalarutils" ) @@ -407,21 +406,12 @@ type FHIRObservationReferencerangeInput struct { Text *string `json:"text,omitempty"` } -// FHIRObservationRelayConnection is a Relay connection for Observation -type FHIRObservationRelayConnection struct { - Edges []*FHIRObservationRelayEdge `json:"edges,omitempty"` - - PageInfo *firebasetools.PageInfo `json:"pageInfo,omitempty"` -} - -// FHIRObservationRelayEdge is a Relay edge for Observation -type FHIRObservationRelayEdge struct { - Cursor *string `json:"cursor,omitempty"` - - Node *FHIRObservation `json:"node,omitempty"` -} - -// FHIRObservationRelayPayload is used to return single instances of Observation -type FHIRObservationRelayPayload struct { - Resource *FHIRObservation `json:"resource,omitempty"` +// PagedFHIRAllergy is an allergy's paginaton dataclass +type PagedFHIRObservations struct { + Observations []FHIRObservation + HasNextPage bool + NextCursor string + HasPreviousPage bool + PreviousCursor string + TotalCount int } diff --git a/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir.go b/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir.go index 622a6771..7dcba0d8 100644 --- a/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir.go +++ b/pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir.go @@ -69,7 +69,7 @@ func (fh StoreImpl) SearchPatientObservations( observationCode string, tenant dto.TenantIdentifiers, pagination dto.Pagination, -) ([]*domain.FHIRObservation, error) { +) (*domain.PagedFHIRObservations, error) { params := map[string]interface{}{ "patient": patientReference, "code": observationCode, @@ -80,7 +80,14 @@ func (fh StoreImpl) SearchPatientObservations( return nil, err } - output := []*domain.FHIRObservation{} + observationOutput := domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{}, + HasNextPage: observations.HasNextPage, + NextCursor: observations.NextCursor, + HasPreviousPage: observations.HasPreviousPage, + PreviousCursor: observations.PreviousCursor, + TotalCount: observations.TotalCount, + } for _, obs := range observations.Resources { var observation domain.FHIRObservation @@ -95,10 +102,10 @@ func (fh StoreImpl) SearchPatientObservations( return nil, fmt.Errorf("unable to unmarshal resource: %w", err) } - output = append(output, &observation) + observationOutput.Observations = append(observationOutput.Observations, observation) } - return output, nil + return &observationOutput, nil } // Encounters returns encounters that belong to the indicated patient. @@ -1081,14 +1088,21 @@ 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.FHIRObservationRelayConnection, error) { - output := domain.FHIRObservationRelayConnection{} - +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 } + observationOutput := domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{}, + HasNextPage: resources.HasNextPage, + NextCursor: resources.NextCursor, + HasPreviousPage: resources.HasPreviousPage, + PreviousCursor: resources.PreviousCursor, + TotalCount: resources.TotalCount, + } + for _, result := range resources.Resources { var resource domain.FHIRObservation @@ -1103,16 +1117,14 @@ func (fh StoreImpl) SearchFHIRObservation(_ context.Context, params map[string]i "server error: Unable to unmarshal %s: %w", observationResourceType, err) } - output.Edges = append(output.Edges, &domain.FHIRObservationRelayEdge{ - Node: &resource, - }) + observationOutput.Observations = append(observationOutput.Observations, resource) } - return &output, nil + return &observationOutput, nil } // CreateFHIRObservation creates a FHIRObservation instance -func (fh StoreImpl) CreateFHIRObservation(_ context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { +func (fh StoreImpl) CreateFHIRObservation(_ context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { payload, err := converterandformatter.StructToMap(input) if err != nil { return nil, fmt.Errorf("unable to turn %s input into a map: %w", observationResourceType, err) @@ -1125,11 +1137,7 @@ func (fh StoreImpl) CreateFHIRObservation(_ context.Context, input domain.FHIROb return nil, fmt.Errorf("unable to create/update %s resource: %w", observationResourceType, err) } - output := &domain.FHIRObservationRelayPayload{ - Resource: resource, - } - - return output, nil + return resource, nil } // DeleteFHIRObservation deletes the FHIRObservation identified by the passed ID diff --git a/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go b/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go index 696b0f10..fc6e4a21 100644 --- a/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go +++ b/pkg/clinical/infrastructure/datastore/cloudhealthcare/mock/fhir_mock.go @@ -55,8 +55,8 @@ 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.FHIRObservationRelayConnection, error) - MockCreateFHIRObservationFn func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, 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) MockDeleteFHIRObservationFn func(ctx context.Context, id string) (bool, error) MockGetFHIRPatientFn func(ctx context.Context, id string) (*domain.FHIRPatientRelayPayload, error) MockDeleteFHIRPatientFn func(ctx context.Context, id string) (bool, error) @@ -69,7 +69,7 @@ type FHIRMock struct { MockPatchFHIRPatientFn func(ctx context.Context, id string, params []map[string]interface{}) (*domain.FHIRPatient, error) MockUpdateFHIREpisodeOfCareFn func(ctx context.Context, fhirResourceID string, payload map[string]interface{}) (*domain.FHIREpisodeOfCare, error) MockSearchFHIRPatientFn func(ctx context.Context, searchParams string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PatientConnection, error) - MockSearchPatientObservationsFn func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIRObservation, error) + MockSearchPatientObservationsFn func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) MockGetFHIRAllergyIntoleranceFn func(ctx context.Context, id string) (*domain.FHIRAllergyIntoleranceRelayPayload, error) MockSearchPatientAllergyIntoleranceFn func(ctx context.Context, patientReference string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRAllergy, error) } @@ -716,91 +716,90 @@ 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.FHIRObservationRelayConnection, 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 - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: &uuid, - Status: &finalStatus, - Subject: &domain.FHIRReference{ - ID: &uuid, - }, - Encounter: &domain.FHIRReference{ - ID: &uuid, - }, + ID: &uuid, + Status: &finalStatus, + Subject: &domain.FHIRReference{ + ID: &uuid, + }, + Encounter: &domain.FHIRReference{ + ID: &uuid, }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil }, - MockCreateFHIRObservationFn: func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + MockCreateFHIRObservationFn: func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { uuid := uuid.New().String() finalStatus := domain.ObservationStatusEnumFinal - return &domain.FHIRObservationRelayPayload{ - Resource: &domain.FHIRObservation{ - ID: new(string), - Text: &domain.FHIRNarrative{}, - Identifier: []*domain.FHIRIdentifier{}, - BasedOn: []*domain.FHIRReference{}, - PartOf: []*domain.FHIRReference{}, - Category: []*domain.FHIRCodeableConcept{}, - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{ - { - ID: new(string), - Version: new(string), - Code: "", - Display: "Vital", - UserSelected: new(bool), - }, + return &domain.FHIRObservation{ + ID: new(string), + Text: &domain.FHIRNarrative{}, + Identifier: []*domain.FHIRIdentifier{}, + BasedOn: []*domain.FHIRReference{}, + PartOf: []*domain.FHIRReference{}, + Category: []*domain.FHIRCodeableConcept{}, + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{ + { + ID: new(string), + Version: new(string), + Code: "", + Display: "Vital", + UserSelected: new(bool), }, - Text: "", - }, - Subject: &domain.FHIRReference{ - ID: &uuid, - }, - Status: &finalStatus, - Focus: []*domain.FHIRReference{}, - Encounter: &domain.FHIRReference{ - ID: &uuid, }, - EffectiveDateTime: &scalarutils.Date{}, - EffectivePeriod: &domain.FHIRPeriod{}, - EffectiveTiming: &domain.FHIRTiming{}, - Performer: []*domain.FHIRReference{}, - ValueQuantity: &domain.FHIRQuantity{}, - ValueCodeableConcept: (*scalarutils.Code)(&uuid), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{}, - ValueRatio: &domain.FHIRRatio{}, - ValueSampledData: &domain.FHIRSampledData{ - ID: &uuid, - }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{}, - ValuePeriod: &domain.FHIRPeriod{}, - DataAbsentReason: &domain.FHIRCodeableConcept{}, - Interpretation: []*domain.FHIRCodeableConcept{}, - Note: []*domain.FHIRAnnotation{}, - BodySite: &domain.FHIRCodeableConcept{}, - Method: &domain.FHIRCodeableConcept{}, - Specimen: &domain.FHIRReference{}, - Device: &domain.FHIRReference{}, - ReferenceRange: []*domain.FHIRObservationReferencerange{}, - HasMember: []*domain.FHIRReference{}, - DerivedFrom: []*domain.FHIRReference{}, - Component: []*domain.FHIRObservationComponent{}, - Meta: &domain.FHIRMeta{}, - Extension: []*domain.FHIRExtension{}, + Text: "", + }, + Subject: &domain.FHIRReference{ + ID: &uuid, + }, + Status: &finalStatus, + Focus: []*domain.FHIRReference{}, + Encounter: &domain.FHIRReference{ + ID: &uuid, }, + EffectiveDateTime: &scalarutils.Date{}, + EffectivePeriod: &domain.FHIRPeriod{}, + EffectiveTiming: &domain.FHIRTiming{}, + Performer: []*domain.FHIRReference{}, + ValueQuantity: &domain.FHIRQuantity{}, + ValueCodeableConcept: (*scalarutils.Code)(&uuid), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{}, + ValueRatio: &domain.FHIRRatio{}, + ValueSampledData: &domain.FHIRSampledData{ + ID: &uuid, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{}, + ValuePeriod: &domain.FHIRPeriod{}, + DataAbsentReason: &domain.FHIRCodeableConcept{}, + Interpretation: []*domain.FHIRCodeableConcept{}, + Note: []*domain.FHIRAnnotation{}, + BodySite: &domain.FHIRCodeableConcept{}, + Method: &domain.FHIRCodeableConcept{}, + Specimen: &domain.FHIRReference{}, + Device: &domain.FHIRReference{}, + ReferenceRange: []*domain.FHIRObservationReferencerange{}, + HasMember: []*domain.FHIRReference{}, + DerivedFrom: []*domain.FHIRReference{}, + Component: []*domain.FHIRObservationComponent{}, + Meta: &domain.FHIRMeta{}, + Extension: []*domain.FHIRExtension{}, }, nil }, MockDeleteFHIRObservationFn: func(ctx context.Context, id string) (bool, error) { @@ -925,32 +924,41 @@ func NewFHIRMock() *FHIRMock { PageInfo: &firebasetools.PageInfo{}, }, nil }, - MockSearchPatientObservationsFn: func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIRObservation, error) { + MockSearchPatientObservationsFn: func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { uuid := uuid.New().String() finalStatus := domain.ObservationStatusEnumFinal - return []*domain.FHIRObservation{{ - ID: &uuid, - Status: &finalStatus, - Subject: &domain.FHIRReference{ - ID: &uuid, - }, - Encounter: &domain.FHIRReference{ - ID: &uuid, - }, - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{ - { - ID: new(string), - Version: new(string), - Code: "", - Display: "Vital", - UserSelected: new(bool), + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ + { + ID: &uuid, + Status: &finalStatus, + Subject: &domain.FHIRReference{ + ID: &uuid, + }, + Encounter: &domain.FHIRReference{ + ID: &uuid, + }, + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{ + { + ID: new(string), + Version: new(string), + Code: "", + Display: "Vital", + UserSelected: new(bool), + }, + }, + Text: "", }, }, - Text: "", }, - }}, nil + HasNextPage: true, + NextCursor: "", + HasPreviousPage: true, + PreviousCursor: "", + TotalCount: 0, + }, nil }, } } @@ -1126,12 +1134,12 @@ 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.FHIRObservationRelayConnection, 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) } // CreateFHIRObservation is a mock implementation of CreateFHIRObservation method -func (fh *FHIRMock) CreateFHIRObservation(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { +func (fh *FHIRMock) CreateFHIRObservation(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return fh.MockCreateFHIRObservationFn(ctx, input) } @@ -1201,7 +1209,7 @@ func (fh *FHIRMock) SearchFHIRPatient(ctx context.Context, searchParams string, } // SearchPatientObservations mocks the implementation of searching patient observations -func (fh *FHIRMock) SearchPatientObservations(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIRObservation, error) { +func (fh *FHIRMock) SearchPatientObservations(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { return fh.MockSearchPatientObservationsFn(ctx, patientReference, conceptID, tenant, pagination) } diff --git a/pkg/clinical/presentation/graph/clinical.graphql b/pkg/clinical/presentation/graph/clinical.graphql index 0281e4e3..c6fe6a1b 100644 --- a/pkg/clinical/presentation/graph/clinical.graphql +++ b/pkg/clinical/presentation/graph/clinical.graphql @@ -11,13 +11,13 @@ extend type Query { listPatientEncounters(patientID: String!, pagination: Pagination!): EncounterConnection # Observation - getPatientTemperatureEntries(patientID: String!): [Observation!] - getPatientBloodPressureEntries(patientID: String!): [Observation!] - getPatientHeightEntries(patientID: String!): [Observation!] - getPatientRespiratoryRateEntries(patientID: String!): [Observation!] - getPatientPulseRateEntries(patientID: String!): [Observation!] - getPatientBMIEntries(patientID: String!): [Observation!] - getPatientWeightEntries(patientID: String!): [Observation!] + getPatientTemperatureEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientBloodPressureEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientHeightEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientRespiratoryRateEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientPulseRateEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientBMIEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientWeightEntries(patientID: String!, pagination: Pagination!): ObservationConnection # Allergy searchAllergy(name: String!, pagination: Pagination!): TerminologyConnection diff --git a/pkg/clinical/presentation/graph/clinical.resolvers.go b/pkg/clinical/presentation/graph/clinical.resolvers.go index 8f43d581..2d5ba6e6 100644 --- a/pkg/clinical/presentation/graph/clinical.resolvers.go +++ b/pkg/clinical/presentation/graph/clinical.resolvers.go @@ -130,42 +130,42 @@ func (r *queryResolver) ListPatientEncounters(ctx context.Context, patientID str } // GetPatientTemperatureEntries is the resolver for the getPatientTemperatureEntries field. -func (r *queryResolver) GetPatientTemperatureEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { +func (r *queryResolver) GetPatientTemperatureEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) { r.CheckDependencies() - return r.usecases.Clinical.GetPatientTemperatureEntries(ctx, patientID) + return r.usecases.Clinical.GetPatientTemperatureEntries(ctx, patientID, &pagination) } // GetPatientBloodPressureEntries is the resolver for the getPatientBloodPressureEntries field. -func (r *queryResolver) GetPatientBloodPressureEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { +func (r *queryResolver) GetPatientBloodPressureEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) { r.CheckDependencies() - return r.usecases.Clinical.GetPatientBloodPressureEntries(ctx, patientID) + return r.usecases.Clinical.GetPatientBloodPressureEntries(ctx, patientID, &pagination) } // GetPatientHeightEntries is the resolver for the getPatientHeightEntries field. -func (r *queryResolver) GetPatientHeightEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { - return r.usecases.Clinical.GetPatientHeightEntries(ctx, patientID) +func (r *queryResolver) GetPatientHeightEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) { + return r.usecases.Clinical.GetPatientHeightEntries(ctx, patientID, &pagination) } // GetPatientRespiratoryRateEntries is the resolver for the getPatientRespiratoryRateEntries field. -func (r *queryResolver) GetPatientRespiratoryRateEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { +func (r *queryResolver) GetPatientRespiratoryRateEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) { r.CheckDependencies() - return r.usecases.Clinical.GetPatientRespiratoryRateEntries(ctx, patientID) + return r.usecases.Clinical.GetPatientRespiratoryRateEntries(ctx, patientID, &pagination) } // GetPatientPulseRateEntries is the resolver for the GetPatientPulseRateEntries field. -func (r *queryResolver) GetPatientPulseRateEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { - return r.usecases.Clinical.GetPatientPulseRateEntries(ctx, patientID) +func (r *queryResolver) GetPatientPulseRateEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) { + return r.usecases.Clinical.GetPatientPulseRateEntries(ctx, patientID, &pagination) } // GetPatientBMIEntries is the resolver for the getPatientBMIEntries field. -func (r *queryResolver) GetPatientBMIEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { +func (r *queryResolver) GetPatientBMIEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) { r.CheckDependencies() - return r.usecases.Clinical.GetPatientBMIEntries(ctx, patientID) + return r.usecases.Clinical.GetPatientBMIEntries(ctx, patientID, &pagination) } // GetPatientWeightEntries is the resolver for the getPatientWeightEntries field. -func (r *queryResolver) GetPatientWeightEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { - return r.usecases.Clinical.GetPatientWeightEntries(ctx, patientID) +func (r *queryResolver) GetPatientWeightEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) { + return r.usecases.Clinical.GetPatientWeightEntries(ctx, patientID, &pagination) } // SearchAllergy is the resolver for the searchAllergy field. diff --git a/pkg/clinical/presentation/graph/generated/generated.go b/pkg/clinical/presentation/graph/generated/generated.go index 2f201c4d..63078e66 100644 --- a/pkg/clinical/presentation/graph/generated/generated.go +++ b/pkg/clinical/presentation/graph/generated/generated.go @@ -167,6 +167,17 @@ type ComplexityRoot struct { Value func(childComplexity int) int } + ObservationConnection struct { + Edges func(childComplexity int) int + PageInfo func(childComplexity int) int + TotalCount func(childComplexity int) int + } + + ObservationEdge struct { + Cursor func(childComplexity int) int + Node func(childComplexity int) int + } + PageInfo struct { EndCursor func(childComplexity int) int HasNextPage func(childComplexity int) int @@ -187,13 +198,13 @@ type ComplexityRoot struct { GetAllergy func(childComplexity int, id string) int GetEpisodeOfCare func(childComplexity int, id string) int GetMedicalData func(childComplexity int, patientID string) int - GetPatientBMIEntries func(childComplexity int, patientID string) int - GetPatientBloodPressureEntries func(childComplexity int, patientID string) int - GetPatientHeightEntries func(childComplexity int, patientID string) int - GetPatientPulseRateEntries func(childComplexity int, patientID string) int - GetPatientRespiratoryRateEntries func(childComplexity int, patientID string) int - GetPatientTemperatureEntries func(childComplexity int, patientID string) int - GetPatientWeightEntries func(childComplexity int, patientID string) int + GetPatientBMIEntries func(childComplexity int, patientID string, pagination dto.Pagination) int + GetPatientBloodPressureEntries func(childComplexity int, patientID string, pagination dto.Pagination) int + GetPatientHeightEntries func(childComplexity int, patientID string, pagination dto.Pagination) int + GetPatientPulseRateEntries func(childComplexity int, patientID string, pagination dto.Pagination) int + GetPatientRespiratoryRateEntries func(childComplexity int, patientID string, pagination dto.Pagination) int + GetPatientTemperatureEntries func(childComplexity int, patientID string, pagination dto.Pagination) int + GetPatientWeightEntries func(childComplexity int, patientID string, pagination dto.Pagination) int ListPatientAllergies func(childComplexity int, patientID string, pagination dto.Pagination) int ListPatientConditions func(childComplexity int, patientID string, pagination dto.Pagination) int ListPatientEncounters func(childComplexity int, patientID string, pagination dto.Pagination) int @@ -261,13 +272,13 @@ type QueryResolver interface { GetEpisodeOfCare(ctx context.Context, id string) (*dto.EpisodeOfCare, error) ListPatientConditions(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ConditionConnection, error) ListPatientEncounters(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.EncounterConnection, error) - GetPatientTemperatureEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientBloodPressureEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientHeightEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientRespiratoryRateEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientPulseRateEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientBMIEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientWeightEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) + GetPatientTemperatureEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) + GetPatientBloodPressureEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) + GetPatientHeightEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) + GetPatientRespiratoryRateEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) + GetPatientPulseRateEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) + GetPatientBMIEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) + GetPatientWeightEntries(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ObservationConnection, error) SearchAllergy(ctx context.Context, name string, pagination dto.Pagination) (*dto.TerminologyConnection, error) GetAllergy(ctx context.Context, id string) (*dto.Allergy, error) ListPatientAllergies(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.AllergyConnection, error) @@ -869,6 +880,41 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Observation.Value(childComplexity), true + case "ObservationConnection.edges": + if e.complexity.ObservationConnection.Edges == nil { + break + } + + return e.complexity.ObservationConnection.Edges(childComplexity), true + + case "ObservationConnection.pageInfo": + if e.complexity.ObservationConnection.PageInfo == nil { + break + } + + return e.complexity.ObservationConnection.PageInfo(childComplexity), true + + case "ObservationConnection.totalCount": + if e.complexity.ObservationConnection.TotalCount == nil { + break + } + + return e.complexity.ObservationConnection.TotalCount(childComplexity), true + + case "ObservationEdge.cursor": + if e.complexity.ObservationEdge.Cursor == nil { + break + } + + return e.complexity.ObservationEdge.Cursor(childComplexity), true + + case "ObservationEdge.node": + if e.complexity.ObservationEdge.Node == nil { + break + } + + return e.complexity.ObservationEdge.Node(childComplexity), true + case "PageInfo.endCursor": if e.complexity.PageInfo.EndCursor == nil { break @@ -985,7 +1031,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.GetPatientBMIEntries(childComplexity, args["patientID"].(string)), true + return e.complexity.Query.GetPatientBMIEntries(childComplexity, args["patientID"].(string), args["pagination"].(dto.Pagination)), true case "Query.getPatientBloodPressureEntries": if e.complexity.Query.GetPatientBloodPressureEntries == nil { @@ -997,7 +1043,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.GetPatientBloodPressureEntries(childComplexity, args["patientID"].(string)), true + return e.complexity.Query.GetPatientBloodPressureEntries(childComplexity, args["patientID"].(string), args["pagination"].(dto.Pagination)), true case "Query.getPatientHeightEntries": if e.complexity.Query.GetPatientHeightEntries == nil { @@ -1009,7 +1055,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.GetPatientHeightEntries(childComplexity, args["patientID"].(string)), true + return e.complexity.Query.GetPatientHeightEntries(childComplexity, args["patientID"].(string), args["pagination"].(dto.Pagination)), true case "Query.getPatientPulseRateEntries": if e.complexity.Query.GetPatientPulseRateEntries == nil { @@ -1021,7 +1067,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.GetPatientPulseRateEntries(childComplexity, args["patientID"].(string)), true + return e.complexity.Query.GetPatientPulseRateEntries(childComplexity, args["patientID"].(string), args["pagination"].(dto.Pagination)), true case "Query.getPatientRespiratoryRateEntries": if e.complexity.Query.GetPatientRespiratoryRateEntries == nil { @@ -1033,7 +1079,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.GetPatientRespiratoryRateEntries(childComplexity, args["patientID"].(string)), true + return e.complexity.Query.GetPatientRespiratoryRateEntries(childComplexity, args["patientID"].(string), args["pagination"].(dto.Pagination)), true case "Query.getPatientTemperatureEntries": if e.complexity.Query.GetPatientTemperatureEntries == nil { @@ -1045,7 +1091,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.GetPatientTemperatureEntries(childComplexity, args["patientID"].(string)), true + return e.complexity.Query.GetPatientTemperatureEntries(childComplexity, args["patientID"].(string), args["pagination"].(dto.Pagination)), true case "Query.getPatientWeightEntries": if e.complexity.Query.GetPatientWeightEntries == nil { @@ -1057,7 +1103,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.GetPatientWeightEntries(childComplexity, args["patientID"].(string)), true + return e.complexity.Query.GetPatientWeightEntries(childComplexity, args["patientID"].(string), args["pagination"].(dto.Pagination)), true case "Query.listPatientAllergies": if e.complexity.Query.ListPatientAllergies == nil { @@ -1343,13 +1389,13 @@ var sources = []*ast.Source{ listPatientEncounters(patientID: String!, pagination: Pagination!): EncounterConnection # Observation - getPatientTemperatureEntries(patientID: String!): [Observation!] - getPatientBloodPressureEntries(patientID: String!): [Observation!] - getPatientHeightEntries(patientID: String!): [Observation!] - getPatientRespiratoryRateEntries(patientID: String!): [Observation!] - getPatientPulseRateEntries(patientID: String!): [Observation!] - getPatientBMIEntries(patientID: String!): [Observation!] - getPatientWeightEntries(patientID: String!): [Observation!] + getPatientTemperatureEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientBloodPressureEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientHeightEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientRespiratoryRateEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientPulseRateEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientBMIEntries(patientID: String!, pagination: Pagination!): ObservationConnection + getPatientWeightEntries(patientID: String!, pagination: Pagination!): ObservationConnection # Allergy searchAllergy(name: String!, pagination: Pagination!): TerminologyConnection @@ -1708,6 +1754,17 @@ type TerminologyConnection { edges: [TerminologyEdge] pageInfo: PageInfo } + +type ObservationEdge { + node: Observation + cursor: String +} + +type ObservationConnection { + totalCount: Int + edges: [ObservationEdge] + pageInfo: PageInfo +} `, BuiltIn: false}, {Name: "../../../../../federation/directives.graphql", Input: ` scalar _Any @@ -2017,6 +2074,15 @@ func (ec *executionContext) field_Query_getPatientBMIEntries_args(ctx context.Co } } 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 } @@ -2032,6 +2098,15 @@ func (ec *executionContext) field_Query_getPatientBloodPressureEntries_args(ctx } } 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 } @@ -2047,6 +2122,15 @@ func (ec *executionContext) field_Query_getPatientHeightEntries_args(ctx context } } 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 } @@ -2062,6 +2146,15 @@ func (ec *executionContext) field_Query_getPatientPulseRateEntries_args(ctx cont } } 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 } @@ -2077,6 +2170,15 @@ func (ec *executionContext) field_Query_getPatientRespiratoryRateEntries_args(ct } } 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 } @@ -2092,6 +2194,15 @@ func (ec *executionContext) field_Query_getPatientTemperatureEntries_args(ctx co } } 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 } @@ -2107,6 +2218,15 @@ func (ec *executionContext) field_Query_getPatientWeightEntries_args(ctx context } } 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 } @@ -5861,6 +5981,241 @@ func (ec *executionContext) fieldContext_Observation_value(ctx context.Context, return fc, nil } +func (ec *executionContext) _ObservationConnection_totalCount(ctx context.Context, field graphql.CollectedField, obj *dto.ObservationConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ObservationConnection_totalCount(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.TotalCount, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(int) + fc.Result = res + return ec.marshalOInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ObservationConnection_totalCount(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ObservationConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _ObservationConnection_edges(ctx context.Context, field graphql.CollectedField, obj *dto.ObservationConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ObservationConnection_edges(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.Edges, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]dto.ObservationEdge) + fc.Result = res + return ec.marshalOObservationEdge2ᚕgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationEdge(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ObservationConnection_edges(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ObservationConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "node": + return ec.fieldContext_ObservationEdge_node(ctx, field) + case "cursor": + return ec.fieldContext_ObservationEdge_cursor(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type ObservationEdge", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _ObservationConnection_pageInfo(ctx context.Context, field graphql.CollectedField, obj *dto.ObservationConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ObservationConnection_pageInfo(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.PageInfo, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(dto.PageInfo) + fc.Result = res + return ec.marshalOPageInfo2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPageInfo(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ObservationConnection_pageInfo(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ObservationConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "hasNextPage": + return ec.fieldContext_PageInfo_hasNextPage(ctx, field) + case "startCursor": + return ec.fieldContext_PageInfo_startCursor(ctx, field) + case "hasPreviousPage": + return ec.fieldContext_PageInfo_hasPreviousPage(ctx, field) + case "endCursor": + return ec.fieldContext_PageInfo_endCursor(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type PageInfo", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _ObservationEdge_node(ctx context.Context, field graphql.CollectedField, obj *dto.ObservationEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ObservationEdge_node(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.Node, 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.marshalOObservation2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservation(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ObservationEdge_node(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ObservationEdge", + 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) + } + return nil, fmt.Errorf("no field named %q was found under type Observation", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _ObservationEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *dto.ObservationEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ObservationEdge_cursor(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.Cursor, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ObservationEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ObservationEdge", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _PageInfo_hasNextPage(ctx context.Context, field graphql.CollectedField, obj *dto.PageInfo) (ret graphql.Marshaler) { fc, err := ec.fieldContext_PageInfo_hasNextPage(ctx, field) if err != nil { @@ -6607,7 +6962,7 @@ func (ec *executionContext) _Query_getPatientTemperatureEntries(ctx context.Cont }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().GetPatientTemperatureEntries(rctx, fc.Args["patientID"].(string)) + return ec.resolvers.Query().GetPatientTemperatureEntries(rctx, fc.Args["patientID"].(string), fc.Args["pagination"].(dto.Pagination)) }) if err != nil { ec.Error(ctx, err) @@ -6616,9 +6971,9 @@ func (ec *executionContext) _Query_getPatientTemperatureEntries(ctx context.Cont if resTmp == nil { return graphql.Null } - res := resTmp.([]*dto.Observation) + res := resTmp.(*dto.ObservationConnection) fc.Result = res - return ec.marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationᚄ(ctx, field.Selections, res) + return ec.marshalOObservationConnection2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationConnection(ctx, field.Selections, res) } func (ec *executionContext) fieldContext_Query_getPatientTemperatureEntries(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { @@ -6629,20 +6984,14 @@ func (ec *executionContext) fieldContext_Query_getPatientTemperatureEntries(ctx IsResolver: true, 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 "totalCount": + return ec.fieldContext_ObservationConnection_totalCount(ctx, field) + case "edges": + return ec.fieldContext_ObservationConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_ObservationConnection_pageInfo(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Observation", field.Name) + return nil, fmt.Errorf("no field named %q was found under type ObservationConnection", field.Name) }, } defer func() { @@ -6673,7 +7022,7 @@ func (ec *executionContext) _Query_getPatientBloodPressureEntries(ctx context.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().GetPatientBloodPressureEntries(rctx, fc.Args["patientID"].(string)) + return ec.resolvers.Query().GetPatientBloodPressureEntries(rctx, fc.Args["patientID"].(string), fc.Args["pagination"].(dto.Pagination)) }) if err != nil { ec.Error(ctx, err) @@ -6682,9 +7031,9 @@ func (ec *executionContext) _Query_getPatientBloodPressureEntries(ctx context.Co if resTmp == nil { return graphql.Null } - res := resTmp.([]*dto.Observation) + res := resTmp.(*dto.ObservationConnection) fc.Result = res - return ec.marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationᚄ(ctx, field.Selections, res) + return ec.marshalOObservationConnection2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationConnection(ctx, field.Selections, res) } func (ec *executionContext) fieldContext_Query_getPatientBloodPressureEntries(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { @@ -6695,20 +7044,14 @@ func (ec *executionContext) fieldContext_Query_getPatientBloodPressureEntries(ct IsResolver: true, 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 "totalCount": + return ec.fieldContext_ObservationConnection_totalCount(ctx, field) + case "edges": + return ec.fieldContext_ObservationConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_ObservationConnection_pageInfo(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Observation", field.Name) + return nil, fmt.Errorf("no field named %q was found under type ObservationConnection", field.Name) }, } defer func() { @@ -6739,7 +7082,7 @@ func (ec *executionContext) _Query_getPatientHeightEntries(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().GetPatientHeightEntries(rctx, fc.Args["patientID"].(string)) + return ec.resolvers.Query().GetPatientHeightEntries(rctx, fc.Args["patientID"].(string), fc.Args["pagination"].(dto.Pagination)) }) if err != nil { ec.Error(ctx, err) @@ -6748,9 +7091,9 @@ func (ec *executionContext) _Query_getPatientHeightEntries(ctx context.Context, if resTmp == nil { return graphql.Null } - res := resTmp.([]*dto.Observation) + res := resTmp.(*dto.ObservationConnection) fc.Result = res - return ec.marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationᚄ(ctx, field.Selections, res) + return ec.marshalOObservationConnection2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationConnection(ctx, field.Selections, res) } func (ec *executionContext) fieldContext_Query_getPatientHeightEntries(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { @@ -6761,20 +7104,14 @@ func (ec *executionContext) fieldContext_Query_getPatientHeightEntries(ctx conte IsResolver: true, 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 "totalCount": + return ec.fieldContext_ObservationConnection_totalCount(ctx, field) + case "edges": + return ec.fieldContext_ObservationConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_ObservationConnection_pageInfo(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Observation", field.Name) + return nil, fmt.Errorf("no field named %q was found under type ObservationConnection", field.Name) }, } defer func() { @@ -6805,7 +7142,7 @@ func (ec *executionContext) _Query_getPatientRespiratoryRateEntries(ctx context. }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().GetPatientRespiratoryRateEntries(rctx, fc.Args["patientID"].(string)) + return ec.resolvers.Query().GetPatientRespiratoryRateEntries(rctx, fc.Args["patientID"].(string), fc.Args["pagination"].(dto.Pagination)) }) if err != nil { ec.Error(ctx, err) @@ -6814,9 +7151,9 @@ func (ec *executionContext) _Query_getPatientRespiratoryRateEntries(ctx context. if resTmp == nil { return graphql.Null } - res := resTmp.([]*dto.Observation) + res := resTmp.(*dto.ObservationConnection) fc.Result = res - return ec.marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationᚄ(ctx, field.Selections, res) + return ec.marshalOObservationConnection2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationConnection(ctx, field.Selections, res) } func (ec *executionContext) fieldContext_Query_getPatientRespiratoryRateEntries(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { @@ -6827,20 +7164,14 @@ func (ec *executionContext) fieldContext_Query_getPatientRespiratoryRateEntries( IsResolver: true, 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 "totalCount": + return ec.fieldContext_ObservationConnection_totalCount(ctx, field) + case "edges": + return ec.fieldContext_ObservationConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_ObservationConnection_pageInfo(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Observation", field.Name) + return nil, fmt.Errorf("no field named %q was found under type ObservationConnection", field.Name) }, } defer func() { @@ -6871,7 +7202,7 @@ func (ec *executionContext) _Query_getPatientPulseRateEntries(ctx context.Contex }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().GetPatientPulseRateEntries(rctx, fc.Args["patientID"].(string)) + return ec.resolvers.Query().GetPatientPulseRateEntries(rctx, fc.Args["patientID"].(string), fc.Args["pagination"].(dto.Pagination)) }) if err != nil { ec.Error(ctx, err) @@ -6880,9 +7211,9 @@ func (ec *executionContext) _Query_getPatientPulseRateEntries(ctx context.Contex if resTmp == nil { return graphql.Null } - res := resTmp.([]*dto.Observation) + res := resTmp.(*dto.ObservationConnection) fc.Result = res - return ec.marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationᚄ(ctx, field.Selections, res) + return ec.marshalOObservationConnection2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationConnection(ctx, field.Selections, res) } func (ec *executionContext) fieldContext_Query_getPatientPulseRateEntries(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { @@ -6893,20 +7224,14 @@ func (ec *executionContext) fieldContext_Query_getPatientPulseRateEntries(ctx co IsResolver: true, 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 "totalCount": + return ec.fieldContext_ObservationConnection_totalCount(ctx, field) + case "edges": + return ec.fieldContext_ObservationConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_ObservationConnection_pageInfo(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Observation", field.Name) + return nil, fmt.Errorf("no field named %q was found under type ObservationConnection", field.Name) }, } defer func() { @@ -6937,7 +7262,7 @@ func (ec *executionContext) _Query_getPatientBMIEntries(ctx context.Context, fie }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().GetPatientBMIEntries(rctx, fc.Args["patientID"].(string)) + return ec.resolvers.Query().GetPatientBMIEntries(rctx, fc.Args["patientID"].(string), fc.Args["pagination"].(dto.Pagination)) }) if err != nil { ec.Error(ctx, err) @@ -6946,9 +7271,9 @@ func (ec *executionContext) _Query_getPatientBMIEntries(ctx context.Context, fie if resTmp == nil { return graphql.Null } - res := resTmp.([]*dto.Observation) + res := resTmp.(*dto.ObservationConnection) fc.Result = res - return ec.marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationᚄ(ctx, field.Selections, res) + return ec.marshalOObservationConnection2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationConnection(ctx, field.Selections, res) } func (ec *executionContext) fieldContext_Query_getPatientBMIEntries(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { @@ -6959,20 +7284,14 @@ func (ec *executionContext) fieldContext_Query_getPatientBMIEntries(ctx context. IsResolver: true, 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 "totalCount": + return ec.fieldContext_ObservationConnection_totalCount(ctx, field) + case "edges": + return ec.fieldContext_ObservationConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_ObservationConnection_pageInfo(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Observation", field.Name) + return nil, fmt.Errorf("no field named %q was found under type ObservationConnection", field.Name) }, } defer func() { @@ -7003,7 +7322,7 @@ func (ec *executionContext) _Query_getPatientWeightEntries(ctx context.Context, }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().GetPatientWeightEntries(rctx, fc.Args["patientID"].(string)) + return ec.resolvers.Query().GetPatientWeightEntries(rctx, fc.Args["patientID"].(string), fc.Args["pagination"].(dto.Pagination)) }) if err != nil { ec.Error(ctx, err) @@ -7012,9 +7331,9 @@ func (ec *executionContext) _Query_getPatientWeightEntries(ctx context.Context, if resTmp == nil { return graphql.Null } - res := resTmp.([]*dto.Observation) + res := resTmp.(*dto.ObservationConnection) fc.Result = res - return ec.marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationᚄ(ctx, field.Selections, res) + return ec.marshalOObservationConnection2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationConnection(ctx, field.Selections, res) } func (ec *executionContext) fieldContext_Query_getPatientWeightEntries(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { @@ -7025,20 +7344,14 @@ func (ec *executionContext) fieldContext_Query_getPatientWeightEntries(ctx conte IsResolver: true, 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 "totalCount": + return ec.fieldContext_ObservationConnection_totalCount(ctx, field) + case "edges": + return ec.fieldContext_ObservationConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_ObservationConnection_pageInfo(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type Observation", field.Name) + return nil, fmt.Errorf("no field named %q was found under type ObservationConnection", field.Name) }, } defer func() { @@ -11216,6 +11529,68 @@ func (ec *executionContext) _Observation(ctx context.Context, sel ast.SelectionS return out } +var observationConnectionImplementors = []string{"ObservationConnection"} + +func (ec *executionContext) _ObservationConnection(ctx context.Context, sel ast.SelectionSet, obj *dto.ObservationConnection) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, observationConnectionImplementors) + out := graphql.NewFieldSet(fields) + var invalids uint32 + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("ObservationConnection") + case "totalCount": + + out.Values[i] = ec._ObservationConnection_totalCount(ctx, field, obj) + + case "edges": + + out.Values[i] = ec._ObservationConnection_edges(ctx, field, obj) + + case "pageInfo": + + out.Values[i] = ec._ObservationConnection_pageInfo(ctx, field, obj) + + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch() + if invalids > 0 { + return graphql.Null + } + return out +} + +var observationEdgeImplementors = []string{"ObservationEdge"} + +func (ec *executionContext) _ObservationEdge(ctx context.Context, sel ast.SelectionSet, obj *dto.ObservationEdge) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, observationEdgeImplementors) + out := graphql.NewFieldSet(fields) + var invalids uint32 + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("ObservationEdge") + case "node": + + out.Values[i] = ec._ObservationEdge_node(ctx, field, obj) + + case "cursor": + + out.Values[i] = ec._ObservationEdge_cursor(ctx, field, obj) + + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch() + if invalids > 0 { + return graphql.Null + } + return out +} + var pageInfoImplementors = []string{"PageInfo"} func (ec *executionContext) _PageInfo(ctx context.Context, sel ast.SelectionSet, obj *dto.PageInfo) graphql.Marshaler { @@ -13272,6 +13647,10 @@ func (ec *executionContext) marshalOMedicationStatementStatusEnum2githubᚗcom return res } +func (ec *executionContext) marshalOObservation2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservation(ctx context.Context, sel ast.SelectionSet, v dto.Observation) graphql.Marshaler { + return ec._Observation(ctx, sel, &v) +} + func (ec *executionContext) marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservation(ctx context.Context, sel ast.SelectionSet, v []*dto.Observation) graphql.Marshaler { if v == nil { return graphql.Null @@ -13313,7 +13692,25 @@ func (ec *executionContext) marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghi return ret } -func (ec *executionContext) marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationᚄ(ctx context.Context, sel ast.SelectionSet, v []*dto.Observation) graphql.Marshaler { +func (ec *executionContext) marshalOObservation2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservation(ctx context.Context, sel ast.SelectionSet, v *dto.Observation) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._Observation(ctx, sel, v) +} + +func (ec *executionContext) marshalOObservationConnection2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationConnection(ctx context.Context, sel ast.SelectionSet, v *dto.ObservationConnection) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._ObservationConnection(ctx, sel, v) +} + +func (ec *executionContext) marshalOObservationEdge2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationEdge(ctx context.Context, sel ast.SelectionSet, v dto.ObservationEdge) graphql.Marshaler { + return ec._ObservationEdge(ctx, sel, &v) +} + +func (ec *executionContext) marshalOObservationEdge2ᚕgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationEdge(ctx context.Context, sel ast.SelectionSet, v []dto.ObservationEdge) graphql.Marshaler { if v == nil { return graphql.Null } @@ -13340,7 +13737,7 @@ func (ec *executionContext) marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghi if !isLen1 { defer wg.Done() } - ret[i] = ec.marshalNObservation2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservation(ctx, sel, v[i]) + ret[i] = ec.marshalOObservationEdge2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservationEdge(ctx, sel, v[i]) } if isLen1 { f(i) @@ -13351,22 +13748,9 @@ func (ec *executionContext) marshalOObservation2ᚕᚖgithubᚗcomᚋsavannahghi } wg.Wait() - for _, e := range ret { - if e == graphql.Null { - return graphql.Null - } - } - return ret } -func (ec *executionContext) marshalOObservation2ᚖgithubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐObservation(ctx context.Context, sel ast.SelectionSet, v *dto.Observation) graphql.Marshaler { - if v == nil { - return graphql.Null - } - return ec._Observation(ctx, sel, v) -} - func (ec *executionContext) marshalOPageInfo2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPageInfo(ctx context.Context, sel ast.SelectionSet, v dto.PageInfo) graphql.Marshaler { return ec._PageInfo(ctx, sel, &v) } diff --git a/pkg/clinical/presentation/graph/types.graphql b/pkg/clinical/presentation/graph/types.graphql index 0b1636e0..8023b037 100644 --- a/pkg/clinical/presentation/graph/types.graphql +++ b/pkg/clinical/presentation/graph/types.graphql @@ -158,3 +158,14 @@ type TerminologyConnection { edges: [TerminologyEdge] pageInfo: PageInfo } + +type ObservationEdge { + node: Observation + cursor: String +} + +type ObservationConnection { + totalCount: Int + edges: [ObservationEdge] + pageInfo: PageInfo +} diff --git a/pkg/clinical/presentation/rest/handlers_test.go b/pkg/clinical/presentation/rest/handlers_test.go index 41b79779..99ea931d 100644 --- a/pkg/clinical/presentation/rest/handlers_test.go +++ b/pkg/clinical/presentation/rest/handlers_test.go @@ -391,7 +391,7 @@ func TestPresentationHandlersImpl_ReceivePubSubPushMessage(t *testing.T) { return utils.AddPubSubNamespace(common.VitalsTopicName, common.ClinicalServiceName), nil } - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to create observation") } } @@ -580,7 +580,7 @@ func TestPresentationHandlersImpl_ReceivePubSubPushMessage(t *testing.T) { return utils.AddPubSubNamespace(common.TestResultTopicName, common.ClinicalServiceName), nil } - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to crate observation") } } diff --git a/pkg/clinical/repository/repository.go b/pkg/clinical/repository/repository.go index e4332bf7..045fd6bb 100644 --- a/pkg/clinical/repository/repository.go +++ b/pkg/clinical/repository/repository.go @@ -48,10 +48,10 @@ type FHIREpisodeOfCare interface { GetActiveEpisode(ctx context.Context, episodeID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIREpisodeOfCare, error) } type FHIRObservation interface { - SearchFHIRObservation(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRObservationRelayConnection, error) - CreateFHIRObservation(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, 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, patientReference, observationCode string, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIRObservation, error) + SearchPatientObservations(ctx context.Context, patientReference, observationCode string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) } type FHIRAllergyIntolerance interface { SearchFHIRAllergyIntolerance(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRAllergy, error) diff --git a/pkg/clinical/usecases/clinical/observation.go b/pkg/clinical/usecases/clinical/observation.go index ea30b631..5136cb19 100644 --- a/pkg/clinical/usecases/clinical/observation.go +++ b/pkg/clinical/usecases/clinical/observation.go @@ -23,8 +23,8 @@ func (c *UseCasesClinicalImpl) RecordTemperature(ctx context.Context, input dto. } // GetPatientTemperatureEntries returns all the temperature entries for a patient, they are automatically sorted in chronological order -func (c *UseCasesClinicalImpl) GetPatientTemperatureEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { - return c.GetPatientObservations(ctx, patientID, common.TemperatureCIELTerminologyCode) +func (c *UseCasesClinicalImpl) GetPatientTemperatureEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) { + return c.GetPatientObservations(ctx, patientID, common.TemperatureCIELTerminologyCode, pagination) } // RecordHeight records a patient's height and saves it to fhir @@ -38,8 +38,8 @@ func (c *UseCasesClinicalImpl) RecordHeight(ctx context.Context, input dto.Obser } // GetPatientHeightEntries gets the height records of a patient -func (c *UseCasesClinicalImpl) GetPatientHeightEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { - return c.GetPatientObservations(ctx, patientID, common.HeightCIELTerminologyCode) +func (c *UseCasesClinicalImpl) GetPatientHeightEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) { + return c.GetPatientObservations(ctx, patientID, common.HeightCIELTerminologyCode, pagination) } // RecordWeight records a patient's weight @@ -53,8 +53,8 @@ func (c *UseCasesClinicalImpl) RecordWeight(ctx context.Context, input dto.Obser } // GetPatientWeightEntries gets the weight records of a patient -func (c *UseCasesClinicalImpl) GetPatientWeightEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { - return c.GetPatientObservations(ctx, patientID, common.WeightCIELTerminologyCode) +func (c *UseCasesClinicalImpl) GetPatientWeightEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) { + return c.GetPatientObservations(ctx, patientID, common.WeightCIELTerminologyCode, pagination) } // RecordRespiratoryRate records a patient's respiratory rate @@ -68,8 +68,8 @@ func (c *UseCasesClinicalImpl) RecordRespiratoryRate(ctx context.Context, input } // GetPatientRespiratoryRateEntries gets a patient's respiratory rate entries -func (c *UseCasesClinicalImpl) GetPatientRespiratoryRateEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { - return c.GetPatientObservations(ctx, patientID, common.RespiratoryRateCIELTerminologyCode) +func (c *UseCasesClinicalImpl) GetPatientRespiratoryRateEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) { + return c.GetPatientObservations(ctx, patientID, common.RespiratoryRateCIELTerminologyCode, pagination) } // RecordPulseRate records a patient's pulse rate @@ -83,8 +83,8 @@ func (c *UseCasesClinicalImpl) RecordPulseRate(ctx context.Context, input dto.Ob } // GetPatientPulseRateEntries gets the pulse rate records of a patient -func (c *UseCasesClinicalImpl) GetPatientPulseRateEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { - return c.GetPatientObservations(ctx, patientID, common.PulseCIELTerminologyCode) +func (c *UseCasesClinicalImpl) GetPatientPulseRateEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) { + return c.GetPatientObservations(ctx, patientID, common.PulseCIELTerminologyCode, pagination) } // RecordBloodPressure records a patient's blood pressure @@ -98,8 +98,8 @@ func (c *UseCasesClinicalImpl) RecordBloodPressure(ctx context.Context, input dt } // GetPatientBloodPressureEntries retrieves all blood pressure entries for a patient -func (c *UseCasesClinicalImpl) GetPatientBloodPressureEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { - return c.GetPatientObservations(ctx, patientID, common.BloodPressureCIELTerminologyCode) +func (c *UseCasesClinicalImpl) GetPatientBloodPressureEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) { + return c.GetPatientObservations(ctx, patientID, common.BloodPressureCIELTerminologyCode, pagination) } // RecordBMI records a patient's BMI @@ -113,8 +113,8 @@ func (c *UseCasesClinicalImpl) RecordBMI(ctx context.Context, input dto.Observat } // GetPatientBMIEntries retrieves all BMI entries for a patient -func (c *UseCasesClinicalImpl) GetPatientBMIEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) { - return c.GetPatientObservations(ctx, patientID, common.BMICIELTerminologyCode) +func (c *UseCasesClinicalImpl) GetPatientBMIEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) { + return c.GetPatientObservations(ctx, patientID, common.BMICIELTerminologyCode, pagination) } // RecordObservation is an extracted function that takes any observation input and saves it to FHIR. @@ -194,12 +194,12 @@ func (c *UseCasesClinicalImpl) RecordObservation(ctx context.Context, input dto. return nil, err } - return mapFHIRObservationToObservationDTO(fhirObservation.Resource), nil + return mapFHIRObservationToObservationDTO(*fhirObservation), nil } -// GetPatientObservations is a helper function used to fetch patient's observations based off the passed CIEL +// GetPatientObservations is a helper function used to fetch patient's observations based on the passed CIEL // terminology code. The observations will be sorted in a chronological error -func (c *UseCasesClinicalImpl) GetPatientObservations(ctx context.Context, patientID string, observationCode string) ([]*dto.Observation, error) { +func (c *UseCasesClinicalImpl) GetPatientObservations(ctx context.Context, patientID string, observationCode string, pagination *dto.Pagination) (*dto.ObservationConnection, error) { _, err := uuid.Parse(patientID) if err != nil { return nil, fmt.Errorf("invalid patient id: %s", patientID) @@ -218,12 +218,12 @@ func (c *UseCasesClinicalImpl) GetPatientObservations(ctx context.Context, patie return nil, fmt.Errorf("failed to get tenant identifiers from context: %w", err) } - patientObs, err := c.infrastructure.FHIR.SearchPatientObservations(ctx, patientReference, observationCode, *identifiers, dto.Pagination{}) + patientObs, err := c.infrastructure.FHIR.SearchPatientObservations(ctx, patientReference, observationCode, *identifiers, *pagination) if err != nil { return nil, err } - for _, obs := range patientObs { + for _, obs := range patientObs.Observations { if obs.Subject == nil { continue } @@ -243,5 +243,14 @@ func (c *UseCasesClinicalImpl) GetPatientObservations(ctx context.Context, patie observations = append(observations, mapFHIRObservationToObservationDTO(obs)) } - return observations, nil + pageInfo := dto.PageInfo{ + HasNextPage: patientObs.HasNextPage, + EndCursor: &patientObs.NextCursor, + HasPreviousPage: patientObs.HasPreviousPage, + StartCursor: &patientObs.PreviousCursor, + } + + connection := dto.CreateObservationConnection(observations, pageInfo, patientObs.TotalCount) + + return &connection, nil } diff --git a/pkg/clinical/usecases/clinical/observation_test.go b/pkg/clinical/usecases/clinical/observation_test.go index 5a35d46e..ceee16d9 100644 --- a/pkg/clinical/usecases/clinical/observation_test.go +++ b/pkg/clinical/usecases/clinical/observation_test.go @@ -176,7 +176,7 @@ func TestUseCasesClinicalImpl_RecordObservation(t *testing.T) { } if tt.name == "Sad Case - Fail to create observation" { - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to create observation") } } @@ -330,7 +330,7 @@ func TestUseCasesClinicalImpl_RecordTemperature(t *testing.T) { } if tt.name == "Sad Case - Fail to create observation" { - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to create observation") } } @@ -484,7 +484,7 @@ func TestUseCasesClinicalImpl_RecordHeight(t *testing.T) { } if tt.name == "Sad Case - Fail to create observation" { - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to create observation") } } @@ -639,7 +639,7 @@ func TestUseCasesClinicalImpl_RecordWeight(t *testing.T) { } if tt.name == "Sad Case - Fail to create observation" { - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to create observation") } } @@ -793,7 +793,7 @@ func TestUseCasesClinicalImpl_RecordRespiratoryRate(t *testing.T) { } if tt.name == "Sad Case - Fail to create observation" { - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to create observation") } } @@ -947,7 +947,7 @@ func TestUseCasesClinicalImpl_RecordPulseRate(t *testing.T) { } if tt.name == "Sad Case - Fail to create observation" { - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to create observation") } } @@ -1101,7 +1101,7 @@ func TestUseCasesClinicalImpl_RecordBloodPressure(t *testing.T) { } if tt.name == "Sad Case - Fail to create observation" { - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to create observation") } } @@ -1255,7 +1255,7 @@ func TestUseCasesClinicalImpl_RecordBMI(t *testing.T) { } if tt.name == "Sad Case - Fail to create observation" { - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to create observation") } } @@ -1276,11 +1276,13 @@ func TestUseCasesClinicalImpl_RecordBMI(t *testing.T) { } func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { + first := 10 ctx := context.Background() type args struct { ctx context.Context patientID string observationCode string + pagination *dto.Pagination } tests := []struct { name string @@ -1293,6 +1295,9 @@ func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { ctx: ctx, patientID: uuid.New().String(), observationCode: "1234", + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -1301,6 +1306,9 @@ func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { args: args{ ctx: ctx, observationCode: "1234", + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: true, }, @@ -1310,6 +1318,9 @@ func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { ctx: ctx, patientID: uuid.New().String(), observationCode: "1234", + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: true, }, @@ -1319,6 +1330,9 @@ func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { ctx: ctx, patientID: uuid.New().String(), observationCode: "1234", + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: true, }, @@ -1328,6 +1342,9 @@ func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { ctx: ctx, patientID: uuid.New().String(), observationCode: "1234", + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: true, }, @@ -1336,6 +1353,9 @@ func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { args: args{ ctx: context.Background(), patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -1344,6 +1364,9 @@ func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { args: args{ ctx: context.Background(), patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -1352,6 +1375,9 @@ func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { args: args{ ctx: context.Background(), patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -1360,6 +1386,9 @@ func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { args: args{ ctx: context.Background(), patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -1387,337 +1416,372 @@ func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { } if tt.name == "Sad Case - fail to search patient observations" { - fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIRObservation, error) { + fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { return nil, fmt.Errorf("failed to search patient observations") } } if tt.name == "Happy case: get patient height" { - fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIRObservation, error) { + fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal valueConcept := "222" UUID := gofakeit.UUID() - return []*domain.FHIRObservation{ - { - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - }, - Subject: &domain.FHIRReference{ - ID: new(string), - }, - Encounter: &domain.FHIRReference{ - ID: new(string), - }, - ValueQuantity: &domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ + { + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + Subject: &domain.FHIRReference{ + ID: new(string), }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + Encounter: &domain.FHIRReference{ + ID: new(string), }, - Denominator: domain.FHIRQuantity{ + ValueQuantity: &domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, - }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, - }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), + }, }, }, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } if tt.name == "Sad Case - Fail to search observation - nil subject" { - fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIRObservation, error) { + fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal valueConcept := "222" UUID := gofakeit.UUID() - return []*domain.FHIRObservation{ - { - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - }, - Encounter: &domain.FHIRReference{ - ID: new(string), - }, - ValueQuantity: &domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ + { + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + Encounter: &domain.FHIRReference{ + ID: new(string), }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ + ValueQuantity: &domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, - }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, - }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), }, }, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } if tt.name == "Sad Case - Fail to search observation - nil subject id" { - fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIRObservation, error) { + fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal valueConcept := "222" UUID := gofakeit.UUID() - return []*domain.FHIRObservation{ - { - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - }, - Subject: &domain.FHIRReference{}, - Encounter: &domain.FHIRReference{ - ID: new(string), - }, - ValueQuantity: &domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ + { + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + Subject: &domain.FHIRReference{}, + Encounter: &domain.FHIRReference{ + ID: new(string), }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ + ValueQuantity: &domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, - }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, - }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), }, }, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } if tt.name == "Sad Case - Fail to search observation - nil encounter" { - fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIRObservation, error) { + fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal valueConcept := "222" UUID := gofakeit.UUID() - return []*domain.FHIRObservation{ - { - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - }, - Subject: &domain.FHIRReference{ - ID: new(string), - }, - ValueQuantity: &domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ + { + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + Subject: &domain.FHIRReference{ + ID: new(string), }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ + ValueQuantity: &domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, - }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, - }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), }, }, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } if tt.name == "Sad Case - Fail to search observation - nil encounter id" { - fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIRObservation, error) { + fakeFHIR.MockSearchPatientObservationsFn = func(ctx context.Context, patientReference, conceptID string, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { status := dto.ObservationStatusFinal valueConcept := "222" UUID := gofakeit.UUID() - return []*domain.FHIRObservation{ - { - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - }, - Subject: &domain.FHIRReference{ - ID: new(string), - }, - Encounter: &domain.FHIRReference{}, - ValueQuantity: &domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ + { + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + Subject: &domain.FHIRReference{ + ID: new(string), }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ + Encounter: &domain.FHIRReference{}, + ValueQuantity: &domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, - }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, - }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), }, }, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } - got, err := u.GetPatientObservations(tt.args.ctx, tt.args.patientID, tt.args.observationCode) + got, err := u.GetPatientObservations(tt.args.ctx, tt.args.patientID, tt.args.observationCode, tt.args.pagination) if (err != nil) != tt.wantErr { t.Errorf("UseCasesClinicalImpl.GetPatientObservations() error = %v, wantErr %v", err, tt.wantErr) return @@ -1734,9 +1798,11 @@ func TestUseCasesClinicalImpl_GetPatientObservations(t *testing.T) { func TestUseCasesClinicalImpl_GetPatientTemperatureEntries(t *testing.T) { ctx := context.Background() + first := 10 type args struct { - ctx context.Context - patientID string + ctx context.Context + patientID string + pagination *dto.Pagination } tests := []struct { name string @@ -1748,6 +1814,9 @@ func TestUseCasesClinicalImpl_GetPatientTemperatureEntries(t *testing.T) { args: args{ ctx: ctx, patientID: uuid.New().String(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -1755,6 +1824,9 @@ func TestUseCasesClinicalImpl_GetPatientTemperatureEntries(t *testing.T) { name: "Sad Case - Invalid patient ID", args: args{ ctx: ctx, + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: true, }, @@ -1769,7 +1841,7 @@ func TestUseCasesClinicalImpl_GetPatientTemperatureEntries(t *testing.T) { infra := infrastructure.NewInfrastructureInteractor(fakeExt, fakeFHIR, fakeOCL, fakeMCH) u := clinicalUsecase.NewUseCasesClinicalImpl(infra) - got, err := u.GetPatientTemperatureEntries(tt.args.ctx, tt.args.patientID) + got, err := u.GetPatientTemperatureEntries(tt.args.ctx, tt.args.patientID, tt.args.pagination) if (err != nil) != tt.wantErr { t.Errorf("UseCasesClinicalImpl.GetPatientTemperatureEntries() error = %v, wantErr %v", err, tt.wantErr) return @@ -1786,9 +1858,11 @@ func TestUseCasesClinicalImpl_GetPatientTemperatureEntries(t *testing.T) { func TestUseCasesClinicalImpl_GetPatientBloodPressureEntries(t *testing.T) { ctx := context.Background() + first := 10 type args struct { - ctx context.Context - patientID string + ctx context.Context + patientID string + pagination *dto.Pagination } tests := []struct { name string @@ -1800,6 +1874,9 @@ func TestUseCasesClinicalImpl_GetPatientBloodPressureEntries(t *testing.T) { args: args{ ctx: ctx, patientID: uuid.New().String(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -1807,6 +1884,9 @@ func TestUseCasesClinicalImpl_GetPatientBloodPressureEntries(t *testing.T) { name: "Sad Case - Invalid patient ID", args: args{ ctx: ctx, + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: true, }, @@ -1821,7 +1901,7 @@ func TestUseCasesClinicalImpl_GetPatientBloodPressureEntries(t *testing.T) { infra := infrastructure.NewInfrastructureInteractor(fakeExt, fakeFHIR, fakeOCL, fakeMCH) u := clinicalUsecase.NewUseCasesClinicalImpl(infra) - got, err := u.GetPatientBloodPressureEntries(tt.args.ctx, tt.args.patientID) + got, err := u.GetPatientBloodPressureEntries(tt.args.ctx, tt.args.patientID, tt.args.pagination) if (err != nil) != tt.wantErr { t.Errorf("UseCasesClinicalImpl.GetPatientBloodPressureEntries() error = %v, wantErr %v", err, tt.wantErr) return @@ -1837,9 +1917,11 @@ func TestUseCasesClinicalImpl_GetPatientBloodPressureEntries(t *testing.T) { } func TestUseCasesClinicalImpl_GetHeight(t *testing.T) { + first := 10 type args struct { - ctx context.Context - patientID string + ctx context.Context + patientID string + pagination *dto.Pagination } tests := []struct { name string @@ -1851,6 +1933,9 @@ func TestUseCasesClinicalImpl_GetHeight(t *testing.T) { args: args{ ctx: context.Background(), patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -1859,6 +1944,9 @@ func TestUseCasesClinicalImpl_GetHeight(t *testing.T) { args: args{ ctx: context.Background(), patientID: gofakeit.BS(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: true, }, @@ -1873,7 +1961,7 @@ func TestUseCasesClinicalImpl_GetHeight(t *testing.T) { infra := infrastructure.NewInfrastructureInteractor(fakeExt, fakeFHIR, fakeOCL, fakeMCH) c := clinicalUsecase.NewUseCasesClinicalImpl(infra) - _, err := c.GetPatientHeightEntries(tt.args.ctx, tt.args.patientID) + _, err := c.GetPatientHeightEntries(tt.args.ctx, tt.args.patientID, tt.args.pagination) if (err != nil) != tt.wantErr { t.Errorf("UseCasesClinicalImpl.GetPatientHeightEntries() error = %v, wantErr %v", err, tt.wantErr) return @@ -1883,9 +1971,11 @@ func TestUseCasesClinicalImpl_GetHeight(t *testing.T) { } func TestUseCasesClinicalImpl_GetPatientPulseRateEntries(t *testing.T) { + first := 10 type args struct { - ctx context.Context - patientID string + ctx context.Context + patientID string + pagination *dto.Pagination } tests := []struct { name string @@ -1897,6 +1987,9 @@ func TestUseCasesClinicalImpl_GetPatientPulseRateEntries(t *testing.T) { args: args{ ctx: context.Background(), patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -1905,6 +1998,9 @@ func TestUseCasesClinicalImpl_GetPatientPulseRateEntries(t *testing.T) { args: args{ ctx: context.Background(), patientID: gofakeit.BS(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: true, }, @@ -1919,7 +2015,7 @@ func TestUseCasesClinicalImpl_GetPatientPulseRateEntries(t *testing.T) { infra := infrastructure.NewInfrastructureInteractor(fakeExt, fakeFHIR, fakeOCL, fakeMCH) c := clinicalUsecase.NewUseCasesClinicalImpl(infra) - _, err := c.GetPatientPulseRateEntries(tt.args.ctx, tt.args.patientID) + _, err := c.GetPatientPulseRateEntries(tt.args.ctx, tt.args.patientID, tt.args.pagination) if (err != nil) != tt.wantErr { t.Errorf("UseCasesClinicalImpl.GetPatientPulseRateEntries() error = %v, wantErr %v", err, tt.wantErr) return @@ -1930,9 +2026,11 @@ func TestUseCasesClinicalImpl_GetPatientPulseRateEntries(t *testing.T) { func TestUseCasesClinicalImpl_GetPatientRespiratoryRateEntries(t *testing.T) { ctx := context.Background() + first := 10 type args struct { - ctx context.Context - patientID string + ctx context.Context + patientID string + pagination *dto.Pagination } tests := []struct { name string @@ -1944,6 +2042,9 @@ func TestUseCasesClinicalImpl_GetPatientRespiratoryRateEntries(t *testing.T) { args: args{ ctx: ctx, patientID: uuid.New().String(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -1951,6 +2052,9 @@ func TestUseCasesClinicalImpl_GetPatientRespiratoryRateEntries(t *testing.T) { name: "Sad Case - Invalid patient ID", args: args{ ctx: ctx, + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: true, }, @@ -1965,7 +2069,7 @@ func TestUseCasesClinicalImpl_GetPatientRespiratoryRateEntries(t *testing.T) { infra := infrastructure.NewInfrastructureInteractor(fakeExt, fakeFHIR, fakeOCL, fakeMCH) u := clinicalUsecase.NewUseCasesClinicalImpl(infra) - got, err := u.GetPatientRespiratoryRateEntries(tt.args.ctx, tt.args.patientID) + got, err := u.GetPatientRespiratoryRateEntries(tt.args.ctx, tt.args.patientID, tt.args.pagination) if (err != nil) != tt.wantErr { t.Errorf("UseCasesClinicalImpl.GetPatientRespiratoryRateEntries() error = %v, wantErr %v", err, tt.wantErr) return @@ -1981,10 +2085,12 @@ func TestUseCasesClinicalImpl_GetPatientRespiratoryRateEntries(t *testing.T) { } func TestUseCasesClinicalImpl_GetPatientBMIEntries(t *testing.T) { + first := 10 ctx := context.Background() type args struct { - ctx context.Context - patientID string + ctx context.Context + patientID string + pagination *dto.Pagination } tests := []struct { name string @@ -1996,6 +2102,9 @@ func TestUseCasesClinicalImpl_GetPatientBMIEntries(t *testing.T) { args: args{ ctx: ctx, patientID: uuid.New().String(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -2003,6 +2112,9 @@ func TestUseCasesClinicalImpl_GetPatientBMIEntries(t *testing.T) { name: "Sad Case - Invalid patient ID", args: args{ ctx: ctx, + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: true, }, @@ -2017,7 +2129,7 @@ func TestUseCasesClinicalImpl_GetPatientBMIEntries(t *testing.T) { infra := infrastructure.NewInfrastructureInteractor(fakeExt, fakeFHIR, fakeOCL, fakeMCH) u := clinicalUsecase.NewUseCasesClinicalImpl(infra) - got, err := u.GetPatientBMIEntries(tt.args.ctx, tt.args.patientID) + got, err := u.GetPatientBMIEntries(tt.args.ctx, tt.args.patientID, tt.args.pagination) if (err != nil) != tt.wantErr { t.Errorf("UseCasesClinicalImpl.GetPatientBMIEntries() error = %v, wantErr %v", err, tt.wantErr) return @@ -2033,9 +2145,11 @@ func TestUseCasesClinicalImpl_GetPatientBMIEntries(t *testing.T) { } func TestUseCasesClinicalImpl_GetPatientWeightEntries(t *testing.T) { + first := 10 type args struct { - ctx context.Context - patientID string + ctx context.Context + patientID string + pagination *dto.Pagination } tests := []struct { name string @@ -2047,6 +2161,9 @@ func TestUseCasesClinicalImpl_GetPatientWeightEntries(t *testing.T) { args: args{ ctx: context.Background(), patientID: gofakeit.UUID(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: false, }, @@ -2055,6 +2172,9 @@ func TestUseCasesClinicalImpl_GetPatientWeightEntries(t *testing.T) { args: args{ ctx: context.Background(), patientID: gofakeit.BS(), + pagination: &dto.Pagination{ + First: &first, + }, }, wantErr: true, }, @@ -2069,7 +2189,7 @@ func TestUseCasesClinicalImpl_GetPatientWeightEntries(t *testing.T) { infra := infrastructure.NewInfrastructureInteractor(fakeExt, fakeFHIR, fakeOCL, fakeMCH) c := clinicalUsecase.NewUseCasesClinicalImpl(infra) - _, err := c.GetPatientWeightEntries(tt.args.ctx, tt.args.patientID) + _, err := c.GetPatientWeightEntries(tt.args.ctx, tt.args.patientID, tt.args.pagination) if (err != nil) != tt.wantErr { t.Errorf("UseCasesClinicalImpl.GetPatientWeightEntries() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/pkg/clinical/usecases/clinical/patient.go b/pkg/clinical/usecases/clinical/patient.go index 7bd84b73..f2aa6008 100644 --- a/pkg/clinical/usecases/clinical/patient.go +++ b/pkg/clinical/usecases/clinical/patient.go @@ -132,9 +132,9 @@ func (c *UseCasesClinicalImpl) GetMedicalData(ctx context.Context, patientID str return nil, fmt.Errorf("%s search error: %w", field, err) } - for _, edge := range conn.Edges { - if !hasNilInObservation(edge) { - data.Weight = append(data.Weight, mapFHIRObservationToObservationDTO(edge.Node)) + for _, observation := range conn.Observations { + if !hasNilInObservation(observation) { + data.Weight = append(data.Weight, mapFHIRObservationToObservationDTO(observation)) } } @@ -147,9 +147,9 @@ func (c *UseCasesClinicalImpl) GetMedicalData(ctx context.Context, patientID str return nil, fmt.Errorf("%s search error: %w", field, err) } - for _, edge := range conn.Edges { - if !hasNilInObservation(edge) { - data.BMI = append(data.BMI, mapFHIRObservationToObservationDTO(edge.Node)) + for _, observation := range conn.Observations { + if !hasNilInObservation(observation) { + data.BMI = append(data.BMI, mapFHIRObservationToObservationDTO(observation)) } } @@ -162,9 +162,9 @@ func (c *UseCasesClinicalImpl) GetMedicalData(ctx context.Context, patientID str return nil, fmt.Errorf("%s search error: %w", field, err) } - for _, edge := range conn.Edges { - if !hasNilInObservation(edge) { - data.ViralLoad = append(data.ViralLoad, mapFHIRObservationToObservationDTO(edge.Node)) + for _, observation := range conn.Observations { + if !hasNilInObservation(observation) { + data.ViralLoad = append(data.ViralLoad, mapFHIRObservationToObservationDTO(observation)) } } @@ -177,9 +177,9 @@ func (c *UseCasesClinicalImpl) GetMedicalData(ctx context.Context, patientID str return nil, fmt.Errorf("%s search error: %w", field, err) } - for _, edge := range conn.Edges { - if !hasNilInObservation(edge) { - data.CD4Count = append(data.CD4Count, mapFHIRObservationToObservationDTO(edge.Node)) + for _, observation := range conn.Observations { + if !hasNilInObservation(observation) { + data.CD4Count = append(data.CD4Count, mapFHIRObservationToObservationDTO(observation)) } } } @@ -188,24 +188,24 @@ func (c *UseCasesClinicalImpl) GetMedicalData(ctx context.Context, patientID str return data, nil } -func hasNilInObservation(observation *domain.FHIRObservationRelayEdge) bool { - if observation.Node == nil { +func hasNilInObservation(observation domain.FHIRObservation) bool { + if observation.ID == nil { return true } - if observation.Node.Code.Coding == nil { + if observation.Code.Coding == nil { return true } - if len(observation.Node.Code.Coding) < 1 { + if len(observation.Code.Coding) < 1 { return true } - if observation.Node.Subject == nil { + if observation.Subject == nil { return true } - if observation.Node.Subject.ID == nil { + if observation.Subject.ID == nil { return true } @@ -262,7 +262,7 @@ func mapFHIRAllergyIntoleranceToAllergyIntoleranceDTO(fhirAllergyIntolerance dom return allergyIntolerance } -func mapFHIRObservationToObservationDTO(fhirObservation *domain.FHIRObservation) *dto.Observation { +func mapFHIRObservationToObservationDTO(fhirObservation domain.FHIRObservation) *dto.Observation { var value string if fhirObservation.ValueQuantity != nil { diff --git a/pkg/clinical/usecases/clinical/patient_unit_test.go b/pkg/clinical/usecases/clinical/patient_unit_test.go index b4905b05..4cf7c5f0 100644 --- a/pkg/clinical/usecases/clinical/patient_unit_test.go +++ b/pkg/clinical/usecases/clinical/patient_unit_test.go @@ -211,14 +211,6 @@ func TestClinicalUseCaseImpl_GetMedicalData(t *testing.T) { }, wantErr: false, }, - { - name: "Sad Case - Fail to search observation - nil node", - args: args{ - ctx: context.Background(), - patientID: gofakeit.UUID(), - }, - wantErr: false, - }, { name: "Sad Case - Fail to search observation - nil coding", args: args{ @@ -855,649 +847,640 @@ 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.FHIRObservationRelayConnection, 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() - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - }, - Subject: &domain.FHIRReference{ - ID: new(string), - }, - Encounter: &domain.FHIRReference{ - ID: new(string), - }, - ValueQuantity: &domain.FHIRQuantity{ + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + }, + Subject: &domain.FHIRReference{ + ID: new(string), + }, + Encounter: &domain.FHIRReference{ + ID: new(string), + }, + ValueQuantity: &domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), + }, }, }, - PageInfo: &firebasetools.PageInfo{}, - }, nil - } - } - - if tt.name == "Sad Case - Fail to search observation - nil node" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRObservationRelayConnection, error) { - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ - { - Cursor: new(string), - }, - }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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() - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - }, - Subject: &domain.FHIRReference{ - ID: new(string), - }, - Encounter: &domain.FHIRReference{ - ID: new(string), - }, - ValueQuantity: &domain.FHIRQuantity{ + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + ID: new(string), + }, + Subject: &domain.FHIRReference{ + ID: new(string), + }, + Encounter: &domain.FHIRReference{ + ID: new(string), + }, + ValueQuantity: &domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), + }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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() - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{}, - }, - Subject: &domain.FHIRReference{ - ID: new(string), - }, - Encounter: &domain.FHIRReference{ - ID: new(string), - }, - ValueQuantity: &domain.FHIRQuantity{ + Coding: []*domain.FHIRCoding{}, + }, + Subject: &domain.FHIRReference{ + ID: new(string), + }, + Encounter: &domain.FHIRReference{ + ID: new(string), + }, + ValueQuantity: &domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), + }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, error) { + fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRObservations, error) { valueConcept := "222" UUID := gofakeit.UUID() - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ + ID: new(string), + Code: domain.FHIRCodeableConcept{ ID: new(string), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - }, - Encounter: &domain.FHIRReference{ - ID: new(string), - }, - ValueQuantity: &domain.FHIRQuantity{ + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + }, + Encounter: &domain.FHIRReference{ + ID: new(string), + }, + ValueQuantity: &domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), + }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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() - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - }, - Encounter: &domain.FHIRReference{ - ID: new(string), - }, - ValueQuantity: &domain.FHIRQuantity{ + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + }, + Encounter: &domain.FHIRReference{ + ID: new(string), + }, + ValueQuantity: &domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), + }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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() - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - }, - Subject: &domain.FHIRReference{}, - Encounter: &domain.FHIRReference{ - ID: new(string), - }, - ValueQuantity: &domain.FHIRQuantity{ + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + }, + Subject: &domain.FHIRReference{}, + Encounter: &domain.FHIRReference{ + ID: new(string), + }, + ValueQuantity: &domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), + }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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() - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - }, - Subject: &domain.FHIRReference{ - ID: new(string), - }, - ValueQuantity: &domain.FHIRQuantity{ + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + }, + Subject: &domain.FHIRReference{ + ID: new(string), + }, + ValueQuantity: &domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), + }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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() - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - ID: new(string), - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - }, - Subject: &domain.FHIRReference{ - ID: new(string), - }, - Encounter: &domain.FHIRReference{}, - ValueQuantity: &domain.FHIRQuantity{ + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + ID: new(string), + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + }, + Subject: &domain.FHIRReference{ + ID: new(string), + }, + Encounter: &domain.FHIRReference{}, + ValueQuantity: &domain.FHIRQuantity{ + Value: 100, + Unit: "cm", + }, + ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), + ValueString: new(string), + ValueBoolean: new(bool), + ValueInteger: new(string), + ValueRange: &domain.FHIRRange{ + Low: domain.FHIRQuantity{ Value: 100, Unit: "cm", }, - ValueCodeableConcept: (*scalarutils.Code)(&valueConcept), - ValueString: new(string), - ValueBoolean: new(bool), - ValueInteger: new(string), - ValueRange: &domain.FHIRRange{ - Low: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - High: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueRatio: &domain.FHIRRatio{ - Numerator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - Denominator: domain.FHIRQuantity{ - Value: 100, - Unit: "cm", - }, - }, - ValueSampledData: &domain.FHIRSampledData{ - ID: &UUID, + High: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValueTime: &time.Time{}, - ValueDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, + }, + ValueRatio: &domain.FHIRRatio{ + Numerator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, - ValuePeriod: &domain.FHIRPeriod{ - Start: scalarutils.DateTime(time.Wednesday.String()), - End: scalarutils.DateTime(time.Thursday.String()), + Denominator: domain.FHIRQuantity{ + Value: 100, + Unit: "cm", }, }, + ValueSampledData: &domain.FHIRSampledData{ + ID: &UUID, + }, + ValueTime: &time.Time{}, + ValueDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, + }, + ValuePeriod: &domain.FHIRPeriod{ + Start: scalarutils.DateTime(time.Wednesday.String()), + End: scalarutils.DateTime(time.Thursday.String()), + }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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") } - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ - { - Cursor: new(string), - Node: &domain.FHIRObservation{}, - }, - }, - PageInfo: &firebasetools.PageInfo{}, + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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") } - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ - { - Cursor: new(string), - Node: &domain.FHIRObservation{}, - }, - }, - PageInfo: &firebasetools.PageInfo{}, + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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") } - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ - { - Cursor: new(string), - Node: &domain.FHIRObservation{}, - }, - }, - PageInfo: &firebasetools.PageInfo{}, + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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") } - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ - { - Cursor: new(string), - Node: &domain.FHIRObservation{}, - }, - }, - PageInfo: &firebasetools.PageInfo{}, + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } diff --git a/pkg/clinical/usecases/clinical/pubsub_test.go b/pkg/clinical/usecases/clinical/pubsub_test.go index 5f2b0318..86e51f22 100644 --- a/pkg/clinical/usecases/clinical/pubsub_test.go +++ b/pkg/clinical/usecases/clinical/pubsub_test.go @@ -326,7 +326,7 @@ func TestUseCasesClinicalImpl_CreatePubsubVitals(t *testing.T) { } if tt.name == "Sad Case - Fail to create observation" { - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to create observation") } } @@ -469,7 +469,7 @@ func TestUseCasesClinicalImpl_CreatePubsubTestResult(t *testing.T) { } if tt.name == "Sad Case - fail to create observation" { - fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservationRelayPayload, error) { + fakeFHIR.MockCreateFHIRObservationFn = func(ctx context.Context, input domain.FHIRObservationInput) (*domain.FHIRObservation, error) { return nil, fmt.Errorf("failed to create observation") } } diff --git a/pkg/clinical/usecases/clinical/timeline.go b/pkg/clinical/usecases/clinical/timeline.go index 54f94a1b..87dde83d 100644 --- a/pkg/clinical/usecases/clinical/timeline.go +++ b/pkg/clinical/usecases/clinical/timeline.go @@ -3,9 +3,10 @@ package clinical import ( "context" "fmt" - "github.com/savannahghi/clinical/pkg/clinical/application/common/helpers" "sync" + "github.com/savannahghi/clinical/pkg/clinical/application/common/helpers" + linq "github.com/ahmetb/go-linq/v3" "github.com/google/uuid" "github.com/savannahghi/clinical/pkg/clinical/application/dto" @@ -105,32 +106,28 @@ func (c *UseCasesClinicalImpl) PatientTimeline(ctx context.Context, patientID st return } - for _, edge := range conn.Edges { - if edge.Node == nil { - continue - } - - if edge.Node.ID == nil { + for _, edge := range conn.Observations { + if edge.ID == nil { continue } - if edge.Node.Code.Coding == nil { + if edge.Code.Coding == nil { continue } - if len(edge.Node.Code.Coding) < 1 { + if len(edge.Code.Coding) < 1 { continue } - if edge.Node.Status == nil { + if edge.Status == nil { continue } - if edge.Node.EffectiveInstant == nil { + if edge.EffectiveInstant == nil { continue } - instant := helpers.ParseDate(string(*edge.Node.EffectiveInstant)) + instant := helpers.ParseDate(string(*edge.EffectiveInstant)) date, err := scalarutils.NewDate(instant.Day(), int(instant.Month()), instant.Year()) if err != nil { @@ -141,11 +138,11 @@ func (c *UseCasesClinicalImpl) PatientTimeline(ctx context.Context, patientID st } timelineResource := dto.TimelineResource{ - ID: *edge.Node.ID, + ID: *edge.ID, ResourceType: dto.ResourceTypeObservation, - Name: edge.Node.Code.Text, - Value: edge.Node.Code.Coding[0].Display, - Status: string(*edge.Node.Status), + Name: edge.Code.Text, + Value: edge.Code.Coding[0].Display, + Status: string(*edge.Status), Date: *date, } diff --git a/pkg/clinical/usecases/clinical/timeline_test.go b/pkg/clinical/usecases/clinical/timeline_test.go index 6bb6aa20..76ac82c2 100644 --- a/pkg/clinical/usecases/clinical/timeline_test.go +++ b/pkg/clinical/usecases/clinical/timeline_test.go @@ -134,14 +134,6 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { }, wantErr: false, }, - { - name: "Sad Case - Fail to get observation - nil node", - args: args{ - ctx: context.Background(), - patientID: gofakeit.UUID(), - }, - wantErr: false, - }, { name: "Sad Case - Fail to get observation - nil node id", args: args{ @@ -318,30 +310,31 @@ func TestClinicalUseCaseImpl_PatientTimeline(t *testing.T) { }, nil } - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRObservationRelayConnection, 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.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - Text: gofakeit.BS(), - }, - EffectiveDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, - }, + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + Text: gofakeit.BS(), + }, + EffectiveDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } @@ -680,181 +673,174 @@ 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.FHIRObservationRelayConnection, error) { - return &domain.FHIRObservationRelayConnection{}, fmt.Errorf("failed to get observation") - } - } - - if tt.name == "Sad Case - Fail to get observation - nil node" { - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRObservationRelayConnection, error) { - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ - { - Cursor: new(string), - }, - }, - PageInfo: &firebasetools.PageInfo{}, - }, nil + 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.FHIRObservationRelayConnection, 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.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - Text: gofakeit.BS(), - }, - EffectiveDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, - }, + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + Text: gofakeit.BS(), + }, + EffectiveDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - Text: gofakeit.BS(), - }, - EffectiveDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, - }, + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + Text: gofakeit.BS(), + }, + EffectiveDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - Coding: []*domain.FHIRCoding{}, - Text: gofakeit.BS(), - }, - EffectiveDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, - }, + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + Coding: []*domain.FHIRCoding{}, + Text: gofakeit.BS(), + }, + EffectiveDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, error) { - return &domain.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + 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{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Code: domain.FHIRCodeableConcept{ - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - Text: gofakeit.BS(), - }, - EffectiveDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, - }, + ID: new(string), + Code: domain.FHIRCodeableConcept{ + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + Text: gofakeit.BS(), + }, + EffectiveDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - Text: gofakeit.BS(), - }, - EffectiveDateTime: &scalarutils.Date{ - Year: 20000, - Month: 1, - Day: 1, - }, + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + Text: gofakeit.BS(), + }, + EffectiveDateTime: &scalarutils.Date{ + Year: 20000, + Month: 1, + Day: 1, }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } 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.FHIRObservationRelayConnection, 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.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - Text: gofakeit.BS(), - }, + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + Text: gofakeit.BS(), }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } } @@ -1177,30 +1163,31 @@ func TestClinicalUseCaseImpl_PatientHealthTimeline(t *testing.T) { }, nil } - fakeFHIR.MockSearchFHIRObservationFn = func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRObservationRelayConnection, 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.FHIRObservationRelayConnection{ - Edges: []*domain.FHIRObservationRelayEdge{ + return &domain.PagedFHIRObservations{ + Observations: []domain.FHIRObservation{ { - Cursor: new(string), - Node: &domain.FHIRObservation{ - ID: new(string), - Status: (*domain.ObservationStatusEnum)(&status), - Code: domain.FHIRCodeableConcept{ - Coding: []*domain.FHIRCoding{{ - Display: gofakeit.BS(), - }}, - Text: gofakeit.BS(), - }, - EffectiveDateTime: &scalarutils.Date{ - Year: 2000, - Month: 1, - Day: 1, - }, + ID: new(string), + Status: (*domain.ObservationStatusEnum)(&status), + Code: domain.FHIRCodeableConcept{ + Coding: []*domain.FHIRCoding{{ + Display: gofakeit.BS(), + }}, + Text: gofakeit.BS(), + }, + EffectiveDateTime: &scalarutils.Date{ + Year: 2000, + Month: 1, + Day: 1, }, }, }, - PageInfo: &firebasetools.PageInfo{}, + HasNextPage: false, + NextCursor: "", + HasPreviousPage: false, + PreviousCursor: "", + TotalCount: 0, }, nil } diff --git a/pkg/clinical/usecases/usecases.go b/pkg/clinical/usecases/usecases.go index 0160b7fc..7275f002 100644 --- a/pkg/clinical/usecases/usecases.go +++ b/pkg/clinical/usecases/usecases.go @@ -46,14 +46,14 @@ type Clinical interface { RecordBMI(ctx context.Context, input dto.ObservationInput) (*dto.Observation, error) RecordObservation(ctx context.Context, input dto.ObservationInput, vitalSignConceptID string) (*dto.Observation, error) - GetPatientObservations(ctx context.Context, patientID string, observationCode string) ([]*dto.Observation, error) - GetPatientTemperatureEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientBloodPressureEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientHeightEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientRespiratoryRateEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientPulseRateEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientBMIEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) - GetPatientWeightEntries(ctx context.Context, patientID string) ([]*dto.Observation, error) + GetPatientObservations(ctx context.Context, patientID string, observationCode string, pagination *dto.Pagination) (*dto.ObservationConnection, error) + GetPatientTemperatureEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) + GetPatientBloodPressureEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) + GetPatientHeightEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) + GetPatientRespiratoryRateEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) + GetPatientPulseRateEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) + GetPatientBMIEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) + GetPatientWeightEntries(ctx context.Context, patientID string, pagination *dto.Pagination) (*dto.ObservationConnection, error) CreateAllergyIntolerance(ctx context.Context, input dto.AllergyInput) (*dto.Allergy, error) SearchAllergy(ctx context.Context, name string, pagination dto.Pagination) (*dto.TerminologyConnection, error)