diff --git a/pkg/clinical/presentation/graph/clinical.graphql b/pkg/clinical/presentation/graph/clinical.graphql index 250a4ad5..5a110b00 100644 --- a/pkg/clinical/presentation/graph/clinical.graphql +++ b/pkg/clinical/presentation/graph/clinical.graphql @@ -16,6 +16,7 @@ extend type Query { listPatientCompositions( patientID: ID! encounterID: String + date: Date pagination: Pagination! ): CompositionConnection diff --git a/pkg/clinical/presentation/graph/clinical.resolvers.go b/pkg/clinical/presentation/graph/clinical.resolvers.go index 57588258..e7a31917 100644 --- a/pkg/clinical/presentation/graph/clinical.resolvers.go +++ b/pkg/clinical/presentation/graph/clinical.resolvers.go @@ -189,9 +189,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, encounterID *string, pagination dto.Pagination) (*dto.CompositionConnection, error) { +func (r *queryResolver) ListPatientCompositions(ctx context.Context, patientID string, encounterID *string, date *scalarutils.Date, pagination dto.Pagination) (*dto.CompositionConnection, error) { r.CheckDependencies() - return r.usecases.ListPatientCompositions(ctx, patientID, encounterID, pagination) + return r.usecases.ListPatientCompositions(ctx, patientID, encounterID, date, 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 e2786cb8..9fbb49af 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, date *scalarutils.Date, pagination dto.Pagination) int GetPatientWeightEntries func(childComplexity int, patientID string, encounterID *string, date *scalarutils.Date, pagination dto.Pagination) int ListPatientAllergies func(childComplexity int, patientID string, pagination dto.Pagination) int - ListPatientCompositions func(childComplexity int, patientID string, encounterID *string, pagination dto.Pagination) int + ListPatientCompositions func(childComplexity int, patientID string, encounterID *string, date *scalarutils.Date, pagination dto.Pagination) int ListPatientConditions func(childComplexity int, patientID string, encounterID *string, date *scalarutils.Date, 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, date *scalarutils.Date, pagination dto.Pagination) (*dto.ConditionConnection, error) - ListPatientCompositions(ctx context.Context, patientID string, encounterID *string, pagination dto.Pagination) (*dto.CompositionConnection, error) + ListPatientCompositions(ctx context.Context, patientID string, encounterID *string, date *scalarutils.Date, 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, date *scalarutils.Date, pagination dto.Pagination) (*dto.ObservationConnection, error) GetPatientBloodPressureEntries(ctx context.Context, patientID string, encounterID *string, date *scalarutils.Date, 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["encounterID"].(*string), args["pagination"].(dto.Pagination)), true + return e.complexity.Query.ListPatientCompositions(childComplexity, args["patientID"].(string), args["encounterID"].(*string), args["date"].(*scalarutils.Date), args["pagination"].(dto.Pagination)), true case "Query.listPatientConditions": if e.complexity.Query.ListPatientConditions == nil { @@ -1935,6 +1935,7 @@ var sources = []*ast.Source{ listPatientCompositions( patientID: ID! encounterID: String + date: Date pagination: Pagination! ): CompositionConnection @@ -3594,15 +3595,24 @@ func (ec *executionContext) field_Query_listPatientCompositions_args(ctx context } } args["encounterID"] = arg1 - var arg2 dto.Pagination + var arg2 *scalarutils.Date + if tmp, ok := rawArgs["date"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("date")) + arg2, err = ec.unmarshalODate2ᚖgithubᚗcomᚋsavannahghiᚋscalarutilsᚐDate(ctx, tmp) + if err != nil { + return nil, err + } + } + args["date"] = arg2 + var arg3 dto.Pagination if tmp, ok := rawArgs["pagination"]; ok { ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) - arg2, err = ec.unmarshalNPagination2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPagination(ctx, tmp) + arg3, err = ec.unmarshalNPagination2githubᚗcomᚋsavannahghiᚋclinicalᚋpkgᚋclinicalᚋapplicationᚋdtoᚐPagination(ctx, tmp) if err != nil { return nil, err } } - args["pagination"] = arg2 + args["pagination"] = arg3 return args, nil } @@ -10205,7 +10215,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["encounterID"].(*string), fc.Args["pagination"].(dto.Pagination)) + return ec.resolvers.Query().ListPatientCompositions(rctx, fc.Args["patientID"].(string), fc.Args["encounterID"].(*string), fc.Args["date"].(*scalarutils.Date), 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 8ec7e564..ca2a3bbe 100644 --- a/pkg/clinical/usecases/clinical/composition.go +++ b/pkg/clinical/usecases/clinical/composition.go @@ -173,7 +173,7 @@ func mapFHIRCompositionToCompositionDTO(composition domain.FHIRComposition) *dto } // ListPatientCompositions lists a patient's compositions -func (c UseCasesClinicalImpl) ListPatientCompositions(ctx context.Context, patientID string, encounterID *string, pagination dto.Pagination) (*dto.CompositionConnection, error) { +func (c UseCasesClinicalImpl) ListPatientCompositions(ctx context.Context, patientID string, encounterID *string, date *scalarutils.Date, pagination dto.Pagination) (*dto.CompositionConnection, error) { _, err := uuid.Parse(patientID) if err != nil { return nil, fmt.Errorf("invalid patient id: %s", patientID) @@ -205,6 +205,10 @@ func (c UseCasesClinicalImpl) ListPatientCompositions(ctx context.Context, patie params["encounter"] = encounterReference } + if date != nil { + params["date"] = date.AsTime().Format(dateFormatStr) + } + 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 709db79e..2362cbb2 100644 --- a/pkg/clinical/usecases/clinical/composition_test.go +++ b/pkg/clinical/usecases/clinical/composition_test.go @@ -328,6 +328,7 @@ func TestUseCasesClinicalImpl_ListPatientCompositions(t *testing.T) { ctx context.Context patientID string encounterID *string + date *scalarutils.Date pagination dto.Pagination } tests := []struct { @@ -354,6 +355,20 @@ func TestUseCasesClinicalImpl_ListPatientCompositions(t *testing.T) { }, wantErr: false, }, + { + name: "happy case: list compositions with date", + args: args{ + ctx: context.Background(), + patientID: gofakeit.UUID(), + date: &scalarutils.Date{ + Year: 2023, + Month: 12, + Day: 11, + }, + pagination: dto.Pagination{}, + }, + wantErr: false, + }, { name: "sad case: invalid patient id", args: args{ @@ -437,7 +452,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.encounterID, tt.args.pagination) + got, err := c.ListPatientCompositions(tt.args.ctx, tt.args.patientID, tt.args.encounterID, tt.args.date, 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 e475a261..63800495 100644 --- a/pkg/clinical/usecases/usecases.go +++ b/pkg/clinical/usecases/usecases.go @@ -82,7 +82,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, encounterID *string, pagination dto.Pagination) (*dto.CompositionConnection, error) + ListPatientCompositions(ctx context.Context, patientID string, encounterID *string, date *scalarutils.Date, pagination dto.Pagination) (*dto.CompositionConnection, error) } // Interactor is an implementation of the usecases interface