From 48e47ea438a06171b977cf65107319fb5a945ff2 Mon Sep 17 00:00:00 2001 From: EspiraMarvin Date: Fri, 8 Dec 2023 12:45:01 +0300 Subject: [PATCH] query compositions with encounterID (#292) --- .../presentation/graph/clinical.graphql | 1 + .../presentation/graph/clinical.resolvers.go | 4 ++-- .../presentation/graph/generated/generated.go | 24 +++++++++++++------ pkg/clinical/usecases/clinical/composition.go | 8 +++++-- .../usecases/clinical/composition_test.go | 20 ++++++++++++---- pkg/clinical/usecases/usecases.go | 2 +- 6 files changed, 43 insertions(+), 16 deletions(-) diff --git a/pkg/clinical/presentation/graph/clinical.graphql b/pkg/clinical/presentation/graph/clinical.graphql index 603afa02..c52fd388 100644 --- a/pkg/clinical/presentation/graph/clinical.graphql +++ b/pkg/clinical/presentation/graph/clinical.graphql @@ -14,6 +14,7 @@ extend type Query { # Compositions listPatientCompositions( patientID: ID! + encounterID: String pagination: Pagination! ): CompositionConnection diff --git a/pkg/clinical/presentation/graph/clinical.resolvers.go b/pkg/clinical/presentation/graph/clinical.resolvers.go index 407c39d5..05302966 100644 --- a/pkg/clinical/presentation/graph/clinical.resolvers.go +++ b/pkg/clinical/presentation/graph/clinical.resolvers.go @@ -188,9 +188,9 @@ func (r *queryResolver) ListPatientConditions(ctx context.Context, patientID str } // ListPatientCompositions is the resolver for the listPatientCompositions field. -func (r *queryResolver) ListPatientCompositions(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.CompositionConnection, error) { +func (r *queryResolver) ListPatientCompositions(ctx context.Context, patientID string, encounterID *string, pagination dto.Pagination) (*dto.CompositionConnection, error) { r.CheckDependencies() - return r.usecases.ListPatientCompositions(ctx, patientID, pagination) + return r.usecases.ListPatientCompositions(ctx, patientID, encounterID, pagination) } // ListPatientEncounters is the resolver for the listPatientEncounters field. diff --git a/pkg/clinical/presentation/graph/generated/generated.go b/pkg/clinical/presentation/graph/generated/generated.go index 6a498de2..7caea10a 100644 --- a/pkg/clinical/presentation/graph/generated/generated.go +++ b/pkg/clinical/presentation/graph/generated/generated.go @@ -267,7 +267,7 @@ type ComplexityRoot struct { GetPatientViralLoad func(childComplexity int, patientID string, encounterID *string, pagination dto.Pagination) int 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 + ListPatientCompositions func(childComplexity int, patientID string, encounterID *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 @@ -347,7 +347,7 @@ type QueryResolver interface { GetMedicalData(ctx context.Context, patientID string) (*dto.MedicalData, error) GetEpisodeOfCare(ctx context.Context, id string) (*dto.EpisodeOfCare, 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) + ListPatientCompositions(ctx context.Context, patientID string, encounterID *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) GetPatientBloodPressureEntries(ctx context.Context, patientID string, encounterID *string, pagination dto.Pagination) (*dto.ObservationConnection, error) @@ -1590,7 +1590,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.ListPatientCompositions(childComplexity, args["patientID"].(string), args["pagination"].(dto.Pagination)), true + return e.complexity.Query.ListPatientCompositions(childComplexity, args["patientID"].(string), args["encounterID"].(*string), args["pagination"].(dto.Pagination)), true case "Query.listPatientConditions": if e.complexity.Query.ListPatientConditions == nil { @@ -1933,6 +1933,7 @@ var sources = []*ast.Source{ # Compositions listPatientCompositions( patientID: ID! + encounterID: String pagination: Pagination! ): CompositionConnection @@ -3453,15 +3454,24 @@ func (ec *executionContext) field_Query_listPatientCompositions_args(ctx context } } 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 } @@ -10055,7 +10065,7 @@ func (ec *executionContext) _Query_listPatientCompositions(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().ListPatientCompositions(rctx, fc.Args["patientID"].(string), fc.Args["pagination"].(dto.Pagination)) + return ec.resolvers.Query().ListPatientCompositions(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/composition.go b/pkg/clinical/usecases/clinical/composition.go index ba020eb9..8ec7e564 100644 --- a/pkg/clinical/usecases/clinical/composition.go +++ b/pkg/clinical/usecases/clinical/composition.go @@ -43,7 +43,6 @@ func (c *UseCasesClinicalImpl) CreateComposition(ctx context.Context, input dto. encounterRef := fmt.Sprintf("Encounter/%s", *encounter.Resource.ID) encounterType := scalarutils.URI("Encounter") - organizationRef := fmt.Sprintf("Organization/%s", identifiers.OrganizationID) today := time.Now() @@ -174,7 +173,7 @@ func mapFHIRCompositionToCompositionDTO(composition domain.FHIRComposition) *dto } // ListPatientCompositions lists a patient's compositions -func (c UseCasesClinicalImpl) ListPatientCompositions(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.CompositionConnection, error) { +func (c UseCasesClinicalImpl) ListPatientCompositions(ctx context.Context, patientID string, encounterID *string, pagination dto.Pagination) (*dto.CompositionConnection, error) { _, err := uuid.Parse(patientID) if err != nil { return nil, fmt.Errorf("invalid patient id: %s", patientID) @@ -201,6 +200,11 @@ func (c UseCasesClinicalImpl) ListPatientCompositions(ctx context.Context, patie "_sort": "date", } + if encounterID != nil { + encounterReference := fmt.Sprintf("Encounter/%s", *encounterID) + params["encounter"] = encounterReference + } + compositionsResponse, err := c.infrastructure.FHIR.SearchFHIRComposition(ctx, params, *identifiers, pagination) if err != nil { return nil, err diff --git a/pkg/clinical/usecases/clinical/composition_test.go b/pkg/clinical/usecases/clinical/composition_test.go index dedc67e6..709db79e 100644 --- a/pkg/clinical/usecases/clinical/composition_test.go +++ b/pkg/clinical/usecases/clinical/composition_test.go @@ -323,10 +323,12 @@ func TestUseCasesClinicalImpl_CreateComposition(t *testing.T) { func TestUseCasesClinicalImpl_ListPatientCompositions(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 @@ -342,6 +344,16 @@ func TestUseCasesClinicalImpl_ListPatientCompositions(t *testing.T) { }, wantErr: false, }, + { + name: "happy case: list compositions 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{ @@ -425,7 +437,7 @@ func TestUseCasesClinicalImpl_ListPatientCompositions(t *testing.T) { return nil, fmt.Errorf("failed to find condition") } } - got, err := c.ListPatientCompositions(tt.args.ctx, tt.args.patientID, tt.args.pagination) + got, err := c.ListPatientCompositions(tt.args.ctx, tt.args.patientID, tt.args.encounterID, tt.args.pagination) if (err != nil) != tt.wantErr { t.Errorf("ListPatientCompositions() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/pkg/clinical/usecases/usecases.go b/pkg/clinical/usecases/usecases.go index 721a9701..3fee94db 100644 --- a/pkg/clinical/usecases/usecases.go +++ b/pkg/clinical/usecases/usecases.go @@ -81,7 +81,7 @@ type Clinical interface { ListPatientMedia(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.MediaConnection, error) CreateComposition(ctx context.Context, input dto.CompositionInput) (*dto.Composition, error) - ListPatientCompositions(ctx context.Context, patientID string, pagination dto.Pagination) (*dto.CompositionConnection, error) + ListPatientCompositions(ctx context.Context, patientID string, encounterID *string, pagination dto.Pagination) (*dto.CompositionConnection, error) } // Interactor is an implementation of the usecases interface