Skip to content

Commit

Permalink
feat: add search fhir risk assessment resource
Browse files Browse the repository at this point in the history
  • Loading branch information
Salaton committed Feb 5, 2024
1 parent f08bec5 commit 9392cbd
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 0 deletions.
16 changes: 16 additions & 0 deletions pkg/clinical/domain/risk_assessment.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package domain

import "github.com/savannahghi/firebasetools"

// FHIRRiskAssessment resource captures predicted outcomes for a patient or population on the basis of source information
// http://hl7.org/fhir/StructureDefinition/RiskAssessment
type FHIRRiskAssessment struct {
Expand Down Expand Up @@ -77,3 +79,17 @@ type FHIRRiskAssessmentInput struct {
Mitigation *string `json:"mitigation,omitempty"`
Note []FHIRAnnotationInput `json:"note,omitempty"`
}

// FHIRRiskAssessmentRelayConnection is a Relay connection for RiskAssessment
type FHIRRiskAssessmentRelayConnection struct {
Edges []*FHIRRiskAssessmentRelayEdge `json:"edges,omitempty"`

PageInfo *firebasetools.PageInfo `json:"pageInfo,omitempty"`
}

// FHIRRiskAssessmentRelayEdge is a Relay edge for RiskAssessment
type FHIRRiskAssessmentRelayEdge struct {
Cursor *string `json:"cursor,omitempty"`

Node *FHIRRiskAssessment `json:"node,omitempty"`
}
31 changes: 31 additions & 0 deletions pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir.go
Original file line number Diff line number Diff line change
Expand Up @@ -1794,6 +1794,37 @@ func (fh StoreImpl) CreateFHIRRiskAssessment(_ context.Context, input *domain.FH
}, nil
}

// SearchFHIRRiskAssessment searches for a fhir risk assessment
func (fh StoreImpl) SearchFHIRRiskAssessment(_ context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRRiskAssessmentRelayConnection, error) {
output := domain.FHIRRiskAssessmentRelayConnection{}

resources, err := fh.Dataset.SearchFHIRResource(riskAssessmentResourceType, params, tenant, pagination)
if err != nil {
return nil, err
}

for _, result := range resources.Resources {
var resource domain.FHIRRiskAssessment

resourceBs, err := json.Marshal(result)
if err != nil {
return nil, fmt.Errorf("server error: Unable to marshal map to JSON: %w", err)
}

err = json.Unmarshal(resourceBs, &resource)
if err != nil {
return nil, fmt.Errorf(
"server error: Unable to unmarshal %s: %w", riskAssessmentResourceType, err)
}

output.Edges = append(output.Edges, &domain.FHIRRiskAssessmentRelayEdge{
Node: &resource,
})
}

return &output, nil
}

// GetFHIRQuestionnaire retrieves instances of FHIRQuestionnaire by ID
func (fh StoreImpl) GetFHIRQuestionnaire(_ context.Context, id string) (*domain.FHIRQuestionnaireRelayPayload, error) {
resource := &domain.FHIRQuestionnaire{}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4872,3 +4872,57 @@ func TestStoreImpl_GetFHIRQuestionnaire(t *testing.T) {
})
}
}

func TestStoreImpl_SearchFHIRRiskAssessment(t *testing.T) {
ctx := context.Background()
type args struct {
ctx context.Context
params map[string]interface{}
tenant dto.TenantIdentifiers
pagination dto.Pagination
}
tests := []struct {
name string
args args
want *domain.FHIRRiskAssessmentRelayConnection
wantErr bool
}{
{
name: "Happy Case - Successfully search a fhir risk assessment",
args: args{
ctx: ctx,
},
wantErr: false,
},
{
name: "Sad Case - fail to search a fhir risk assessment",
args: args{
ctx: ctx,
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
dataset := fakeDataset.NewFakeFHIRRepositoryMock()
fh := FHIR.NewFHIRStoreImpl(dataset)

if tt.name == "Sad Case - fail to search a fhir risk assessment" {
dataset.MockSearchFHIRResourceFn = func(resourceType string, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.PagedFHIRResource, error) {
return nil, fmt.Errorf("failed to search risk assessment")
}
}

got, err := fh.SearchFHIRRiskAssessment(tt.args.ctx, tt.args.params, tt.args.tenant, tt.args.pagination)
if (err != nil) != tt.wantErr {
t.Errorf("StoreImpl.SearchFHIRRiskAssessment() error = %v, wantErr %v", err, tt.wantErr)
return
}

if !tt.wantErr && got == nil {
t.Errorf("expected a response but got: %v", got)
return
}
})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ type FHIRMock struct {
MockCreateFHIRQuestionnaireResponseFn func(ctx context.Context, input *domain.FHIRQuestionnaireResponse) (*domain.FHIRQuestionnaireResponse, error)
MockCreateFHIRRiskAssessmentFn func(ctx context.Context, input *domain.FHIRRiskAssessmentInput) (*domain.FHIRRiskAssessmentRelayPayload, error)
MockGetFHIRQuestionnaireFn func(ctx context.Context, id string) (*domain.FHIRQuestionnaireRelayPayload, error)
MockSearchFHIRRiskAssessmentFn func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRRiskAssessmentRelayConnection, error)
}

// NewFHIRMock initializes a new instance of FHIR mock
Expand Down Expand Up @@ -233,6 +234,9 @@ func NewFHIRMock() *FHIRMock {
MockSearchFHIROrganizationFn: func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIROrganizationRelayConnection, error) {
return &domain.FHIROrganizationRelayConnection{}, nil
},
MockSearchFHIRRiskAssessmentFn: func(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRRiskAssessmentRelayConnection, error) {
return &domain.FHIRRiskAssessmentRelayConnection{}, nil
},
MockSearchEpisodesByParamFn: func(ctx context.Context, searchParams map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) ([]*domain.FHIREpisodeOfCare, error) {
return []*domain.FHIREpisodeOfCare{}, nil
},
Expand Down Expand Up @@ -2314,3 +2318,8 @@ func (fh *FHIRMock) CreateFHIRRiskAssessment(ctx context.Context, input *domain.
func (fh *FHIRMock) GetFHIRQuestionnaire(ctx context.Context, id string) (*domain.FHIRQuestionnaireRelayPayload, error) {
return fh.MockGetFHIRQuestionnaireFn(ctx, id)
}

// SearchFHIRRiskAssessment mocks the implementation of searching a FHIR risk assessment
func (fh *FHIRMock) SearchFHIRRiskAssessment(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRRiskAssessmentRelayConnection, error) {
return fh.MockSearchFHIRRiskAssessmentFn(ctx, params, tenant, pagination)
}
1 change: 1 addition & 0 deletions pkg/clinical/repository/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,4 +131,5 @@ type FHIRQuestionnaireResponse interface {

type FHIRRiskAssessment interface {
CreateFHIRRiskAssessment(_ context.Context, input *domain.FHIRRiskAssessmentInput) (*domain.FHIRRiskAssessmentRelayPayload, error)
SearchFHIRRiskAssessment(ctx context.Context, params map[string]interface{}, tenant dto.TenantIdentifiers, pagination dto.Pagination) (*domain.FHIRRiskAssessmentRelayConnection, error)
}

0 comments on commit 9392cbd

Please sign in to comment.