Skip to content

Commit

Permalink
feat: condition pagination (#215)
Browse files Browse the repository at this point in the history
  • Loading branch information
Muchogoc committed Apr 3, 2023
1 parent 2841c4c commit 1720159
Show file tree
Hide file tree
Showing 23 changed files with 7,702 additions and 22,954 deletions.
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ require (
cloud.google.com/go/trace v1.8.0 // indirect
contrib.go.opencensus.io/exporter/stackdriver v0.13.11 // indirect
firebase.google.com/go v3.13.0+incompatible // indirect
github.com/766b/go-outliner v0.0.0-20180511142203-fc6edecdadd7 // indirect
github.com/agnivade/levenshtein v1.1.1 // indirect
github.com/aws/aws-sdk-go v1.44.208 // indirect
github.com/bytedance/sonic v1.8.3 // indirect
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,6 @@ contrib.go.opencensus.io/exporter/stackdriver v0.13.11/go.mod h1:I5htMbyta491eUx
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
firebase.google.com/go v3.13.0+incompatible h1:3TdYC3DDi6aHn20qoRkxwGqNgdjtblwVAyRLQwGn/+4=
firebase.google.com/go v3.13.0+incompatible/go.mod h1:xlah6XbEyW6tbfSklcfe5FHJIwjt8toICdV5Wh9ptHs=
github.com/766b/go-outliner v0.0.0-20180511142203-fc6edecdadd7 h1:cJXisB2yAM61AzMutv7X+KM8F3xVLxGH99S8VmaSlps=
github.com/766b/go-outliner v0.0.0-20180511142203-fc6edecdadd7/go.mod h1:1SzhThoS5lcKfE4IFOLQJ04WCmFpaAiPe8H9yqXyYSU=
github.com/99designs/gqlgen v0.13.0/go.mod h1:NV130r6f4tpRWuAI+zsrSdooO/eWUv+Gyyoi3rEfXIk=
github.com/99designs/gqlgen v0.17.26 h1:fxgSTbPf1G30uWAWSoHd+9gSNMagmP04k58ThJ1/ikQ=
github.com/99designs/gqlgen v0.17.26/go.mod h1:i4rEatMrzzu6RXaHydq1nmEPZkb3bKQsnxNRHS4DQB4=
Expand Down
53 changes: 53 additions & 0 deletions pkg/clinical/application/dto/condition_output.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package dto

import "github.com/savannahghi/scalarutils"

// Condition represents a FHIR condition
type Condition struct {
ID string `json:"id"`
Status ConditionStatus `json:"status"`
Name string `json:"condition"`
Code string `json:"code"`
System string `json:"system"`

OnsetDate scalarutils.Date `json:"onsetDate"`
RecordedDate scalarutils.Date `json:"recordedDate"`

Note string `json:"note"`

PatientID string `json:"patientID"`
EncounterID string `json:"encounterID"`
}

// ConditionEdge is a condition edge
type ConditionEdge struct {
Node Condition
Cursor string
}

// ConditionConnection is a Condition Connection Type
type ConditionConnection struct {
TotalCount int
Edges []ConditionEdge
PageInfo PageInfo
}

// CreateConditionConnection creates a connection that follows the GraphQl Cursor Connection Specification
func CreateConditionConnection(conditions []Condition, pageInfo PageInfo, total int) ConditionConnection {
connection := ConditionConnection{
TotalCount: total,
Edges: []ConditionEdge{},
PageInfo: pageInfo,
}

for _, condition := range conditions {
edge := ConditionEdge{
Node: condition,
Cursor: condition.ID,
}

connection.Edges = append(connection.Edges, edge)
}

return connection
}
17 changes: 0 additions & 17 deletions pkg/clinical/application/dto/output.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,23 +118,6 @@ type Patient struct {
BirthDate scalarutils.Date `json:"birthDate"`
}

// Condition represents a FHIR condition
type Condition struct {
ID string `json:"id"`
Status ConditionStatus `json:"status"`
Name string `json:"condition"`
Code string `json:"code"`
System string `json:"system"`

OnsetDate scalarutils.Date `json:"onsetDate"`
RecordedDate scalarutils.Date `json:"recordedDate"`

Note string `json:"note"`

PatientID string `json:"patientID"`
EncounterID string `json:"encounterID"`
}

// Terminology models the OCL terminology output
type Terminology struct {
Code string `json:"code"`
Expand Down
54 changes: 54 additions & 0 deletions pkg/clinical/application/dto/pagination.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package dto

import "fmt"

const defaultPageCount = 10

// PageInfo is used to add pagination information to Relay edges.
type PageInfo struct {
// Forward pagination
HasNextPage bool
EndCursor *string

// Backward pagination
HasPreviousPage bool
StartCursor *string
}

// Pagination represents paging parameters
type Pagination struct {
// Forward pagination arguments
First *int `json:"first"`
After string `json:"after"`

// Backward pagination arguments
Last *int `json:"last"`
Before string `json:"before"`
}

func (p *Pagination) Validate() error {
if p.First != nil && p.Last != nil {
return fmt.Errorf("cannot provide both first and last")
}

if p.First != nil {
first := *p.First
if first <= 0 {
return fmt.Errorf("first cannot be less than 0")
}
}

if p.Last != nil {
last := *p.Last
if last <= 0 {
return fmt.Errorf("last cannot be less than 0")
}
}

if p.First == nil && p.Last == nil {
limit := defaultPageCount
p.First = &limit
}

return nil
}
20 changes: 8 additions & 12 deletions pkg/clinical/domain/condition.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package domain

import (
"github.com/savannahghi/firebasetools"
"github.com/savannahghi/scalarutils"
)

Expand Down Expand Up @@ -236,17 +235,14 @@ type FHIRConditionStageInput struct {
Type *FHIRCodeableConceptInput `json:"type,omitempty"`
}

// FHIRConditionRelayConnection is a Relay connection for Condition
type FHIRConditionRelayConnection struct {
Edges []*FHIRConditionRelayEdge `json:"edges,omitempty"`
PageInfo *firebasetools.PageInfo `json:"pageInfo,omitempty"`
}

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

Node *FHIRCondition `json:"node,omitempty"`
// PagedFHIRCondition ...
type PagedFHIRCondition struct {
Conditions []FHIRCondition
HasNextPage bool
NextCursor string
HasPreviousPage bool
PreviousCursor string
TotalCount int
}

// FHIRConditionRelayPayload is used to return single instances of Condition
Expand Down
10 changes: 10 additions & 0 deletions pkg/clinical/domain/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -502,3 +502,13 @@ func MaritalStatusDisplay(val MaritalStatus) string {
return "unknown"
}
}

// PagedFHIRResource is a universal model for fetching FHIR resources with PageInfo details
type PagedFHIRResource struct {
Resources []map[string]interface{}
HasNextPage bool
NextCursor string
HasPreviousPage bool
PreviousCursor string
TotalCount int
}
Loading

0 comments on commit 1720159

Please sign in to comment.