Skip to content

Commit

Permalink
feat: get cervical patient HPV risk level
Browse files Browse the repository at this point in the history
  • Loading branch information
Salaton committed Feb 6, 2024
1 parent 5f19356 commit d984bcf
Show file tree
Hide file tree
Showing 10 changed files with 319 additions and 1 deletion.
5 changes: 5 additions & 0 deletions pkg/clinical/domain/questionnaire_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,8 @@ type FHIRQuestionnaireResponseItemAnswer struct {
ValueReference *FHIRReference `json:"valueReference,omitempty"`
Item []FHIRQuestionnaireResponseItem `json:"item,omitempty"`
}

// FHIRQuestionnaireResponseRelayPayload is used to return a single instance of Questionnaire
type FHIRQuestionnaireResponseRelayPayload struct {
Resource *FHIRQuestionnaireResponse `json:"resource,omitempty"`
}
16 changes: 16 additions & 0 deletions pkg/clinical/infrastructure/datastore/cloudhealthcare/fhir.go
Original file line number Diff line number Diff line change
Expand Up @@ -1840,3 +1840,19 @@ func (fh StoreImpl) GetFHIRQuestionnaire(_ context.Context, id string) (*domain.

return payload, nil
}

// GetFHIRQuestionnaireResponse retrieves an instance of FHIRQuestionnaireResponse by ID
func (fh StoreImpl) GetFHIRQuestionnaireResponse(_ context.Context, id string) (*domain.FHIRQuestionnaireResponseRelayPayload, error) {
resource := &domain.FHIRQuestionnaireResponse{}

err := fh.Dataset.GetFHIRResource(questionnaireResponseResourceType, id, resource)
if err != nil {
return nil, fmt.Errorf("unable to get %s with ID %s, err: %w", questionnaireResponseResourceType, id, err)
}

payload := &domain.FHIRQuestionnaireResponseRelayPayload{
Resource: resource,
}

return payload, nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ type FHIRMock struct {
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)
MockGetFHIRQuestionnaireResponseFn func(ctx context.Context, id string) (*domain.FHIRQuestionnaireResponseRelayPayload, error)
}

// NewFHIRMock initializes a new instance of FHIR mock
Expand Down Expand Up @@ -235,7 +236,21 @@ func NewFHIRMock() *FHIRMock {
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
return &domain.FHIRRiskAssessmentRelayConnection{
Edges: []*domain.FHIRRiskAssessmentRelayEdge{
{
Node: &domain.FHIRRiskAssessment{
Prediction: []domain.FHIRRiskAssessmentPrediction{
{
Outcome: &domain.FHIRCodeableConcept{
Text: "High Risk",
},
},
},
},
},
},
}, 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 @@ -416,6 +431,26 @@ func NewFHIRMock() *FHIRMock {
MockStartEncounterFn: func(ctx context.Context, episodeID string) (string, error) {
return "test-encounter", nil
},
MockGetFHIRQuestionnaireResponseFn: func(ctx context.Context, id string) (*domain.FHIRQuestionnaireResponseRelayPayload, error) {
ID := uuid.New().String()
return &domain.FHIRQuestionnaireResponseRelayPayload{
Resource: &domain.FHIRQuestionnaireResponse{
ID: &id,
Author: &domain.FHIRReference{},
Item: []domain.FHIRQuestionnaireResponseItem{},
Encounter: &domain.FHIRReference{
ID: &ID,
Reference: &ID,
Display: "",
},
Source: &domain.FHIRReference{
ID: &ID,
Reference: &ID,
Display: "",
},
},
}, nil
},
MockUpgradeEpisodeFn: func(ctx context.Context, input domain.OTPEpisodeUpgradeInput) (*domain.EpisodeOfCarePayload, error) {
return &domain.EpisodeOfCarePayload{}, nil
},
Expand Down Expand Up @@ -1907,6 +1942,16 @@ func NewFHIRMock() *FHIRMock {
lowScore := 1
return &domain.FHIRQuestionnaireResponse{
ID: &ID,
Encounter: &domain.FHIRReference{
ID: &ID,
Reference: &ID,
Display: "",
},
Source: &domain.FHIRReference{
ID: &ID,
Reference: &ID,
Display: "",
},
Item: []domain.FHIRQuestionnaireResponseItem{
{
LinkID: "symptoms",
Expand Down Expand Up @@ -2323,3 +2368,8 @@ func (fh *FHIRMock) GetFHIRQuestionnaire(ctx context.Context, id string) (*domai
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)
}

// GetFHIRQuestionnaireResponse mocks the implementation of getting a single instance of a fhir questionnaire response
func (fh *FHIRMock) GetFHIRQuestionnaireResponse(ctx context.Context, id string) (*domain.FHIRQuestionnaireResponseRelayPayload, error) {
return fh.MockGetFHIRQuestionnaireResponseFn(ctx, id)
}
2 changes: 2 additions & 0 deletions pkg/clinical/presentation/graph/clinical.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,8 @@ extend type Query {
searchParam: String
pagination: Pagination!
): QuestionnaireConnection!

getQuestionnaireResponseRiskLevel(questionnaireResponseID: String!): String!
}

extend type Mutation {
Expand Down
7 changes: 7 additions & 0 deletions pkg/clinical/presentation/graph/clinical.resolvers.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

108 changes: 108 additions & 0 deletions pkg/clinical/presentation/graph/generated/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pkg/clinical/repository/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ type FHIRConsent interface {

type FHIRQuestionnaireResponse interface {
CreateFHIRQuestionnaireResponse(_ context.Context, input *domain.FHIRQuestionnaireResponse) (*domain.FHIRQuestionnaireResponse, error)
GetFHIRQuestionnaireResponse(ctx context.Context, id string) (*domain.FHIRQuestionnaireResponseRelayPayload, error)
}

type FHIRRiskAssessment interface {
Expand Down
37 changes: 37 additions & 0 deletions pkg/clinical/usecases/clinical/questionnaire_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,3 +189,40 @@ func (u *UseCasesClinicalImpl) recordRiskAssessment(

return nil
}

// GetQuestionnaireResponseRiskLevel fetches the risk level associated with a questionnaire response. This is based off the scoring
// of the questionnaire response. Outcome: High Risk / Low Risk
func (u *UseCasesClinicalImpl) GetQuestionnaireResponseRiskLevel(ctx context.Context, questionnaireResponseID string) (string, error) {
questionnaireResponse, err := u.infrastructure.FHIR.GetFHIRQuestionnaireResponse(ctx, questionnaireResponseID)
if err != nil {
return "", err
}

encounterReference := questionnaireResponse.Resource.Encounter.Reference
patientReference := questionnaireResponse.Resource.Source.Reference

riskAssessmentSearchParams := map[string]interface{}{
"patient": *patientReference,
"encounter": *encounterReference,
"_sort": "date",
"_count": "1",
}

identifiers, err := u.infrastructure.BaseExtension.GetTenantIdentifiers(ctx)
if err != nil {
return "", fmt.Errorf("failed to get tenant identifiers from context: %w", err)
}

riskAssessment, err := u.infrastructure.FHIR.SearchFHIRRiskAssessment(ctx, riskAssessmentSearchParams, *identifiers, dto.Pagination{})
if err != nil {
return "", err
}

riskLevel := ""

for _, assessment := range riskAssessment.Edges {
riskLevel = assessment.Node.Prediction[0].Outcome.Text
}

return riskLevel, nil
}
Loading

0 comments on commit d984bcf

Please sign in to comment.