diff --git a/pkg/clinical/presentation/graph/clinical.graphql b/pkg/clinical/presentation/graph/clinical.graphql index 6235a93c..603afa02 100644 --- a/pkg/clinical/presentation/graph/clinical.graphql +++ b/pkg/clinical/presentation/graph/clinical.graphql @@ -7,6 +7,7 @@ extend type Query { # Conditions listPatientConditions( patientID: ID! + encounterID: String pagination: Pagination! ): ConditionConnection diff --git a/pkg/clinical/presentation/graph/clinical.resolvers.go b/pkg/clinical/presentation/graph/clinical.resolvers.go index e7eaecb0..407c39d5 100644 --- a/pkg/clinical/presentation/graph/clinical.resolvers.go +++ b/pkg/clinical/presentation/graph/clinical.resolvers.go @@ -182,9 +182,9 @@ func (r *queryResolver) GetEpisodeOfCare(ctx context.Context, id string) (*dto.E } // ListPatientConditions is the resolver for the listPatientConditions field. -func (r *queryResolver) ListPatientConditions(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ConditionConnection, error) { +func (r *queryResolver) ListPatientConditions(ctx context.Context, patientID string, encounterID *string, pagination dto.Pagination) (*dto.ConditionConnection, error) { r.CheckDependencies() - return r.usecases.ListPatientConditions(ctx, patientID, pagination) + return r.usecases.ListPatientConditions(ctx, patientID, encounterID, pagination) } // ListPatientCompositions is the resolver for the listPatientCompositions field. diff --git a/pkg/clinical/presentation/graph/generated/generated.go b/pkg/clinical/presentation/graph/generated/generated.go index b3ae01bf..6a498de2 100644 --- a/pkg/clinical/presentation/graph/generated/generated.go +++ b/pkg/clinical/presentation/graph/generated/generated.go @@ -268,7 +268,7 @@ type ComplexityRoot struct { GetPatientWeightEntries func(childComplexity int, patientID string, encounterID *string, pagination dto.Pagination) int ListPatientAllergies func(childComplexity int, patientID string, pagination dto.Pagination) int ListPatientCompositions func(childComplexity int, patientID string, pagination dto.Pagination) int - ListPatientConditions func(childComplexity int, patientID string, pagination dto.Pagination) int + ListPatientConditions func(childComplexity int, patientID string, encounterID *string, pagination dto.Pagination) int ListPatientEncounters func(childComplexity int, patientID string, pagination dto.Pagination) int ListPatientMedia func(childComplexity int, patientID string, pagination dto.Pagination) int PatientHealthTimeline func(childComplexity int, input dto.HealthTimelineInput) int @@ -346,7 +346,7 @@ type QueryResolver interface { PatientHealthTimeline(ctx context.Context, input dto.HealthTimelineInput) (*dto.HealthTimeline, error) GetMedicalData(ctx context.Context, patientID string) (*dto.MedicalData, error) GetEpisodeOfCare(ctx context.Context, id string) (*dto.EpisodeOfCare, error) - ListPatientConditions(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ConditionConnection, error) + ListPatientConditions(ctx context.Context, patientID string, encounterID *string, pagination dto.Pagination) (*dto.ConditionConnection, error) ListPatientCompositions(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.CompositionConnection, error) ListPatientEncounters(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.EncounterConnection, error) GetPatientTemperatureEntries(ctx context.Context, patientID string, encounterID *string, pagination dto.Pagination) (*dto.ObservationConnection, error) @@ -1602,7 +1602,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.ListPatientConditions(childComplexity, args["patientID"].(string), args["pagination"].(dto.Pagination)), true + return e.complexity.Query.ListPatientConditions(childComplexity, args["patientID"].(string), args["encounterID"].(*string), args["pagination"].(dto.Pagination)), true case "Query.listPatientEncounters": if e.complexity.Query.ListPatientEncounters == nil { @@ -1926,6 +1926,7 @@ var sources = []*ast.Source{ # Conditions listPatientConditions( patientID: ID! + encounterID: String pagination: Pagination! ): ConditionConnection @@ -3476,15 +3477,24 @@ func (ec *executionContext) field_Query_listPatientConditions_args(ctx context.C } } args["patientID"] = arg0 - var arg1 dto.Pagination + var arg1 *string + if tmp, ok := rawArgs["encounterID"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("encounterID")) + arg1, err = ec.unmarshalOString2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["encounterID"] = arg1 + var arg2 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) + arg2, err = ec.unmarshalNPagination2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPagination(ctx, tmp) if err != nil { return nil, err } } - args["pagination"] = arg1 + args["pagination"] = arg2 return args, nil } @@ -9985,7 +9995,7 @@ func (ec *executionContext) _Query_listPatientConditions(ctx context.Context, fi }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Query().ListPatientConditions(rctx, fc.Args["patientID"].(string), fc.Args["pagination"].(dto.Pagination)) + return ec.resolvers.Query().ListPatientConditions(rctx, fc.Args["patientID"].(string), fc.Args["encounterID"].(*string), fc.Args["pagination"].(dto.Pagination)) }) if err != nil { ec.Error(ctx, err) diff --git a/pkg/clinical/usecases/clinical/condition.go b/pkg/clinical/usecases/clinical/condition.go index 4980d718..bcb21ecb 100644 --- a/pkg/clinical/usecases/clinical/condition.go +++ b/pkg/clinical/usecases/clinical/condition.go @@ -180,7 +180,7 @@ func mapFHIRConditionToConditionDTO(condition domain.FHIRCondition) *dto.Conditi // ListPatientConditions lists a patients conditions // TODO: pagination -func (c UseCasesClinicalImpl) ListPatientConditions(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ConditionConnection, error) { +func (c UseCasesClinicalImpl) ListPatientConditions(ctx context.Context, patientID string, encounterID *string, pagination dto.Pagination) (*dto.ConditionConnection, error) { _, err := uuid.Parse(patientID) if err != nil { return nil, fmt.Errorf("invalid patient id: %s", patientID) @@ -207,6 +207,11 @@ func (c UseCasesClinicalImpl) ListPatientConditions(ctx context.Context, patient "_sort": "date", } + if encounterID != nil { + encounterReference := fmt.Sprintf("Encounter/%s", *encounterID) + params["encounter"] = encounterReference + } + conditionsResponse, err := c.infrastructure.FHIR.SearchFHIRCondition(ctx, params, *identifiers, pagination) if err != nil { return nil, err diff --git a/pkg/clinical/usecases/clinical/condition_test.go b/pkg/clinical/usecases/clinical/condition_test.go index ea88f264..8cb754a8 100644 --- a/pkg/clinical/usecases/clinical/condition_test.go +++ b/pkg/clinical/usecases/clinical/condition_test.go @@ -460,10 +460,12 @@ func TestUseCasesClinicalImpl_CreateCondition(t *testing.T) { func TestUseCasesClinicalImpl_ListPatientConditions(t *testing.T) { first := 3 + encounterId := uuid.New().String() type args struct { - ctx context.Context - patientID string - pagination dto.Pagination + ctx context.Context + patientID string + encounterID *string + pagination dto.Pagination } tests := []struct { name string @@ -479,6 +481,16 @@ func TestUseCasesClinicalImpl_ListPatientConditions(t *testing.T) { }, wantErr: false, }, + { + name: "happy case: list conditions with encounterID", + args: args{ + ctx: context.Background(), + patientID: gofakeit.UUID(), + encounterID: &encounterId, + pagination: dto.Pagination{}, + }, + wantErr: false, + }, { name: "sad case: invalid patient id", args: args{ @@ -557,7 +569,7 @@ func TestUseCasesClinicalImpl_ListPatientConditions(t *testing.T) { } } - got, err := c.ListPatientConditions(tt.args.ctx, tt.args.patientID, tt.args.pagination) + got, err := c.ListPatientConditions(tt.args.ctx, tt.args.patientID, tt.args.encounterID, tt.args.pagination) if (err != nil) != tt.wantErr { t.Errorf("ListPatientConditions() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/pkg/clinical/usecases/usecases.go b/pkg/clinical/usecases/usecases.go index 46a0f36d..721a9701 100644 --- a/pkg/clinical/usecases/usecases.go +++ b/pkg/clinical/usecases/usecases.go @@ -20,7 +20,7 @@ type Clinical interface { EndEpisodeOfCare(ctx context.Context, id string) (*dto.EpisodeOfCare, error) CreateCondition(ctx context.Context, input dto.ConditionInput) (*dto.Condition, error) - ListPatientConditions(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.ConditionConnection, error) + ListPatientConditions(ctx context.Context, patientID string, encounterID *string, pagination dto.Pagination) (*dto.ConditionConnection, error) PatientHealthTimeline(ctx context.Context, input dto.HealthTimelineInput) (*dto.HealthTimeline, error) GetMedicalData(ctx context.Context, patientID string) (*dto.MedicalData, error)