Skip to content

Commit

Permalink
feat: create episode of care
Browse files Browse the repository at this point in the history
  • Loading branch information
Muchogoc committed Mar 16, 2023
1 parent 30c764d commit 25c2d6a
Show file tree
Hide file tree
Showing 18 changed files with 945 additions and 57 deletions.
1 change: 1 addition & 0 deletions gqlgen.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ autobind:
- "github.com/savannahghi/scalarutils"
- "github.com/savannahghi/enumutils"
- "github.com/savannahghi/firebasetools"
- "github.com/savannahghi/clinical/pkg/clinical/application/dto"
- "github.com/savannahghi/clinical/pkg/clinical/domain"
- "github.com/savannahghi/clinical/pkg/clinical/presentation/graph"
- "github.com/savannahghi/clinical/pkg/clinical/infrastructure/services/openconceptlab"
Expand Down
9 changes: 9 additions & 0 deletions pkg/clinical/application/dto/enums.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,12 @@ const (
MFLCode OrganizationIdentifierType = "MFLCode"
Other OrganizationIdentifierType = "Other"
)

type EpisodeOfCareStatusEnum string

const (
EpisodeOfCareStatusEnumPlanned EpisodeOfCareStatusEnum = "planned"
EpisodeOfCareStatusEnumActive EpisodeOfCareStatusEnum = "active"
EpisodeOfCareStatusEnumFinished EpisodeOfCareStatusEnum = "finished"
EpisodeOfCareStatusEnumCancelled EpisodeOfCareStatusEnum = "cancelled"
)
5 changes: 5 additions & 0 deletions pkg/clinical/application/dto/input.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,8 @@ type OrganizationInput struct {
PhoneNumber string `json:"phoneNumber,omitempty"`
Identifiers []OrganizationIdentifier `json:"identifiers,omitempty"`
}

type EpisodeOfCareInput struct {
Status EpisodeOfCareStatusEnum `json:"status"`
PatientID string `json:"patientID"`
}
6 changes: 6 additions & 0 deletions pkg/clinical/application/dto/output.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,9 @@ type Organization struct {
Identifiers []OrganizationIdentifier `json:"identifiers"`
PhoneNumbers []string `json:"phoneNumbers"`
}

type EpisodeOfCare struct {
ID string `json:"id"`
Status EpisodeOfCareStatusEnum `json:"status"`
PatientID string `json:"patientID"`
}
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ func (fh StoreImpl) SearchFHIREpisodeOfCare(ctx context.Context, params map[stri

// CreateEpisodeOfCare is the final common pathway for creation of episodes of
// care.
func (fh StoreImpl) CreateEpisodeOfCare(ctx context.Context, episode domain.FHIREpisodeOfCare) (*domain.EpisodeOfCarePayload, error) {
func (fh StoreImpl) CreateEpisodeOfCare(ctx context.Context, episode domain.FHIREpisodeOfCareInput) (*domain.EpisodeOfCarePayload, error) {
payload, err := converterandformatter.StructToMap(episode)
if err != nil {
return nil, fmt.Errorf("unable to turn episode of care input into a map: %w", err)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2903,7 +2903,7 @@ func TestStoreImpl_CreateEpisodeOfCare(t *testing.T) {
OrgRef := "Organization/"
type args struct {
ctx context.Context
episode domain.FHIREpisodeOfCare
episode domain.FHIREpisodeOfCareInput
}
tests := []struct {
name string
Expand All @@ -2914,13 +2914,13 @@ func TestStoreImpl_CreateEpisodeOfCare(t *testing.T) {
name: "Happy case: create episode of care",
args: args{
ctx: context.Background(),
episode: domain.FHIREpisodeOfCare{
episode: domain.FHIREpisodeOfCareInput{
ID: &UUID,
Status: &status,
Patient: &domain.FHIRReference{
Patient: &domain.FHIRReferenceInput{
Reference: &PatientRef,
},
ManagingOrganization: &domain.FHIRReference{
ManagingOrganization: &domain.FHIRReferenceInput{
Reference: &OrgRef,
},
},
Expand All @@ -2931,13 +2931,13 @@ func TestStoreImpl_CreateEpisodeOfCare(t *testing.T) {
name: "Happy case: create episode of care, episode does not exist",
args: args{
ctx: context.Background(),
episode: domain.FHIREpisodeOfCare{
episode: domain.FHIREpisodeOfCareInput{
ID: &UUID,
Status: &status,
Patient: &domain.FHIRReference{
Patient: &domain.FHIRReferenceInput{
Reference: &PatientRef,
},
ManagingOrganization: &domain.FHIRReference{
ManagingOrganization: &domain.FHIRReferenceInput{
Reference: &OrgRef,
},
},
Expand All @@ -2948,13 +2948,13 @@ func TestStoreImpl_CreateEpisodeOfCare(t *testing.T) {
name: "Sad case: failed to search FHIR episode of care",
args: args{
ctx: context.Background(),
episode: domain.FHIREpisodeOfCare{
episode: domain.FHIREpisodeOfCareInput{
ID: &UUID,
Status: &status,
Patient: &domain.FHIRReference{
Patient: &domain.FHIRReferenceInput{
Reference: &PatientRef,
},
ManagingOrganization: &domain.FHIRReference{
ManagingOrganization: &domain.FHIRReferenceInput{
Reference: &OrgRef,
},
},
Expand All @@ -2965,13 +2965,13 @@ func TestStoreImpl_CreateEpisodeOfCare(t *testing.T) {
name: "Sad case: failed to create FHIR resource",
args: args{
ctx: context.Background(),
episode: domain.FHIREpisodeOfCare{
episode: domain.FHIREpisodeOfCareInput{
ID: &UUID,
Status: &status,
Patient: &domain.FHIRReference{
Patient: &domain.FHIRReferenceInput{
Reference: &PatientRef,
},
ManagingOrganization: &domain.FHIRReference{
ManagingOrganization: &domain.FHIRReferenceInput{
Reference: &OrgRef,
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (

// FHIRMock struct implements mocks of FHIR methods.
type FHIRMock struct {
MockCreateEpisodeOfCareFn func(ctx context.Context, episode domain.FHIREpisodeOfCare) (*domain.EpisodeOfCarePayload, error)
MockCreateEpisodeOfCareFn func(ctx context.Context, episode domain.FHIREpisodeOfCareInput) (*domain.EpisodeOfCarePayload, error)
MockSearchFHIRConditionFn func(ctx context.Context, params map[string]interface{}) (*domain.FHIRConditionRelayConnection, error)
MockCreateFHIRConditionFn func(ctx context.Context, input domain.FHIRConditionInput) (*domain.FHIRConditionRelayPayload, error)
MockCreateFHIROrganizationFn func(ctx context.Context, input domain.FHIROrganizationInput) (*domain.FHIROrganizationRelayPayload, error)
Expand Down Expand Up @@ -69,23 +69,23 @@ type FHIRMock struct {

// NewFHIRMock initializes a new instance of FHIR mock
func NewFHIRMock() *FHIRMock {
UUID := uuid.New().String()
PatientRef := "Patient/1"
OrgRef := "Organization/1"
status := domain.EpisodeOfCareStatusEnumActive

return &FHIRMock{
MockCreateEpisodeOfCareFn: func(ctx context.Context, episode domain.FHIREpisodeOfCare) (*domain.EpisodeOfCarePayload, error) {
MockCreateEpisodeOfCareFn: func(ctx context.Context, episode domain.FHIREpisodeOfCareInput) (*domain.EpisodeOfCarePayload, error) {
UUID := uuid.New().String()
PatientRef := "Patient/1"
OrgRef := "Organization/1"
status := domain.EpisodeOfCareStatusEnumActive
return &domain.EpisodeOfCarePayload{
EpisodeOfCare: &domain.FHIREpisodeOfCare{
ID: &UUID,
Text: &domain.FHIRNarrative{},
Identifier: []*domain.FHIRIdentifier{},
Status: &(status),
Status: &status,
StatusHistory: []*domain.FHIREpisodeofcareStatushistory{},
Type: []*domain.FHIRCodeableConcept{},
Diagnosis: []*domain.FHIREpisodeofcareDiagnosis{},
Patient: &domain.FHIRReference{
ID: &UUID,
Reference: &PatientRef,
},
ManagingOrganization: &domain.FHIRReference{
Expand All @@ -101,6 +101,7 @@ func NewFHIRMock() *FHIRMock {
}, nil
},
MockCreateFHIRConditionFn: func(ctx context.Context, input domain.FHIRConditionInput) (*domain.FHIRConditionRelayPayload, error) {
UUID := uuid.New().String()
return &domain.FHIRConditionRelayPayload{
Resource: &domain.FHIRCondition{
ID: &UUID,
Expand Down Expand Up @@ -134,6 +135,7 @@ func NewFHIRMock() *FHIRMock {
}, nil
},
MockCreateFHIROrganizationFn: func(ctx context.Context, input domain.FHIROrganizationInput) (*domain.FHIROrganizationRelayPayload, error) {
UUID := uuid.New().String()
active := true
name := gofakeit.Name()
uri := ""
Expand Down Expand Up @@ -182,12 +184,14 @@ func NewFHIRMock() *FHIRMock {
return true, nil
},
MockOpenEpisodesFn: func(ctx context.Context, patientReference string) ([]*domain.FHIREpisodeOfCare, error) {
UUID := uuid.New().String()
PatientRef := "Patient/1"
OrgRef := "Organization/1"
return []*domain.FHIREpisodeOfCare{
{
ID: &UUID,
Text: &domain.FHIRNarrative{},
Identifier: []*domain.FHIRIdentifier{},
Status: &(status),
StatusHistory: []*domain.FHIREpisodeofcareStatushistory{},
Type: []*domain.FHIRCodeableConcept{},
Diagnosis: []*domain.FHIREpisodeofcareDiagnosis{},
Expand All @@ -209,12 +213,14 @@ func NewFHIRMock() *FHIRMock {
return &domain.FHIREncounterRelayPayload{}, nil
},
MockGetFHIREpisodeOfCareFn: func(ctx context.Context, id string) (*domain.FHIREpisodeOfCareRelayPayload, error) {
UUID := uuid.New().String()
PatientRef := "Patient/1"
OrgRef := "Organization/1"
return &domain.FHIREpisodeOfCareRelayPayload{
Resource: &domain.FHIREpisodeOfCare{
ID: &UUID,
Text: &domain.FHIRNarrative{},
Identifier: []*domain.FHIRIdentifier{},
Status: &(status),
StatusHistory: []*domain.FHIREpisodeofcareStatushistory{},
Type: []*domain.FHIRCodeableConcept{},
Diagnosis: []*domain.FHIREpisodeofcareDiagnosis{},
Expand All @@ -236,6 +242,8 @@ func NewFHIRMock() *FHIRMock {
return []*domain.FHIREncounter{}, nil
},
MockSearchFHIREpisodeOfCareFn: func(ctx context.Context, params map[string]interface{}) (*domain.FHIREpisodeOfCareRelayConnection, error) {
PatientRef := "Patient/1"
OrgRef := "Organization/1"
return &domain.FHIREpisodeOfCareRelayConnection{
Edges: []*domain.FHIREpisodeOfCareRelayEdge{
{
Expand Down Expand Up @@ -336,6 +344,7 @@ func NewFHIRMock() *FHIRMock {
return &domain.FHIRConditionRelayPayload{}, nil
},
MockGetFHIREncounterFn: func(ctx context.Context, id string) (*domain.FHIREncounterRelayPayload, error) {
UUID := uuid.New().String()
PatientRef := "Patient/" + uuid.NewString()
return &domain.FHIREncounterRelayPayload{
Resource: &domain.FHIREncounter{
Expand Down Expand Up @@ -548,7 +557,7 @@ func NewFHIRMock() *FHIRMock {
}

// CreateEpisodeOfCare is a mock implementation of CreateEpisodeOfCare method
func (fh *FHIRMock) CreateEpisodeOfCare(ctx context.Context, episode domain.FHIREpisodeOfCare) (*domain.EpisodeOfCarePayload, error) {
func (fh *FHIRMock) CreateEpisodeOfCare(ctx context.Context, episode domain.FHIREpisodeOfCareInput) (*domain.EpisodeOfCarePayload, error) {
return fh.MockCreateEpisodeOfCareFn(ctx, episode)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
extend type Query {
patientHealthTimeline(input: HealthTimelineInput!): HealthTimeline!
getMedicalData(patientID: String!): MedicalData

episodeOfCare(id: ID!): EpisodeOfCare
}

extend type Mutation {
createFHIROrganization(
input: FHIROrganizationInput!
): FHIROrganizationRelayPayload!
}

createEpisodeOfCare(episodeOfCare: EpisodeOfCareInput!): EpisodeOfCare
endEpisodeOfCare(id: ID!): EpisodeOfCare
}

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

6 changes: 6 additions & 0 deletions pkg/clinical/presentation/graph/enums.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
enum EpisodeOfCareStatusEnum {
planned
active
finished
cancelled
}
Loading

0 comments on commit 25c2d6a

Please sign in to comment.