From 1c0867dc0141c7d7a627badb1e6bd7eb17dd4d0a Mon Sep 17 00:00:00 2001 From: Salaton Date: Thu, 21 Nov 2024 17:47:53 +0300 Subject: [PATCH] feat: add more resources (#5) --- .golangci.yaml | 1 + consent.go | 44 ++ constants.go | 26 ++ encounter.go | 53 +++ episode_of_care.go | 44 ++ models/complex_types.go | 810 ------------------------------------- models/consent.go | 35 ++ models/encounter.go | 99 +++++ models/enums.go | 826 ++++++++++++++++++++++++++++++++++++++ models/episode_of_care.go | 54 +++ models/observation.go | 124 ++++++ models/organization.go | 16 + models/service_request.go | 185 +++++++++ models/task.go | 137 +++++++ observation.go | 44 ++ operations.go | 17 +- organization.go | 44 ++ patient.go | 6 +- service_request.go | 44 ++ task.go | 44 ++ 20 files changed, 1836 insertions(+), 817 deletions(-) create mode 100644 consent.go create mode 100644 constants.go create mode 100644 encounter.go create mode 100644 episode_of_care.go create mode 100644 models/consent.go create mode 100644 models/encounter.go create mode 100644 models/enums.go create mode 100644 models/episode_of_care.go create mode 100644 models/observation.go create mode 100644 models/organization.go create mode 100644 models/service_request.go create mode 100644 models/task.go create mode 100644 observation.go create mode 100644 organization.go create mode 100644 service_request.go create mode 100644 task.go diff --git a/.golangci.yaml b/.golangci.yaml index e705d04..ab16571 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -18,6 +18,7 @@ linters: # TODO: Restore this - unused - depguard + - dupl linters-settings: lll: diff --git a/consent.go b/consent.go new file mode 100644 index 0000000..71efc9a --- /dev/null +++ b/consent.go @@ -0,0 +1,44 @@ +package hapifhirgo + +import ( + "context" + "fmt" + + "github.com/savannahghi/hapi-fhir-go/models" +) + +func (c *Client) CreateFHIRConsent(ctx context.Context, input *models.FHIRConsent) (*models.FHIRConsent, error) { + payload, err := structToMap(input) + if err != nil { + return nil, fmt.Errorf("unable to turn %s input into a map: %w", consentResourceType, err) + } + + resource := &models.FHIRConsent{} + + err = c.createFHIRResource(ctx, consentResourceType, payload, resource) + if err != nil { + return nil, fmt.Errorf("unable to create %s resource: %w", consentResourceType, err) + } + + return resource, nil +} + +func (c *Client) GetFHIRConsent(ctx context.Context, id string) (*models.FHIRConsent, error) { + resource := &models.FHIRConsent{} + + err := c.getFHIRResource(ctx, consentResourceType, id, resource) + if err != nil { + return nil, fmt.Errorf("unable to get %s with ID %s, err: %w", consentResourceType, id, err) + } + + return resource, nil +} + +func (c *Client) SearchFHIRConsent(ctx context.Context, searchParams map[string]interface{}) (*models.Bundle, error) { + response, err := c.searchFHIRResource(ctx, consentResourceType, searchParams) + if err != nil { + return nil, err + } + + return response, nil +} diff --git a/constants.go b/constants.go new file mode 100644 index 0000000..bb35cf6 --- /dev/null +++ b/constants.go @@ -0,0 +1,26 @@ +package hapifhirgo + +const ( + organizationResource = "Organization" + patientResourceType = "Patient" + episodeOfCareResourceType = "EpisodeOfCare" + observationResourceType = "Observation" + allergyIntoleranceResourceType = "AllergyIntolerance" + serviceRequestResourceType = "ServiceRequest" + medicationRequestResourceType = "MedicationRequest" + conditionResourceType = "Condition" + encounterResourceType = "Encounter" + compositionResourceType = "Composition" + medicationStatementResourceType = "MedicationStatement" + medicationResourceType = "Medication" + mediaResourceType = "Media" + questionnaireResourceType = "Questionnaire" + consentResourceType = "Consent" + questionnaireResponseResourceType = "QuestionnaireResponse" + riskAssessmentResourceType = "RiskAssessment" + diagnosticReportResourceType = "DiagnosticReport" + subscriptionResourceType = "Subscription" + documentReferenceResourceType = "DocumentReference" + appointmentResourceType = "Appointment" + taskResourceType = "Task" +) diff --git a/encounter.go b/encounter.go new file mode 100644 index 0000000..c3bea73 --- /dev/null +++ b/encounter.go @@ -0,0 +1,53 @@ +package hapifhirgo + +import ( + "context" + "fmt" + + "github.com/savannahghi/hapi-fhir-go/models" +) + +func (c *Client) CreateFHIREncounter(ctx context.Context, input *models.FHIREncounter) (*models.FHIREncounter, error) { + payload, err := structToMap(input) + if err != nil { + return nil, fmt.Errorf("unable to turn %s input into a map: %w", encounterResourceType, err) + } + + resource := &models.FHIREncounter{} + + err = c.createFHIRResource(ctx, encounterResourceType, payload, resource) + if err != nil { + return nil, fmt.Errorf("unable to create %s resource: %w", encounterResourceType, err) + } + + return resource, nil +} + +func (c *Client) GetFHIREncounter(ctx context.Context, id string) (*models.FHIREncounter, error) { + resource := &models.FHIREncounter{} + + err := c.getFHIRResource(ctx, encounterResourceType, id, resource) + if err != nil { + return nil, fmt.Errorf("unable to get %s with ID %s, err: %w", encounterResourceType, id, err) + } + + return resource, nil +} + +func (c *Client) GetFHIREncounterAllData(ctx context.Context, id string, params map[string]interface{}) (*models.Bundle, error) { + response, err := c.getEncounterEverything(ctx, id, params) + if err != nil { + return nil, err + } + + return response, nil +} + +func (c *Client) SearchFHIREncounter(ctx context.Context, searchParams map[string]interface{}) (*models.Bundle, error) { + response, err := c.searchFHIRResource(ctx, encounterResourceType, searchParams) + if err != nil { + return nil, err + } + + return response, nil +} diff --git a/episode_of_care.go b/episode_of_care.go new file mode 100644 index 0000000..c3b0b6c --- /dev/null +++ b/episode_of_care.go @@ -0,0 +1,44 @@ +package hapifhirgo + +import ( + "context" + "fmt" + + "github.com/savannahghi/hapi-fhir-go/models" +) + +func (c *Client) CreateFHIREpisodeOfCare(ctx context.Context, input *models.FHIREpisodeOfCare) (*models.FHIREpisodeOfCare, error) { + payload, err := structToMap(input) + if err != nil { + return nil, fmt.Errorf("unable to turn %s input into a map: %w", episodeOfCareResourceType, err) + } + + resource := &models.FHIREpisodeOfCare{} + + err = c.createFHIRResource(ctx, episodeOfCareResourceType, payload, resource) + if err != nil { + return nil, fmt.Errorf("unable to create %s resource: %w", episodeOfCareResourceType, err) + } + + return resource, nil +} + +func (c *Client) GetFHIREpisodeOfCare(ctx context.Context, id string) (*models.FHIREpisodeOfCare, error) { + resource := &models.FHIREpisodeOfCare{} + + err := c.getFHIRResource(ctx, episodeOfCareResourceType, id, resource) + if err != nil { + return nil, fmt.Errorf("unable to get %s with ID %s, err: %w", episodeOfCareResourceType, id, err) + } + + return resource, nil +} + +func (c *Client) SearchFHIREpisodeOfCare(ctx context.Context, searchParams map[string]interface{}) (*models.Bundle, error) { + response, err := c.searchFHIRResource(ctx, episodeOfCareResourceType, searchParams) + if err != nil { + return nil, err + } + + return response, nil +} diff --git a/models/complex_types.go b/models/complex_types.go index 1b1f4f3..d32aeb0 100644 --- a/models/complex_types.go +++ b/models/complex_types.go @@ -1,10 +1,6 @@ package models import ( - "errors" - "fmt" - "io" - "strconv" "time" "github.com/savannahghi/scalarutils" @@ -300,55 +296,6 @@ type FHIRNarrative struct { Div scalarutils.XHTML `json:"div,omitempty"` } -// NarrativeStatusEnum is a FHIR enum. -type NarrativeStatusEnum string - -const ( - // NarrativeStatusEnumGenerated ... - NarrativeStatusEnumGenerated NarrativeStatusEnum = "generated" - // NarrativeStatusEnumExtensions ... - NarrativeStatusEnumExtensions NarrativeStatusEnum = "extensions" - // NarrativeStatusEnumAdditional ... - NarrativeStatusEnumAdditional NarrativeStatusEnum = "additional" - // NarrativeStatusEnumEmpty ... - NarrativeStatusEnumEmpty NarrativeStatusEnum = "empty" -) - -// IsValid ... -func (e NarrativeStatusEnum) IsValid() bool { - switch e { - case NarrativeStatusEnumGenerated, NarrativeStatusEnumExtensions, NarrativeStatusEnumAdditional, NarrativeStatusEnumEmpty: - return true - } - - return false -} - -// String ... -func (e NarrativeStatusEnum) String() string { - return string(e) -} - -// UnmarshalGQL ... -func (e NarrativeStatusEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = NarrativeStatusEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid NarrativeStatusEnum", str) - } - - return nil -} - -// MarshalGQL writes the given enum to the supplied writer as a quoted string. -func (e NarrativeStatusEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - // FHIRPeriod definition: a time period defined by a start and end date and // optionally time. type FHIRPeriod struct { @@ -414,604 +361,6 @@ type FHIRExpression struct { Reference *string `json:"reference,omitempty"` } -// AddressTypeEnum is a FHIR enum. -type AddressTypeEnum string - -const ( - // AddressTypeEnumPostal ... - AddressTypeEnumPostal AddressTypeEnum = "postal" - // AddressTypeEnumPhysical ... - AddressTypeEnumPhysical AddressTypeEnum = "physical" - // AddressTypeEnumBoth ... - AddressTypeEnumBoth AddressTypeEnum = "both" -) - -// IsValid ... -func (e AddressTypeEnum) IsValid() bool { - switch e { - case AddressTypeEnumPostal, AddressTypeEnumPhysical, AddressTypeEnumBoth: - return true - } - - return false -} - -// String ... -func (e AddressTypeEnum) String() string { - return string(e) -} - -// UnmarshalGQL ... -func (e AddressTypeEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = AddressTypeEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid AddressTypeEnum", str) - } - - return nil -} - -// MarshalGQL writes the address type enum to the supplied writer as a quoted -// string. -func (e AddressTypeEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -// AddressUseEnum is a FHIR enum. -type AddressUseEnum string - -const ( - // AddressUseEnumHome ... - AddressUseEnumHome AddressUseEnum = "home" - // AddressUseEnumWork ... - AddressUseEnumWork AddressUseEnum = "work" - // AddressUseEnumTemp ... - AddressUseEnumTemp AddressUseEnum = "temp" - // AddressUseEnumOld ... - AddressUseEnumOld AddressUseEnum = "old" - // AddressUseEnumBilling ... - AddressUseEnumBilling AddressUseEnum = "billing" -) - -// IsValid ... -func (e AddressUseEnum) IsValid() bool { - switch e { - case AddressUseEnumHome, AddressUseEnumWork, AddressUseEnumTemp, AddressUseEnumOld, AddressUseEnumBilling: - return true - } - - return false -} - -// String ... -func (e AddressUseEnum) String() string { - return string(e) -} - -// UnmarshalGQL ... -func (e AddressUseEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = AddressUseEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid AddressUseEnum", str) - } - - return nil -} - -// MarshalGQL writes the address use enum to the supplied writer as a quoted -// string. -func (e AddressUseEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -// AgeComparatorEnum is a FHIR enum. -type AgeComparatorEnum string - -const ( - // AgeComparatorEnumLessThan ... - AgeComparatorEnumLessThan AgeComparatorEnum = "less_than" - // AgeComparatorEnumLessThanOrEqualTo ... - AgeComparatorEnumLessThanOrEqualTo AgeComparatorEnum = "less_than_or_equal_to" - // AgeComparatorEnumGreaterThanOrEqualTo ... - AgeComparatorEnumGreaterThanOrEqualTo AgeComparatorEnum = "greater_than_or_equal_to" - // AgeComparatorEnumGreaterThan ... - AgeComparatorEnumGreaterThan AgeComparatorEnum = "greater_than" -) - -// IsValid ... -func (e AgeComparatorEnum) IsValid() bool { - switch e { - case AgeComparatorEnumLessThan, AgeComparatorEnumLessThanOrEqualTo, AgeComparatorEnumGreaterThanOrEqualTo, AgeComparatorEnumGreaterThan: - return true - } - - return false -} - -// String renders an age comparator enum as a string. -func (e AgeComparatorEnum) String() string { - switch e { - case AgeComparatorEnumLessThan: - return "<" - case AgeComparatorEnumLessThanOrEqualTo: - return "<=" - case AgeComparatorEnumGreaterThanOrEqualTo: - return ">=" - case AgeComparatorEnumGreaterThan: - return ">" - } - - return string(e) -} - -// UnmarshalGQL ... -func (e AgeComparatorEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = AgeComparatorEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid AgeComparatorEnum", str) - } - - return nil -} - -// MarshalGQL writes the age comparator to the supplied writer as a quoted -// string. -func (e AgeComparatorEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -// ContactPointSystemEnum is a FHIR enum. -type ContactPointSystemEnum string - -const ( - // ContactPointSystemEnumPhone ... - ContactPointSystemEnumPhone ContactPointSystemEnum = "phone" - // ContactPointSystemEnumFax ... - ContactPointSystemEnumFax ContactPointSystemEnum = "fax" - // ContactPointSystemEnumEmail ... - ContactPointSystemEnumEmail ContactPointSystemEnum = "email" - // ContactPointSystemEnumPager ... - ContactPointSystemEnumPager ContactPointSystemEnum = "pager" - // ContactPointSystemEnumURL ... - ContactPointSystemEnumURL ContactPointSystemEnum = "url" - // ContactPointSystemEnumSms ... - ContactPointSystemEnumSms ContactPointSystemEnum = "sms" - // ContactPointSystemEnumOther ... - ContactPointSystemEnumOther ContactPointSystemEnum = "other" -) - -// IsValid ... -func (e ContactPointSystemEnum) IsValid() bool { - switch e { - case ContactPointSystemEnumPhone, ContactPointSystemEnumFax, - ContactPointSystemEnumEmail, ContactPointSystemEnumPager, - ContactPointSystemEnumURL, ContactPointSystemEnumSms, ContactPointSystemEnumOther: - return true - } - - return false -} - -// String ... -func (e ContactPointSystemEnum) String() string { - return string(e) -} - -// UnmarshalGQL ... -func (e ContactPointSystemEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = ContactPointSystemEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid ContactPointSystemEnum", str) - } - - return nil -} - -// MarshalGQL writes the given enum to the supplied writer as a quoted string. -func (e ContactPointSystemEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -// ContactPointUseEnum is a FHIR enum. -type ContactPointUseEnum string - -const ( - // ContactPointUseEnumHome ... - ContactPointUseEnumHome ContactPointUseEnum = "home" - // ContactPointUseEnumWork ... - ContactPointUseEnumWork ContactPointUseEnum = "work" - // ContactPointUseEnumTemp ... - ContactPointUseEnumTemp ContactPointUseEnum = "temp" - // ContactPointUseEnumOld ... - ContactPointUseEnumOld ContactPointUseEnum = "old" - // ContactPointUseEnumMobile ... - ContactPointUseEnumMobile ContactPointUseEnum = "mobile" -) - -// IsValid ... -func (e ContactPointUseEnum) IsValid() bool { - switch e { - case ContactPointUseEnumHome, ContactPointUseEnumWork, - ContactPointUseEnumTemp, ContactPointUseEnumOld, ContactPointUseEnumMobile: - return true - } - - return false -} - -// String ... -func (e ContactPointUseEnum) String() string { - return string(e) -} - -// UnmarshalGQL ... -func (e ContactPointUseEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = ContactPointUseEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid ContactPointUseEnum", str) - } - - return nil -} - -// MarshalGQL writes the contact point use to the supplied writer as a quoted -// string. -func (e ContactPointUseEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -// DurationComparatorEnum is a FHIR enum. -type DurationComparatorEnum string - -const ( - // DurationComparatorEnumLessThan ... - DurationComparatorEnumLessThan DurationComparatorEnum = "less_than" - // DurationComparatorEnumLessThanOrEqualTo ... - DurationComparatorEnumLessThanOrEqualTo DurationComparatorEnum = "less_than_or_equal_to" - // DurationComparatorEnumGreaterThanOrEqualTo ... - DurationComparatorEnumGreaterThanOrEqualTo DurationComparatorEnum = "greater_than_or_equal_to" - // DurationComparatorEnumGreaterThan ... - DurationComparatorEnumGreaterThan DurationComparatorEnum = "greater_than" -) - -// IsValid ... -func (e DurationComparatorEnum) IsValid() bool { - switch e { - case DurationComparatorEnumLessThan, DurationComparatorEnumLessThanOrEqualTo, - DurationComparatorEnumGreaterThanOrEqualTo, DurationComparatorEnumGreaterThan: - return true - } - - return false -} - -// String ... -func (e DurationComparatorEnum) String() string { - switch e { - case DurationComparatorEnumLessThan: - return "<" - case DurationComparatorEnumLessThanOrEqualTo: - return "<=" - case DurationComparatorEnumGreaterThan: - return ">" - case DurationComparatorEnumGreaterThanOrEqualTo: - return ">=" - } - - return string(e) -} - -// UnmarshalGQL ... -func (e DurationComparatorEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = DurationComparatorEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid DurationComparatorEnum", str) - } - - return nil -} - -// MarshalGQL writes the duration comparator to the supplied writer as a -// quoted string. -func (e DurationComparatorEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -// HumanNameUseEnum is a FHIR enum. -type HumanNameUseEnum string - -const ( - // HumanNameUseEnumUsual ... - HumanNameUseEnumUsual HumanNameUseEnum = "usual" - // HumanNameUseEnumOfficial ... - HumanNameUseEnumOfficial HumanNameUseEnum = "official" - // HumanNameUseEnumTemp ... - HumanNameUseEnumTemp HumanNameUseEnum = "temp" - // HumanNameUseEnumNickname ... - HumanNameUseEnumNickname HumanNameUseEnum = "nickname" - // HumanNameUseEnumAnonymous ... - HumanNameUseEnumAnonymous HumanNameUseEnum = "anonymous" - // HumanNameUseEnumOld ... - HumanNameUseEnumOld HumanNameUseEnum = "old" - // HumanNameUseEnumMaiden ... - HumanNameUseEnumMaiden HumanNameUseEnum = "maiden" -) - -// IsValid ... -func (e HumanNameUseEnum) IsValid() bool { - switch e { - case HumanNameUseEnumUsual, HumanNameUseEnumOfficial, - HumanNameUseEnumTemp, HumanNameUseEnumNickname, HumanNameUseEnumAnonymous, - HumanNameUseEnumOld, HumanNameUseEnumMaiden: - return true - } - - return false -} - -// String ... -func (e HumanNameUseEnum) String() string { - return string(e) -} - -// UnmarshalGQL ... -func (e HumanNameUseEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = HumanNameUseEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid HumanNameUseEnum", str) - } - - return nil -} - -// MarshalGQL writes the given enum to the supplied writer as a quoted string. -func (e HumanNameUseEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -// IdentifierUseEnum is a FHIR enum. -type IdentifierUseEnum string - -const ( - // IdentifierUseEnumUsual ... - IdentifierUseEnumUsual IdentifierUseEnum = "usual" - // IdentifierUseEnumOfficial ... - IdentifierUseEnumOfficial IdentifierUseEnum = "official" - // IdentifierUseEnumTemp ... - IdentifierUseEnumTemp IdentifierUseEnum = "temp" - // IdentifierUseEnumSecondary ... - IdentifierUseEnumSecondary IdentifierUseEnum = "secondary" - // IdentifierUseEnumOld ... - IdentifierUseEnumOld IdentifierUseEnum = "old" -) - -// IsValid ... -func (e IdentifierUseEnum) IsValid() bool { - switch e { - case IdentifierUseEnumUsual, IdentifierUseEnumOfficial, IdentifierUseEnumTemp, - IdentifierUseEnumSecondary, IdentifierUseEnumOld: - return true - } - - return false -} - -// String ... -func (e IdentifierUseEnum) String() string { - return string(e) -} - -// UnmarshalGQL ... -func (e IdentifierUseEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = IdentifierUseEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid IdentifierUseEnum", str) - } - - return nil -} - -// MarshalGQL writes the identifier use to the supplied writer as a quoted -// string. -func (e IdentifierUseEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -// PatientGenderEnum is a FHIR enum. -type PatientGenderEnum string - -const ( - // PatientGenderEnumMale ... - PatientGenderEnumMale PatientGenderEnum = "male" - // PatientGenderEnumFemale ... - PatientGenderEnumFemale PatientGenderEnum = "female" - // PatientGenderEnumOther ... - PatientGenderEnumOther PatientGenderEnum = "other" - // PatientGenderEnumUnknown ... - PatientGenderEnumUnknown PatientGenderEnum = "unknown" -) - -// IsValid ... -func (e PatientGenderEnum) IsValid() bool { - switch e { - case PatientGenderEnumMale, PatientGenderEnumFemale, PatientGenderEnumOther, PatientGenderEnumUnknown: - return true - } - - return false -} - -// String ... -func (e PatientGenderEnum) String() string { - return string(e) -} - -// UnmarshalGQL ... -func (e PatientGenderEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = PatientGenderEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid PatientGenderEnum", str) - } - - return nil -} - -// MarshalGQL writes the patient gender to the supplied writer as a quoted -// string. -func (e PatientGenderEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -// PatientContactGenderEnum is a FHIR enum. -type PatientContactGenderEnum string - -const ( - // PatientContactGenderEnumMale ... - PatientContactGenderEnumMale PatientContactGenderEnum = "male" - // PatientContactGenderEnumFemale ... - PatientContactGenderEnumFemale PatientContactGenderEnum = "female" - // PatientContactGenderEnumOther ... - PatientContactGenderEnumOther PatientContactGenderEnum = "other" - // PatientContactGenderEnumUnknown ... - PatientContactGenderEnumUnknown PatientContactGenderEnum = "unknown" -) - -// IsValid ... -func (e PatientContactGenderEnum) IsValid() bool { - switch e { - case PatientContactGenderEnumMale, PatientContactGenderEnumFemale, - PatientContactGenderEnumOther, PatientContactGenderEnumUnknown: - return true - } - - return false -} - -// String ... -func (e PatientContactGenderEnum) String() string { - return string(e) -} - -// UnmarshalGQL ... -func (e PatientContactGenderEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = PatientContactGenderEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid Patient_ContactGenderEnum", str) - } - - return nil -} - -// MarshalGQL writes the patient contact gender to the supplied writer as a -// quoted string. -func (e PatientContactGenderEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -// PatientLinkTypeEnum is a FHIR enum. -type PatientLinkTypeEnum string - -const ( - // PatientLinkTypeEnumReplacedBy ... - PatientLinkTypeEnumReplacedBy PatientLinkTypeEnum = "replaced_by" - // PatientLinkTypeEnumReplaces ... - PatientLinkTypeEnumReplaces PatientLinkTypeEnum = "replaces" - // PatientLinkTypeEnumRefer ... - PatientLinkTypeEnumRefer PatientLinkTypeEnum = "refer" - // PatientLinkTypeEnumSeealso ... - PatientLinkTypeEnumSeealso PatientLinkTypeEnum = "seealso" -) - -// IsValid ... -func (e PatientLinkTypeEnum) IsValid() bool { - switch e { - case PatientLinkTypeEnumReplacedBy, PatientLinkTypeEnumReplaces, PatientLinkTypeEnumRefer, PatientLinkTypeEnumSeealso: - return true - } - - return false -} - -// String ... -func (e PatientLinkTypeEnum) String() string { - if e == PatientLinkTypeEnumReplacedBy { - return "replaced-by" - } - - return string(e) -} - -// UnmarshalGQL ... -func (e PatientLinkTypeEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = PatientLinkTypeEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid Patient_LinkTypeEnum", str) - } - - return nil -} - -// MarshalGQL writes the patient link type to the supplied writer as a quoted -// string. -func (e PatientLinkTypeEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - // FHIRMeta is a set of metadata that provides technical and workflow context // to a resource. type FHIRMeta struct { @@ -1049,67 +398,6 @@ type FHIRQuantity struct { Code *scalarutils.Code `json:"code"` } -// QuantityComparatorEnum is a FHIR enum. -type QuantityComparatorEnum string - -const ( - // QuantityComparatorEnumLessThan ... - QuantityComparatorEnumLessThan QuantityComparatorEnum = "less_than" - // QuantityComparatorEnumLessThanOrEqualTo ... - QuantityComparatorEnumLessThanOrEqualTo QuantityComparatorEnum = "less_than_or_equal_to" - // QuantityComparatorEnumGreaterThanOrEqualTo ... - QuantityComparatorEnumGreaterThanOrEqualTo QuantityComparatorEnum = "greater_than_or_equal_to" - // QuantityComparatorEnumGreaterThan ... - QuantityComparatorEnumGreaterThan QuantityComparatorEnum = "greater_than" -) - -// IsValid ... -func (e QuantityComparatorEnum) IsValid() bool { - switch e { - case QuantityComparatorEnumLessThan, QuantityComparatorEnumLessThanOrEqualTo, QuantityComparatorEnumGreaterThanOrEqualTo, - QuantityComparatorEnumGreaterThan: - return true - } - - return false -} - -// String ... -func (e QuantityComparatorEnum) String() string { - switch e { - case QuantityComparatorEnumLessThan: - return "<" - case QuantityComparatorEnumLessThanOrEqualTo: - return "<=" - case QuantityComparatorEnumGreaterThanOrEqualTo: - return ">=" - case QuantityComparatorEnumGreaterThan: - return ">" - default: - return string(e) - } -} - -// UnmarshalGQL ... -func (e QuantityComparatorEnum) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = QuantityComparatorEnum(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid QuantityComparatorEnum", str) - } - - return nil -} - -// MarshalGQL writes the quality comparator to the supplied writer as a quoted string. -func (e QuantityComparatorEnum) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - // FHIRRange definition: a set of ordered quantities defined by a low and high limit. type FHIRRange struct { // Unique id for the element within a resource (for internal references). This @@ -1178,101 +466,3 @@ type FHIRExtension struct { URL string `json:"url,omitempty"` Extension []Extension `json:"extension,omitempty"` } - -// BundleType is a FHIR enum. -type BundleType string - -const ( - BundleTypeDocument BundleType = "document" - BundleTypeMessage BundleType = "message" - BundleTypeTransaction BundleType = "transaction" - BundleTypeTransactionResponse BundleType = "transaction-response" - BundleTypeBatch BundleType = "batch" - BundleTypeBatchResponse BundleType = "batch-response" - BundleTypeHistory BundleType = "history" - BundleTypeSearchset BundleType = "searchset" - BundleTypeCollection BundleType = "collection" -) - -// IsValid ... -func (e BundleType) IsValid() bool { - switch e { - case BundleTypeDocument, BundleTypeMessage, BundleTypeTransaction, - BundleTypeTransactionResponse, BundleTypeBatch, BundleTypeBatchResponse, - BundleTypeHistory, BundleTypeSearchset, BundleTypeCollection: - return true - } - - return false -} - -// String ... -func (e BundleType) String() string { - return string(e) -} - -// UnmarshalGQL ... -func (e BundleType) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = BundleType(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid BundleType", str) - } - - return nil -} - -// MarshalGQL writes the bundle type to the supplied writer as a quoted -// string. -func (e BundleType) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} - -// SearchEntryMode is a FHIR enum. -type SearchEntryMode string - -const ( - SearchEntryModeMatch SearchEntryMode = "match" - SearchEntryModeInclude SearchEntryMode = "include" - SearchEntryModeOutcome SearchEntryMode = "outcome" -) - -// IsValid ... -func (e SearchEntryMode) IsValid() bool { - switch e { - case SearchEntryModeMatch, SearchEntryModeInclude, SearchEntryModeOutcome: - return true - } - - return false -} - -// String ... -func (e SearchEntryMode) String() string { - return string(e) -} - -// UnmarshalGQL ... -func (e SearchEntryMode) UnmarshalGQL(v interface{}) error { - str, ok := v.(string) - if !ok { - return errors.New("enums must be strings") - } - - e = SearchEntryMode(str) - if !e.IsValid() { - return fmt.Errorf("%s is not a valid SearchEntryMode", str) - } - - return nil -} - -// MarshalGQL writes the search entry mode to the supplied writer as a quoted -// string. -func (e SearchEntryMode) MarshalGQL(w io.Writer) { - fmt.Fprint(w, strconv.Quote(e.String())) -} diff --git a/models/consent.go b/models/consent.go new file mode 100644 index 0000000..1d32095 --- /dev/null +++ b/models/consent.go @@ -0,0 +1,35 @@ +package models + +import ( + "github.com/savannahghi/scalarutils" +) + +// Consent models a fhir consent resource. +type FHIRConsent struct { + ID *string `json:"id,omitempty"` + Status *ConsentStatusEnum `json:"status"` + Scope *FHIRCodeableConcept `json:"scope"` + Category []*FHIRCodeableConcept `json:"category"` + PolicyRule *FHIRCodeableConcept `json:"policyRule,omitempty"` + Provision *FHIRConsentProvision `json:"provision,omitempty"` + Patient *FHIRReference `json:"patient,omitempty"` + Meta *FHIRMeta `json:"meta,omitempty"` + Extension []Extension `json:"extension,omitempty"` + DateTime *scalarutils.DateTime `json:"dateTime,omitempty"` +} + +// FHIRConsentProvision models a fhir consent provision. +type FHIRConsentProvision struct { + ID *string `json:"id,omitempty"` + Type *ConsentProvisionTypeEnum `json:"type,omitempty"` + Data []FHIRConsentProvisionData `json:"data,omitempty"` +} + +// FHIRConsentProvisionData models a consent provision data. +type FHIRConsentProvisionData struct { + ID *string `json:"id,omitempty"` + Extension []Extension `json:"extension,omitempty"` + ModifierExtension []Extension `json:"modifierExtension,omitempty"` + Meaning ConsentDataMeaningEnum `json:"meaning,omitempty"` + Reference *FHIRReference `json:"reference,omitempty"` +} diff --git a/models/encounter.go b/models/encounter.go new file mode 100644 index 0000000..fcc8e5e --- /dev/null +++ b/models/encounter.go @@ -0,0 +1,99 @@ +package models + +import ( + "github.com/savannahghi/scalarutils" +) + +// FHIREncounter definition: an interaction between a patient and healthcare provider(s) for the purpose of providing healthcare service(s) +// or assessing the health status of a patient. +type FHIREncounter struct { + ID *string `json:"id,omitempty"` + Text *FHIRNarrative `json:"text,omitempty"` + Identifier []*FHIRIdentifier `json:"identifier,omitempty"` + Status EncounterStatus `json:"status,omitempty"` + StatusHistory []*FHIREncounterStatushistory `json:"statusHistory,omitempty"` + Class FHIRCoding `json:"class,omitempty"` + ClassHistory []*FHIREncounterClasshistory `json:"classHistory,omitempty"` + Type []*FHIRCodeableConcept `json:"type,omitempty"` + ServiceType *FHIRCodeableConcept `json:"serviceType,omitempty"` + Priority *FHIRCodeableConcept `json:"priority,omitempty"` + Subject *FHIRReference `json:"subject,omitempty"` + EpisodeOfCare []*FHIRReference `json:"episodeOfCare,omitempty"` + BasedOn []*FHIRReference `json:"basedOn,omitempty"` + Participant []*FHIREncounterParticipant `json:"participant,omitempty"` + Appointment []*FHIRReference `json:"appointment,omitempty"` + Period *FHIRPeriod `json:"period,omitempty"` + Length *FHIRDuration `json:"length,omitempty"` + ReasonCode *scalarutils.Code `json:"reasonCode,omitempty"` + ReasonReference []*FHIRReference `json:"reasonReference,omitempty"` + Diagnosis []*FHIREncounterDiagnosis `json:"diagnosis,omitempty"` + Account []*FHIRReference `json:"account,omitempty"` + Hospitalization *FHIREncounterHospitalization `json:"hospitalization,omitempty"` + Location []*FHIREncounterLocation `json:"location,omitempty"` + ServiceProvider *FHIRReference `json:"serviceProvider,omitempty"` + PartOf *FHIRReference `json:"partOf,omitempty"` + Meta *FHIRMeta `json:"meta,omitempty"` + Extension []*FHIRExtension `json:"extension,omitempty"` +} + +type FHIREncounterClasshistory struct { + ID *string `json:"id,omitempty"` + Class *FHIRCoding `json:"class,omitempty"` + Period *FHIRPeriod `json:"period,omitempty"` +} + +type FHIREncounterDiagnosis struct { + ID *string `json:"id,omitempty"` + Condition *FHIRReference `json:"condition,omitempty"` + Use *FHIRCodeableConcept `json:"use,omitempty"` + Rank *string `json:"rank,omitempty"` +} + +type FHIREncounterHospitalization struct { + ID *string `json:"id,omitempty"` + PreAdmissionIdentifier *FHIRIdentifier `json:"preAdmissionIdentifier,omitempty"` + Origin *FHIRReference `json:"origin,omitempty"` + AdmitSource *FHIRCodeableConcept `json:"admitSource,omitempty"` + ReAdmission *FHIRCodeableConcept `json:"reAdmission,omitempty"` + DietPreference []*FHIRCodeableConcept `json:"dietPreference,omitempty"` + SpecialCourtesy []*FHIRCodeableConcept `json:"specialCourtesy,omitempty"` + SpecialArrangement []*FHIRCodeableConcept `json:"specialArrangement,omitempty"` + Destination *FHIRReference `json:"destination,omitempty"` + DischargeDisposition *FHIRCodeableConcept `json:"dischargeDisposition,omitempty"` +} + +type FHIREncounterLocation struct { + ID *string `json:"id,omitempty"` + Location *FHIRReference `json:"location,omitempty"` + Status *EncounterLocationStatus `json:"status,omitempty"` + PhysicalType *FHIRCodeableConcept `json:"physicalType,omitempty"` + Period *FHIRPeriod `json:"period,omitempty"` +} + +type FHIREncounterParticipant struct { + ID *string `json:"id,omitempty"` + Type []*FHIRCodeableConcept `json:"type,omitempty"` + Period *FHIRPeriod `json:"period,omitempty"` + Individual *FHIRReference `json:"individual,omitempty"` +} + +type FHIREncounterStatushistory struct { + ID *string `json:"id,omitempty"` + Status *EncounterStatus `json:"status,omitempty"` + Period *FHIRPeriod `json:"period,omitempty"` +} + +// FHIREncounterRelayPayload is used to return single instances of Encounter. +type FHIREncounterRelayPayload struct { + Resource *FHIREncounter `json:"resource,omitempty"` +} + +// FHIRDuration definition: a length of time. +type FHIRDuration struct { + ID *string `json:"id,omitempty"` + Value *scalarutils.Decimal `json:"value,omitempty"` + Comparator *DurationComparatorEnum `json:"comparator,omitempty"` + Unit *string `json:"unit,omitempty"` + System *scalarutils.URI `json:"system,omitempty"` + Code *scalarutils.Code `json:"code,omitempty"` +} diff --git a/models/enums.go b/models/enums.go new file mode 100644 index 0000000..4bd73c4 --- /dev/null +++ b/models/enums.go @@ -0,0 +1,826 @@ +package models + +// BundleType is a FHIR enum. +type BundleType string + +const ( + BundleTypeDocument BundleType = "document" + BundleTypeMessage BundleType = "message" + BundleTypeTransaction BundleType = "transaction" + BundleTypeTransactionResponse BundleType = "transaction-response" + BundleTypeBatch BundleType = "batch" + BundleTypeBatchResponse BundleType = "batch-response" + BundleTypeHistory BundleType = "history" + BundleTypeSearchset BundleType = "searchset" + BundleTypeCollection BundleType = "collection" +) + +// IsValid ... +func (e BundleType) IsValid() bool { + switch e { + case BundleTypeDocument, BundleTypeMessage, BundleTypeTransaction, + BundleTypeTransactionResponse, BundleTypeBatch, BundleTypeBatchResponse, + BundleTypeHistory, BundleTypeSearchset, BundleTypeCollection: + return true + } + + return false +} + +// String ... +func (e BundleType) String() string { + return string(e) +} + +// SearchEntryMode is a FHIR enum. +type SearchEntryMode string + +const ( + SearchEntryModeMatch SearchEntryMode = "match" + SearchEntryModeInclude SearchEntryMode = "include" + SearchEntryModeOutcome SearchEntryMode = "outcome" +) + +// IsValid ... +func (e SearchEntryMode) IsValid() bool { + switch e { + case SearchEntryModeMatch, SearchEntryModeInclude, SearchEntryModeOutcome: + return true + } + + return false +} + +// String ... +func (e SearchEntryMode) String() string { + return string(e) +} + +// EpisodeOfCareStatus is a FHIR enum. +type EpisodeOfCareStatus string + +const ( + EpisodeOfCareStatusPlanned EpisodeOfCareStatus = "planned" + EpisodeOfCareStatusWaitlist EpisodeOfCareStatus = "waitlist" + EpisodeOfCareStatusActive EpisodeOfCareStatus = "active" + EpisodeOfCareStatusOnhold EpisodeOfCareStatus = "onhold" + EpisodeOfCareStatusFinished EpisodeOfCareStatus = "finished" + EpisodeOfCareStatusCancelled EpisodeOfCareStatus = "cancelled" + EpisodeOfCareStatusEnteredInError EpisodeOfCareStatus = "entered_in_error" +) + +// IsValid ... +func (e EpisodeOfCareStatus) IsValid() bool { + switch e { + case EpisodeOfCareStatusPlanned, EpisodeOfCareStatusWaitlist, EpisodeOfCareStatusActive, + EpisodeOfCareStatusOnhold, EpisodeOfCareStatusFinished, EpisodeOfCareStatusCancelled, EpisodeOfCareStatusEnteredInError: + return true + } + + return false +} + +// String ... +func (e EpisodeOfCareStatus) String() string { + return string(e) +} + +// EncounterStatus is a FHIR enum. +type EncounterStatus string + +const ( + EncounterStatusPlanned EncounterStatus = "planned" + EncounterStatusArrived EncounterStatus = "arrived" + EncounterStatusTriaged EncounterStatus = "triaged" + EncounterStatusInProgress EncounterStatus = "in_progress" + EncounterStatusOnleave EncounterStatus = "onleave" + EncounterStatusFinished EncounterStatus = "finished" + EncounterStatusCancelled EncounterStatus = "cancelled" + EncounterStatusEnteredInError EncounterStatus = "entered_in_error" + EncounterStatusUnknown EncounterStatus = "unknown" +) + +// IsValid ... +func (e EncounterStatus) IsValid() bool { + switch e { + case EncounterStatusPlanned, EncounterStatusArrived, EncounterStatusTriaged, + EncounterStatusInProgress, EncounterStatusOnleave, EncounterStatusFinished, + EncounterStatusCancelled, EncounterStatusEnteredInError, EncounterStatusUnknown: + return true + } + + return false +} + +// String ... +func (e EncounterStatus) String() string { + return string(e) +} + +// EncounterLocationStatus is a FHIR enum. +type EncounterLocationStatus string + +const ( + EncounterLocationStatusPlanned EncounterLocationStatus = "planned" + EncounterLocationStatusActive EncounterLocationStatus = "active" + EncounterLocationStatusReserved EncounterLocationStatus = "reserved" + EncounterLocationStatusCompleted EncounterLocationStatus = "completed" +) + +// IsValid ... +func (e EncounterLocationStatus) IsValid() bool { + switch e { + case EncounterLocationStatusPlanned, EncounterLocationStatusActive, + EncounterLocationStatusReserved, EncounterLocationStatusCompleted: + return true + } + + return false +} + +// String ... +func (e EncounterLocationStatus) String() string { + return string(e) +} + +// ObservationStatus is a FHIR enum. +type ObservationStatus string + +const ( + ObservationStatusRegistered ObservationStatus = "registered" + ObservationStatusPreliminary ObservationStatus = "preliminary" + ObservationStatusFinal ObservationStatus = "final" + ObservationStatusAmended ObservationStatus = "amended" + ObservationStatusCorrected ObservationStatus = "corrected" + ObservationStatusCancelled ObservationStatus = "cancelled" + ObservationStatusEnteredInError ObservationStatus = "entered_in_error" + ObservationStatusUnknown ObservationStatus = "unknown" +) + +// IsValid ... +func (e ObservationStatus) IsValid() bool { + switch e { + case ObservationStatusRegistered, ObservationStatusPreliminary, ObservationStatusFinal, + ObservationStatusAmended, ObservationStatusCorrected, ObservationStatusCancelled, + ObservationStatusEnteredInError, ObservationStatusUnknown: + return true + } + + return false +} + +// String ... +func (e ObservationStatus) String() string { + return string(e) +} + +// TimingRepeatWhenEnum is a FHIR enum. +type TimingRepeatWhenEnum string + +const ( + TimingRepeatWhenEnumMorn TimingRepeatWhenEnum = "MORN" + TimingRepeatWhenEnumMornEarly TimingRepeatWhenEnum = "MORN_early" + TimingRepeatWhenEnumMornLate TimingRepeatWhenEnum = "MORN_late" + TimingRepeatWhenEnumNoon TimingRepeatWhenEnum = "NOON" + TimingRepeatWhenEnumAft TimingRepeatWhenEnum = "AFT" + TimingRepeatWhenEnumAftEarly TimingRepeatWhenEnum = "AFT_early" + TimingRepeatWhenEnumAftLate TimingRepeatWhenEnum = "AFT_late" + TimingRepeatWhenEnumEve TimingRepeatWhenEnum = "EVE" + TimingRepeatWhenEnumEveEarly TimingRepeatWhenEnum = "EVE_early" + TimingRepeatWhenEnumEveLate TimingRepeatWhenEnum = "EVE_late" + TimingRepeatWhenEnumNight TimingRepeatWhenEnum = "NIGHT" + TimingRepeatWhenEnumPhs TimingRepeatWhenEnum = "PHS" + TimingRepeatWhenEnumHs TimingRepeatWhenEnum = "HS" + TimingRepeatWhenEnumWake TimingRepeatWhenEnum = "WAKE" + TimingRepeatWhenEnumC TimingRepeatWhenEnum = "C" + TimingRepeatWhenEnumCm TimingRepeatWhenEnum = "CM" + TimingRepeatWhenEnumCd TimingRepeatWhenEnum = "CD" + TimingRepeatWhenEnumCv TimingRepeatWhenEnum = "CV" + TimingRepeatWhenEnumAc TimingRepeatWhenEnum = "AC" + TimingRepeatWhenEnumAcm TimingRepeatWhenEnum = "ACM" + TimingRepeatWhenEnumAcd TimingRepeatWhenEnum = "ACD" + TimingRepeatWhenEnumAcv TimingRepeatWhenEnum = "ACV" + TimingRepeatWhenEnumPc TimingRepeatWhenEnum = "PC" + TimingRepeatWhenEnumPcm TimingRepeatWhenEnum = "PCM" + TimingRepeatWhenEnumPcd TimingRepeatWhenEnum = "PCD" + TimingRepeatWhenEnumPcv TimingRepeatWhenEnum = "PCV" +) + +// IsValid ... +func (e TimingRepeatWhenEnum) IsValid() bool { + switch e { + case TimingRepeatWhenEnumMorn, TimingRepeatWhenEnumMornEarly, TimingRepeatWhenEnumMornLate, + TimingRepeatWhenEnumNoon, TimingRepeatWhenEnumAft, TimingRepeatWhenEnumAftEarly, + TimingRepeatWhenEnumAftLate, TimingRepeatWhenEnumEve, TimingRepeatWhenEnumEveEarly, + TimingRepeatWhenEnumEveLate, TimingRepeatWhenEnumNight, TimingRepeatWhenEnumPhs, + TimingRepeatWhenEnumHs, TimingRepeatWhenEnumWake, TimingRepeatWhenEnumC, TimingRepeatWhenEnumCm, + TimingRepeatWhenEnumCd, TimingRepeatWhenEnumCv, TimingRepeatWhenEnumAc, TimingRepeatWhenEnumAcm, + TimingRepeatWhenEnumAcd, TimingRepeatWhenEnumAcv, TimingRepeatWhenEnumPc, TimingRepeatWhenEnumPcm, + TimingRepeatWhenEnumPcd, TimingRepeatWhenEnumPcv: + return true + } + + return false +} + +// String ... +func (e TimingRepeatWhenEnum) String() string { + return string(e) +} + +// UnitsOfTime is a FHIR enum. +type UnitsOfTime string + +const ( + UnitsOfTimeS UnitsOfTime = "s" + UnitsOfTimeMin UnitsOfTime = "min" + UnitsOfTimeH UnitsOfTime = "h" + UnitsOfTimeD UnitsOfTime = "d" + UnitsOfTimeWk UnitsOfTime = "wk" + UnitsOfTimeMo UnitsOfTime = "mo" + UnitsOfTimeA UnitsOfTime = "a" +) + +// IsValid ... +func (e UnitsOfTime) IsValid() bool { + switch e { + case UnitsOfTimeS, UnitsOfTimeMin, UnitsOfTimeH, UnitsOfTimeD, + UnitsOfTimeWk, UnitsOfTimeMo, UnitsOfTimeA: + return true + } + + return false +} + +// String ... +func (e UnitsOfTime) String() string { + return string(e) +} + +// QuantityComparatorEnum is a FHIR enum. +type QuantityComparatorEnum string + +const ( + // QuantityComparatorEnumLessThan ... + QuantityComparatorEnumLessThan QuantityComparatorEnum = "less_than" + // QuantityComparatorEnumLessThanOrEqualTo ... + QuantityComparatorEnumLessThanOrEqualTo QuantityComparatorEnum = "less_than_or_equal_to" + // QuantityComparatorEnumGreaterThanOrEqualTo ... + QuantityComparatorEnumGreaterThanOrEqualTo QuantityComparatorEnum = "greater_than_or_equal_to" + // QuantityComparatorEnumGreaterThan ... + QuantityComparatorEnumGreaterThan QuantityComparatorEnum = "greater_than" +) + +// IsValid ... +func (e QuantityComparatorEnum) IsValid() bool { + switch e { + case QuantityComparatorEnumLessThan, QuantityComparatorEnumLessThanOrEqualTo, QuantityComparatorEnumGreaterThanOrEqualTo, + QuantityComparatorEnumGreaterThan: + return true + } + + return false +} + +// String ... +func (e QuantityComparatorEnum) String() string { + switch e { + case QuantityComparatorEnumLessThan: + return "<" + case QuantityComparatorEnumLessThanOrEqualTo: + return "<=" + case QuantityComparatorEnumGreaterThanOrEqualTo: + return ">=" + case QuantityComparatorEnumGreaterThan: + return ">" + default: + return string(e) + } +} + +// AddressTypeEnum is a FHIR enum. +type AddressTypeEnum string + +const ( + // AddressTypeEnumPostal ... + AddressTypeEnumPostal AddressTypeEnum = "postal" + // AddressTypeEnumPhysical ... + AddressTypeEnumPhysical AddressTypeEnum = "physical" + // AddressTypeEnumBoth ... + AddressTypeEnumBoth AddressTypeEnum = "both" +) + +// IsValid ... +func (e AddressTypeEnum) IsValid() bool { + switch e { + case AddressTypeEnumPostal, AddressTypeEnumPhysical, AddressTypeEnumBoth: + return true + } + + return false +} + +// String ... +func (e AddressTypeEnum) String() string { + return string(e) +} + +// AddressUseEnum is a FHIR enum. +type AddressUseEnum string + +const ( + // AddressUseEnumHome ... + AddressUseEnumHome AddressUseEnum = "home" + // AddressUseEnumWork ... + AddressUseEnumWork AddressUseEnum = "work" + // AddressUseEnumTemp ... + AddressUseEnumTemp AddressUseEnum = "temp" + // AddressUseEnumOld ... + AddressUseEnumOld AddressUseEnum = "old" + // AddressUseEnumBilling ... + AddressUseEnumBilling AddressUseEnum = "billing" +) + +// IsValid ... +func (e AddressUseEnum) IsValid() bool { + switch e { + case AddressUseEnumHome, AddressUseEnumWork, AddressUseEnumTemp, AddressUseEnumOld, AddressUseEnumBilling: + return true + } + + return false +} + +// String ... +func (e AddressUseEnum) String() string { + return string(e) +} + +// AgeComparatorEnum is a FHIR enum. +type AgeComparatorEnum string + +const ( + // AgeComparatorEnumLessThan ... + AgeComparatorEnumLessThan AgeComparatorEnum = "less_than" + // AgeComparatorEnumLessThanOrEqualTo ... + AgeComparatorEnumLessThanOrEqualTo AgeComparatorEnum = "less_than_or_equal_to" + // AgeComparatorEnumGreaterThanOrEqualTo ... + AgeComparatorEnumGreaterThanOrEqualTo AgeComparatorEnum = "greater_than_or_equal_to" + // AgeComparatorEnumGreaterThan ... + AgeComparatorEnumGreaterThan AgeComparatorEnum = "greater_than" +) + +// IsValid ... +func (e AgeComparatorEnum) IsValid() bool { + switch e { + case AgeComparatorEnumLessThan, AgeComparatorEnumLessThanOrEqualTo, AgeComparatorEnumGreaterThanOrEqualTo, AgeComparatorEnumGreaterThan: + return true + } + + return false +} + +// String renders an age comparator enum as a string. +func (e AgeComparatorEnum) String() string { + switch e { + case AgeComparatorEnumLessThan: + return "<" + case AgeComparatorEnumLessThanOrEqualTo: + return "<=" + case AgeComparatorEnumGreaterThanOrEqualTo: + return ">=" + case AgeComparatorEnumGreaterThan: + return ">" + } + + return string(e) +} + +// ContactPointSystemEnum is a FHIR enum. +type ContactPointSystemEnum string + +const ( + // ContactPointSystemEnumPhone ... + ContactPointSystemEnumPhone ContactPointSystemEnum = "phone" + // ContactPointSystemEnumFax ... + ContactPointSystemEnumFax ContactPointSystemEnum = "fax" + // ContactPointSystemEnumEmail ... + ContactPointSystemEnumEmail ContactPointSystemEnum = "email" + // ContactPointSystemEnumPager ... + ContactPointSystemEnumPager ContactPointSystemEnum = "pager" + // ContactPointSystemEnumURL ... + ContactPointSystemEnumURL ContactPointSystemEnum = "url" + // ContactPointSystemEnumSms ... + ContactPointSystemEnumSms ContactPointSystemEnum = "sms" + // ContactPointSystemEnumOther ... + ContactPointSystemEnumOther ContactPointSystemEnum = "other" +) + +// IsValid ... +func (e ContactPointSystemEnum) IsValid() bool { + switch e { + case ContactPointSystemEnumPhone, ContactPointSystemEnumFax, + ContactPointSystemEnumEmail, ContactPointSystemEnumPager, + ContactPointSystemEnumURL, ContactPointSystemEnumSms, ContactPointSystemEnumOther: + return true + } + + return false +} + +// String ... +func (e ContactPointSystemEnum) String() string { + return string(e) +} + +// ContactPointUseEnum is a FHIR enum. +type ContactPointUseEnum string + +const ( + // ContactPointUseEnumHome ... + ContactPointUseEnumHome ContactPointUseEnum = "home" + // ContactPointUseEnumWork ... + ContactPointUseEnumWork ContactPointUseEnum = "work" + // ContactPointUseEnumTemp ... + ContactPointUseEnumTemp ContactPointUseEnum = "temp" + // ContactPointUseEnumOld ... + ContactPointUseEnumOld ContactPointUseEnum = "old" + // ContactPointUseEnumMobile ... + ContactPointUseEnumMobile ContactPointUseEnum = "mobile" +) + +// IsValid ... +func (e ContactPointUseEnum) IsValid() bool { + switch e { + case ContactPointUseEnumHome, ContactPointUseEnumWork, + ContactPointUseEnumTemp, ContactPointUseEnumOld, ContactPointUseEnumMobile: + return true + } + + return false +} + +// String ... +func (e ContactPointUseEnum) String() string { + return string(e) +} + +// DurationComparatorEnum is a FHIR enum. +type DurationComparatorEnum string + +const ( + // DurationComparatorEnumLessThan ... + DurationComparatorEnumLessThan DurationComparatorEnum = "less_than" + // DurationComparatorEnumLessThanOrEqualTo ... + DurationComparatorEnumLessThanOrEqualTo DurationComparatorEnum = "less_than_or_equal_to" + // DurationComparatorEnumGreaterThanOrEqualTo ... + DurationComparatorEnumGreaterThanOrEqualTo DurationComparatorEnum = "greater_than_or_equal_to" + // DurationComparatorEnumGreaterThan ... + DurationComparatorEnumGreaterThan DurationComparatorEnum = "greater_than" +) + +// IsValid ... +func (e DurationComparatorEnum) IsValid() bool { + switch e { + case DurationComparatorEnumLessThan, DurationComparatorEnumLessThanOrEqualTo, + DurationComparatorEnumGreaterThanOrEqualTo, DurationComparatorEnumGreaterThan: + return true + } + + return false +} + +// String ... +func (e DurationComparatorEnum) String() string { + switch e { + case DurationComparatorEnumLessThan: + return "<" + case DurationComparatorEnumLessThanOrEqualTo: + return "<=" + case DurationComparatorEnumGreaterThan: + return ">" + case DurationComparatorEnumGreaterThanOrEqualTo: + return ">=" + } + + return string(e) +} + +// HumanNameUseEnum is a FHIR enum. +type HumanNameUseEnum string + +const ( + // HumanNameUseEnumUsual ... + HumanNameUseEnumUsual HumanNameUseEnum = "usual" + // HumanNameUseEnumOfficial ... + HumanNameUseEnumOfficial HumanNameUseEnum = "official" + // HumanNameUseEnumTemp ... + HumanNameUseEnumTemp HumanNameUseEnum = "temp" + // HumanNameUseEnumNickname ... + HumanNameUseEnumNickname HumanNameUseEnum = "nickname" + // HumanNameUseEnumAnonymous ... + HumanNameUseEnumAnonymous HumanNameUseEnum = "anonymous" + // HumanNameUseEnumOld ... + HumanNameUseEnumOld HumanNameUseEnum = "old" + // HumanNameUseEnumMaiden ... + HumanNameUseEnumMaiden HumanNameUseEnum = "maiden" +) + +// IsValid ... +func (e HumanNameUseEnum) IsValid() bool { + switch e { + case HumanNameUseEnumUsual, HumanNameUseEnumOfficial, + HumanNameUseEnumTemp, HumanNameUseEnumNickname, HumanNameUseEnumAnonymous, + HumanNameUseEnumOld, HumanNameUseEnumMaiden: + return true + } + + return false +} + +// String ... +func (e HumanNameUseEnum) String() string { + return string(e) +} + +// IdentifierUseEnum is a FHIR enum. +type IdentifierUseEnum string + +const ( + // IdentifierUseEnumUsual ... + IdentifierUseEnumUsual IdentifierUseEnum = "usual" + // IdentifierUseEnumOfficial ... + IdentifierUseEnumOfficial IdentifierUseEnum = "official" + // IdentifierUseEnumTemp ... + IdentifierUseEnumTemp IdentifierUseEnum = "temp" + // IdentifierUseEnumSecondary ... + IdentifierUseEnumSecondary IdentifierUseEnum = "secondary" + // IdentifierUseEnumOld ... + IdentifierUseEnumOld IdentifierUseEnum = "old" +) + +// IsValid ... +func (e IdentifierUseEnum) IsValid() bool { + switch e { + case IdentifierUseEnumUsual, IdentifierUseEnumOfficial, IdentifierUseEnumTemp, + IdentifierUseEnumSecondary, IdentifierUseEnumOld: + return true + } + + return false +} + +// String ... +func (e IdentifierUseEnum) String() string { + return string(e) +} + +// PatientGenderEnum is a FHIR enum. +type PatientGenderEnum string + +const ( + // PatientGenderEnumMale ... + PatientGenderEnumMale PatientGenderEnum = "male" + // PatientGenderEnumFemale ... + PatientGenderEnumFemale PatientGenderEnum = "female" + // PatientGenderEnumOther ... + PatientGenderEnumOther PatientGenderEnum = "other" + // PatientGenderEnumUnknown ... + PatientGenderEnumUnknown PatientGenderEnum = "unknown" +) + +// IsValid ... +func (e PatientGenderEnum) IsValid() bool { + switch e { + case PatientGenderEnumMale, PatientGenderEnumFemale, PatientGenderEnumOther, PatientGenderEnumUnknown: + return true + } + + return false +} + +// String ... +func (e PatientGenderEnum) String() string { + return string(e) +} + +// PatientContactGenderEnum is a FHIR enum. +type PatientContactGenderEnum string + +const ( + // PatientContactGenderEnumMale ... + PatientContactGenderEnumMale PatientContactGenderEnum = "male" + // PatientContactGenderEnumFemale ... + PatientContactGenderEnumFemale PatientContactGenderEnum = "female" + // PatientContactGenderEnumOther ... + PatientContactGenderEnumOther PatientContactGenderEnum = "other" + // PatientContactGenderEnumUnknown ... + PatientContactGenderEnumUnknown PatientContactGenderEnum = "unknown" +) + +// IsValid ... +func (e PatientContactGenderEnum) IsValid() bool { + switch e { + case PatientContactGenderEnumMale, PatientContactGenderEnumFemale, + PatientContactGenderEnumOther, PatientContactGenderEnumUnknown: + return true + } + + return false +} + +// String ... +func (e PatientContactGenderEnum) String() string { + return string(e) +} + +// PatientLinkTypeEnum is a FHIR enum. +type PatientLinkTypeEnum string + +const ( + // PatientLinkTypeEnumReplacedBy ... + PatientLinkTypeEnumReplacedBy PatientLinkTypeEnum = "replaced_by" + // PatientLinkTypeEnumReplaces ... + PatientLinkTypeEnumReplaces PatientLinkTypeEnum = "replaces" + // PatientLinkTypeEnumRefer ... + PatientLinkTypeEnumRefer PatientLinkTypeEnum = "refer" + // PatientLinkTypeEnumSeealso ... + PatientLinkTypeEnumSeealso PatientLinkTypeEnum = "seealso" +) + +// IsValid ... +func (e PatientLinkTypeEnum) IsValid() bool { + switch e { + case PatientLinkTypeEnumReplacedBy, PatientLinkTypeEnumReplaces, PatientLinkTypeEnumRefer, PatientLinkTypeEnumSeealso: + return true + } + + return false +} + +// String ... +func (e PatientLinkTypeEnum) String() string { + return string(e) +} + +// NarrativeStatusEnum is a FHIR enum. +type NarrativeStatusEnum string + +const ( + // NarrativeStatusEnumGenerated ... + NarrativeStatusEnumGenerated NarrativeStatusEnum = "generated" + // NarrativeStatusEnumExtensions ... + NarrativeStatusEnumExtensions NarrativeStatusEnum = "extensions" + // NarrativeStatusEnumAdditional ... + NarrativeStatusEnumAdditional NarrativeStatusEnum = "additional" + // NarrativeStatusEnumEmpty ... + NarrativeStatusEnumEmpty NarrativeStatusEnum = "empty" +) + +// IsValid ... +func (e NarrativeStatusEnum) IsValid() bool { + switch e { + case NarrativeStatusEnumGenerated, NarrativeStatusEnumExtensions, NarrativeStatusEnumAdditional, NarrativeStatusEnumEmpty: + return true + } + + return false +} + +// String ... +func (e NarrativeStatusEnum) String() string { + return string(e) +} + +// ServiceRequestType is a custom categorization of service requests. +// +// Service requests are used to create referrals, lab orders etc. These enums are just +// helpful in differentiating. +type ServiceRequestType string + +const ( + ReferralServiceRequestType ServiceRequestType = "REFERRAL_SERVICE_REQUEST" + LabOrderServiceRequestType ServiceRequestType = "LAB_ORDER_SERVICE_REQUEST" +) + +// String converts the service request data meaning to string. +func (s ServiceRequestType) String() string { + switch s { + case ReferralServiceRequestType: + return "Patient Referral (Service Request)" + case LabOrderServiceRequestType: + return "Laboratory Order (Service Request)" + default: + return string(s) + } +} + +// ServiceRequestStatusEnum represents the possible statuses of a ServiceRequest. +type ServiceRequestStatusEnum string + +const ( + ServiceRequestStatusDraft ServiceRequestStatusEnum = "draft" + ServiceRequestStatusActive ServiceRequestStatusEnum = "active" + ServiceRequestStatusOnHold ServiceRequestStatusEnum = "on-hold" + ServiceRequestStatusRevoked ServiceRequestStatusEnum = "revoked" + ServiceRequestStatusCompleted ServiceRequestStatusEnum = "completed" + ServiceRequestStatusEnteredInError ServiceRequestStatusEnum = "entered-in-error" + ServiceRequestStatusUnknown ServiceRequestStatusEnum = "unknown" +) + +// ServiceRequestIntentEnum represents the possible intents of a ServiceRequest. +type ServiceRequestIntentEnum string + +const ( + ServiceRequestIntentProposal ServiceRequestIntentEnum = "proposal" + ServiceRequestIntentPlan ServiceRequestIntentEnum = "plan" + ServiceRequestIntentDirective ServiceRequestIntentEnum = "directive" + ServiceRequestIntentOrder ServiceRequestIntentEnum = "order" + ServiceRequestIntentOriginalOrder ServiceRequestIntentEnum = "original-order" + ServiceRequestIntentReflexOrder ServiceRequestIntentEnum = "reflex-order" + ServiceRequestIntentFillerOrder ServiceRequestIntentEnum = "filler-order" + ServiceRequestIntentInstanceOrder ServiceRequestIntentEnum = "instance-order" + ServiceRequestIntentOption ServiceRequestIntentEnum = "option" +) + +// ServiceRequestPriorityEnum represents the possible priorities of a ServiceRequest. +type ServiceRequestPriorityEnum string + +const ( + ServiceRequestPriorityRoutine ServiceRequestPriorityEnum = "routine" + ServiceRequestPriorityUrgent ServiceRequestPriorityEnum = "urgent" + ServiceRequestPriorityAsap ServiceRequestPriorityEnum = "asap" + ServiceRequestPriorityStat ServiceRequestPriorityEnum = "stat" +) + +// ConsentStatusEnum a type enum tha represents a Consent Status field of consent resource. +type ConsentStatusEnum string + +const ( + ConsentStatusActive ConsentStatusEnum = "active" + ConsentStatusInactive ConsentStatusEnum = "inactive" +) + +// IsValid ... +func (c ConsentStatusEnum) IsValid() bool { + switch c { + case ConsentStatusActive, ConsentStatusInactive: + return true + } + + return false +} + +// String converts status to string. +func (c ConsentStatusEnum) String() string { + return string(c) +} + +// ConsentProvisionTypeEnum a type enum tha represents a Consent Provision field of consent resource. +type ConsentProvisionTypeEnum string + +const ( + ConsentProvisionTypeDeny ConsentProvisionTypeEnum = "deny" + ConsentProvisionTypePermit ConsentProvisionTypeEnum = "permit" +) + +// IsValid ... +func (c ConsentProvisionTypeEnum) IsValid() bool { + switch c { + case ConsentProvisionTypeDeny, ConsentProvisionTypePermit: + return true + } + + return false +} + +// String converts consent provision type to string. +func (c ConsentProvisionTypeEnum) String() string { + return string(c) +} + +// ConsentDataMeaningEnum represents the meaning of consent data. +type ConsentDataMeaningEnum string + +const ( + ConsentDataMeaningInstance ConsentDataMeaningEnum = "instance" + ConsentDataMeaningRelated ConsentDataMeaningEnum = "related" + ConsentDataMeaningDependents ConsentDataMeaningEnum = "dependents" + ConsentDataMeaningAuthoredBy ConsentDataMeaningEnum = "authoredby" +) + +// IsValid checks if the consent data meaning is valid. +func (c ConsentDataMeaningEnum) IsValid() bool { + switch c { + case ConsentDataMeaningInstance, ConsentDataMeaningRelated, + ConsentDataMeaningDependents, ConsentDataMeaningAuthoredBy: + return true + } + + return false +} + +// String converts the consent data meaning to string. +func (c ConsentDataMeaningEnum) String() string { + return string(c) +} diff --git a/models/episode_of_care.go b/models/episode_of_care.go new file mode 100644 index 0000000..5729c17 --- /dev/null +++ b/models/episode_of_care.go @@ -0,0 +1,54 @@ +package models + +// FHIREpisodeOfCare definition: an association between a patient and an organization / healthcare provider(s) during which time encounters may occur. +// the managing organization assumes a level of responsibility for the patient during this time. +type FHIREpisodeOfCare struct { + ID *string `json:"id,omitempty"` + Text *FHIRNarrative `json:"text,omitempty"` + Identifier []*FHIRIdentifier `json:"identifier,omitempty"` + Status *EpisodeOfCareStatus `json:"status,omitempty"` + StatusHistory []*FHIREpisodeofcareStatushistory `json:"statusHistory,omitempty"` + Type []*FHIRCodeableConcept `json:"type,omitempty"` + Diagnosis []*FHIREpisodeofcareDiagnosis `json:"diagnosis,omitempty"` + Patient *FHIRReference `json:"patient,omitempty"` + ManagingOrganization *FHIRReference `json:"managingOrganization,omitempty"` + Period *FHIRPeriod `json:"period,omitempty"` + ReferralRequest []*FHIRReference `json:"referralRequest,omitempty"` + CareManager *FHIRReference `json:"careManager,omitempty"` + Team []*FHIRReference `json:"team,omitempty"` + Account []*FHIRReference `json:"account,omitempty"` + Meta *FHIRMeta `json:"meta,omitempty"` + Extension []*FHIRExtension `json:"extension,omitempty"` +} + +// FHIREpisodeOfCareRelayEdge is a Relay edge for EpisodeOfCare. +type FHIREpisodeOfCareRelayEdge struct { + Cursor *string `json:"cursor,omitempty"` + Node *FHIREpisodeOfCare `json:"node,omitempty"` +} + +// FHIREpisodeOfCareRelayPayload is used to return single instances of EpisodeOfCare. +type FHIREpisodeOfCareRelayPayload struct { + Resource *FHIREpisodeOfCare `json:"resource,omitempty"` +} + +// FHIREpisodeofcareDiagnosis definition: an association between a patient and an organization / healthcare provider(s) during which time encounters may occur. +type FHIREpisodeofcareDiagnosis struct { + ID *string `json:"id,omitempty"` + Condition *FHIRReference `json:"condition,omitempty"` + Role *FHIRCodeableConcept `json:"role,omitempty"` + Rank *string `json:"rank,omitempty"` +} + +// FHIREpisodeofcareStatushistory definition: an association between a patient and an organization / healthcare provider during which time encounters may occur. +type FHIREpisodeofcareStatushistory struct { + ID *string `json:"id,omitempty"` + Status *EpisodeOfCareStatus `json:"status,omitempty"` + Period *FHIRPeriod `json:"period,omitempty"` +} + +// EpisodeOfCarePayload is used to return the results after creation of +// episodes of care. +type EpisodeOfCarePayload struct { + EpisodeOfCare *FHIREpisodeOfCare `json:"episodeOfCare"` +} diff --git a/models/observation.go b/models/observation.go new file mode 100644 index 0000000..802b417 --- /dev/null +++ b/models/observation.go @@ -0,0 +1,124 @@ +package models + +import ( + "encoding/json" + "time" + + "github.com/savannahghi/scalarutils" +) + +type FHIRObservation struct { + ID *string `json:"id,omitempty"` + Text *FHIRNarrative `json:"text,omitempty"` + Identifier []*FHIRIdentifier `json:"identifier,omitempty"` + BasedOn []*FHIRReference `json:"basedOn,omitempty"` + PartOf []*FHIRReference `json:"partOf,omitempty"` + Status *ObservationStatus `json:"status,omitempty"` + Category []*FHIRCodeableConcept `json:"category,omitempty"` + Code *FHIRCodeableConcept `json:"code,omitempty"` + Subject *FHIRReference `json:"subject,omitempty"` + Focus []*FHIRReference `json:"focus,omitempty"` + Encounter *FHIRReference `json:"encounter,omitempty"` + EffectiveDateTime *scalarutils.Date `json:"effectiveDateTime,omitempty"` + EffectivePeriod *FHIRPeriod `json:"effectivePeriod,omitempty"` + EffectiveTiming *FHIRTiming `json:"effectiveTiming,omitempty"` + EffectiveInstant *scalarutils.Instant `json:"effectiveInstant,omitempty"` + Issued *scalarutils.Instant `json:"issued,omitempty"` + Performer []*FHIRReference `json:"performer,omitempty"` + ValueQuantity *FHIRQuantity `json:"valueQuantity,omitempty"` + ValueCodeableConcept *scalarutils.Code `json:"valueCodeableConcept,omitempty"` + ValueString *string `json:"valueString,omitempty"` + ValueBoolean *bool `json:"valueBoolean,omitempty"` + ValueInteger *string `json:"valueInteger,omitempty"` + ValueRange *FHIRRange `json:"valueRange,omitempty"` + ValueRatio *FHIRRatio `json:"valueRatio,omitempty"` + ValueSampledData *FHIRSampledData `json:"valueSampledData,omitempty"` + ValueTime *time.Time `json:"valueTime,omitempty"` + ValueDateTime *scalarutils.Date `json:"valueDateTime,omitempty"` + ValuePeriod *FHIRPeriod `json:"valuePeriod,omitempty"` + DataAbsentReason *FHIRCodeableConcept `json:"dataAbsentReason,omitempty"` + Interpretation []*FHIRCodeableConcept `json:"interpretation,omitempty"` + Note []*FHIRAnnotation `json:"note,omitempty"` + BodySite *FHIRCodeableConcept `json:"bodySite,omitempty"` + Method *FHIRCodeableConcept `json:"method,omitempty"` + Specimen *FHIRReference `json:"specimen,omitempty"` + Device *FHIRReference `json:"device,omitempty"` + ReferenceRange []*FHIRObservationReferencerange `json:"referenceRange,omitempty"` + HasMember []*FHIRReference `json:"hasMember,omitempty"` + DerivedFrom []*FHIRReference `json:"derivedFrom,omitempty"` + Component []*FHIRObservationComponent `json:"component,omitempty"` + Meta *FHIRMeta `json:"meta,omitempty"` + Extension []*FHIRExtension `json:"extension,omitempty"` +} + +type FHIRObservationComponent struct { + ID *string `json:"id,omitempty"` + Code FHIRCodeableConcept `json:"code,omitempty"` + ValueQuantity *FHIRQuantity `json:"valueQuantity,omitempty"` + ValueCodeableConcept *scalarutils.Code `json:"valueCodeableConcept,omitempty"` + ValueString *string `json:"valueString,omitempty"` + ValueBoolean *bool `json:"valueBoolean,omitempty"` + ValueInteger *string `json:"valueInteger,omitempty"` + ValueRange *FHIRRange `json:"valueRange,omitempty"` + ValueRatio *FHIRRatio `json:"valueRatio,omitempty"` + ValueSampledData *FHIRSampledData `json:"valueSampledData,omitempty"` + ValueTime *time.Time `json:"valueTime,omitempty"` + ValueDateTime *scalarutils.Date `json:"valueDateTime,omitempty"` + ValuePeriod *FHIRPeriod `json:"valuePeriod,omitempty"` + DataAbsentReason *FHIRCodeableConcept `json:"dataAbsentReason,omitempty"` + Interpretation []*FHIRCodeableConcept `json:"interpretation,omitempty"` + ReferenceRange []*FHIRObservationReferencerange `json:"referenceRange,omitempty"` +} + +type FHIRObservationReferencerange struct { + ID *string `json:"id,omitempty"` + Low *FHIRQuantity `json:"low,omitempty"` + High *FHIRQuantity `json:"high,omitempty"` + Type *FHIRCodeableConcept `json:"type,omitempty"` + AppliesTo []*FHIRCodeableConcept `json:"appliesTo,omitempty"` + Age *FHIRRange `json:"age,omitempty"` + Text *string `json:"text,omitempty"` +} + +type FHIRObservationRelayPayload struct { + Resource *FHIRObservation `json:"resource,omitempty"` +} + +type FHIRSampledData struct { + ID *string `json:"id,omitempty"` + Origin *FHIRQuantity `json:"origin,omitempty"` + Period *scalarutils.Decimal `json:"period,omitempty"` + Factor *scalarutils.Decimal `json:"factor,omitempty"` + LowerLimit *scalarutils.Decimal `json:"lowerLimit,omitempty"` + UpperLimit *scalarutils.Decimal `json:"upperLimit,omitempty"` + Dimensions *string `json:"dimensions,omitempty"` + Data *string `json:"data,omitempty"` +} + +type FHIRTiming struct { + ID *string `json:"id,omitempty"` + Event []*scalarutils.DateTime `json:"event,omitempty"` + Repeat *FHIRTimingRepeat `json:"repeat,omitempty"` + Code scalarutils.Code `json:"code,omitempty"` +} + +type FHIRTimingRepeat struct { + ID *string `json:"id,omitempty"` + BoundsDuration *FHIRDuration `json:"boundsDuration,omitempty"` + BoundsRange *FHIRRange `json:"boundsRange,omitempty"` + BoundsPeriod *FHIRPeriod `json:"boundsPeriod,omitempty"` + Count *string `json:"count,omitempty"` + CountMax *string `json:"countMax,omitempty"` + Duration *json.Number `json:"duration,omitempty"` + DurationMax *scalarutils.Decimal `json:"durationMax,omitempty"` + DurationUnit *UnitsOfTime `json:"durationUnit,omitempty"` + Frequency *int `json:"frequency,omitempty"` + FrequencyMax *string `json:"frequencyMax,omitempty"` + Period *json.Number `json:"period,omitempty"` + PeriodMax *scalarutils.Decimal `json:"periodMax,omitempty"` + PeriodUnit *UnitsOfTime `json:"periodUnit,omitempty"` + DayOfWeek []*scalarutils.Code `json:"dayOfWeek,omitempty"` + TimeOfDay *time.Time `json:"timeOfDay,omitempty"` + When *TimingRepeatWhenEnum `json:"when,omitempty"` + Offset *int `json:"offset,omitempty"` +} diff --git a/models/organization.go b/models/organization.go new file mode 100644 index 0000000..7a42f8b --- /dev/null +++ b/models/organization.go @@ -0,0 +1,16 @@ +package models + +type FHIROrganization struct { + ID *string `json:"id,omitempty"` + Active *bool `json:"active,omitempty"` + Identifier []*FHIRIdentifier `json:"identifier,omitempty"` + Type []*FHIRCodeableConcept `json:"type,omitempty"` + Name *string `json:"name,omitempty"` + Alias []string `json:"alias,omitempty"` + Telecom []*FHIRContactPoint `json:"telecom,omitempty"` + Address []*FHIRAddress `json:"address,omitempty"` +} + +type FHIROrganizationRelayPayload struct { + Resource *FHIROrganization `json:"resource,omitempty"` +} diff --git a/models/service_request.go b/models/service_request.go new file mode 100644 index 0000000..0074885 --- /dev/null +++ b/models/service_request.go @@ -0,0 +1,185 @@ +package models + +import ( + "errors" + "strings" + + "github.com/savannahghi/scalarutils" +) + +type FHIRServiceRequest struct { + ID *string `json:"id,omitempty"` + Text *FHIRNarrative `json:"text,omitempty"` + Identifier []*FHIRIdentifier `json:"identifier,omitempty"` + InstantiatesCanonical *scalarutils.Canonical `json:"instantiatesCanonical,omitempty"` + InstantiatesURI *scalarutils.Instant `json:"instantiatesURI,omitempty"` + BasedOn []*FHIRReference `json:"basedOn,omitempty"` + Replaces []*FHIRReference `json:"replaces,omitempty"` + Requisition *FHIRIdentifier `json:"requisition,omitempty"` + Status ServiceRequestStatusEnum `json:"status,omitempty"` + Intent ServiceRequestIntentEnum `json:"intent,omitempty"` + Category []*FHIRCodeableConcept `json:"category,omitempty"` + Priority ServiceRequestPriorityEnum `json:"priority,omitempty"` + DoNotPerform *bool `json:"doNotPerform,omitempty"` + Code *FHIRCodeableConcept `json:"code,omitempty"` + OrderDetail []*FHIRCodeableConcept `json:"orderDetail,omitempty"` + QuantityQuantity *FHIRQuantity `json:"quantityQuantity,omitempty"` + QuantityRatio *FHIRRatio `json:"quantityRatio,omitempty"` + QuantityRange *FHIRRange `json:"quantityRange,omitempty"` + Subject *FHIRReference `json:"subject,omitempty"` + Encounter *FHIRReference `json:"encounter,omitempty"` + OccurrenceDateTime *scalarutils.Date `json:"occurrenceDateTime,omitempty"` + OccurrencePeriod *FHIRPeriod `json:"occurrencePeriod,omitempty"` + OccurrenceTiming *FHIRTiming `json:"occurrenceTiming,omitempty"` + AsNeededBoolean *bool `json:"asNeededBoolean,omitempty"` + AsNeededCodeableConcept *scalarutils.Code `json:"asNeededCodeableConcept,omitempty"` + AuthoredOn *scalarutils.DateTime `json:"authoredOn,omitempty"` + Requester *FHIRReference `json:"requester,omitempty"` + PerformerType *FHIRCodeableConcept `json:"performerType,omitempty"` + Performer []*FHIRReference `json:"performer,omitempty"` + LocationCode *scalarutils.Code `json:"locationCode,omitempty"` + LocationReference []*FHIRReference `json:"locationReference,omitempty"` + ReasonCode *scalarutils.Code `json:"reasonCode,omitempty"` + ReasonReference []*FHIRReference `json:"reasonReference,omitempty"` + Insurance []*FHIRReference `json:"insurance,omitempty"` + SupportingInfo []*FHIRReference `json:"supportingInfo,omitempty"` + Specimen []*FHIRReference `json:"specimen,omitempty"` + BodySite []*FHIRCodeableConcept `json:"bodySite,omitempty"` + Note []*FHIRAnnotation `json:"note,omitempty"` + PatientInstruction *string `json:"patientInstruction,omitempty"` + RelevantHistory []*FHIRReference `json:"relevantHistory,omitempty"` + Meta *FHIRMeta `json:"meta,omitempty"` + Extension []*FHIRExtension `json:"extension,omitempty"` +} + +// FHIRServiceRequestRelayPayload is used to return single instances of ServiceRequest. +type FHIRServiceRequestRelayPayload struct { + Resource *FHIRServiceRequest `json:"resource,omitempty"` +} + +// ReceivingFacility is the facility that is accepting the patient into its care. +type ReceivingFacility struct { + FacilityName string `json:"facilityName,omitempty"` + FacilityCounty string `json:"facilityCounty,omitempty"` + FacilityContact string `json:"facilityContact,omitempty"` + FacilityEmail string `json:"facilityEmail,omitempty"` +} + +// GetReceivingFacilityDetails is used to fetch the details of the receiving facility. +func (f *FHIRServiceRequest) GetReceivingFacilityDetails() (*ReceivingFacility, error) { + if f.Extension == nil { + return nil, errors.New("extension details is nil") + } + + receivingFacility := &ReceivingFacility{} + + for _, extension := range f.Extension { + if extension.URL == "http://savannahghi.org/fhir/StructureDefinition/referred-facility" { + for _, ext := range extension.Extension { + if ext.URL == "facilityName" { + receivingFacility.FacilityName = ext.ValueString + } + + if ext.URL == "facilityCounty" { + receivingFacility.FacilityCounty = ext.ValueString + } + + if ext.URL == "facilityContact" { + receivingFacility.FacilityContact = ext.ValueString + } + + if ext.URL == "facilityEmail" { + receivingFacility.FacilityEmail = ext.ValueString + } + } + } + } + + return receivingFacility, nil +} + +// GetSubject returns the patient details. +func (f *FHIRServiceRequest) GetSubject() *FHIRReference { + return f.Subject +} + +func (f *FHIRServiceRequest) GetFacilityFromMeta() *FHIRMeta { + return f.Meta +} + +// GetFacilityName is used to get the name of the facility. +func (f *FHIRServiceRequest) GetFacilityName() string { + facilitySystem := scalarutils.URI("http://mycarehub/tenant-identification/facility") + + if f.Meta.Tag != nil { + for _, meta := range f.Meta.Tag { + if string(*meta.System) == string(facilitySystem) { + return meta.Display + } + } + } + + return "" +} + +// GetPatientReferralReason fetches the reason why a patient has been referred from a FHIR service request. +// It specifically looks for the code matching the common.ReferralReasonCIELCode in the service request's coding. +// If a matching code is found, the display name of that code is returned as the name of the referred test. +// It defaults to "test" if a test name is not found. +func (f *FHIRServiceRequest) GetPatientReferralReason() string { + referralReasonCIELCode := "159623" + + if f.Code != nil && len(f.Code.Coding) > 0 { + for _, coding := range f.Code.Coding { + if coding.Code != nil && *coding.Code == scalarutils.Code(referralReasonCIELCode) && coding.Display != "" { + return coding.Display + } + } + } + + return "test" +} + +// GetPatientReferralTest returns the test that the patient has been referred for. +func (f *FHIRServiceRequest) GetPatientReferralTest() string { + if f.Code != nil && len(f.Code.Coding) > 0 { + for _, coding := range f.Code.Coding { + if coding.Code != nil && *coding.Code == scalarutils.Code("TEST") && coding.Display != "" { + return coding.Display + } + } + } + + return "" +} + +// GetRequestedServices retrieves What is being requested/ordered, in this case, it could be the tests that the patient +// has been referred for. +func (f *FHIRServiceRequest) GetRequestedServices(serviceCIELCode string) []string { + var services []string + + for _, coding := range f.Code.Coding { + if coding.Code != nil && *coding.Code == scalarutils.Code(serviceCIELCode) { + services = append(services, coding.Display) + } + } + + return services +} + +// GetPractitionersNotes returns all practitioner's notes from the FHIR service request concatenated with a newline separator. +func (f *FHIRServiceRequest) GetPractitionersNotes() string { + if len(f.Note) == 0 { + return "" + } + + var notes []string + + for _, note := range f.Note { + if note.Text != nil { + notes = append(notes, string(*note.Text)) + } + } + + return strings.Join(notes, "\n") +} diff --git a/models/task.go b/models/task.go new file mode 100644 index 0000000..36dee92 --- /dev/null +++ b/models/task.go @@ -0,0 +1,137 @@ +package models + +import ( + "encoding/json" + "errors" + + "github.com/savannahghi/scalarutils" +) + +// FHIRTask is a FHIR task resource data class. +type FHIRTask struct { + ID *string `json:"id,omitempty"` + Meta *FHIRMeta `json:"meta,omitempty"` + ImplicitRules *string `json:"implicitRules,omitempty"` + Language *string `json:"language,omitempty"` + Text *FHIRNarrative `json:"text,omitempty"` + Extension []*FHIRExtension `json:"extension,omitempty"` + ModifierExtension []*FHIRExtension `json:"modifierExtension,omitempty"` + Identifier []*FHIRIdentifier `json:"identifier,omitempty"` + InstantiatesCanonical *scalarutils.Canonical `json:"instantiatesCanonical,omitempty"` + InstantiatesURI *scalarutils.URI `json:"instantiatesUri,omitempty"` + BasedOn []*FHIRReference `json:"basedOn,omitempty"` + GroupIdentifier *FHIRIdentifier `json:"groupIdentifier,omitempty"` + PartOf []*FHIRReference `json:"partOf,omitempty"` + Status *scalarutils.Code `json:"status"` + StatusReason *FHIRCodeableConcept `json:"statusReason,omitempty"` + BusinessStatus *FHIRCodeableConcept `json:"businessStatus,omitempty"` + Intent string `json:"intent"` + Priority *scalarutils.Code `json:"priority,omitempty"` + Code *FHIRCodeableConcept `json:"code,omitempty"` + Description string `json:"description,omitempty"` + Focus *FHIRReference `json:"focus,omitempty"` + For *FHIRReference `json:"for,omitempty"` + Encounter *FHIRReference `json:"encounter,omitempty"` + ExecutionPeriod *FHIRPeriod `json:"executionPeriod,omitempty"` + AuthoredOn *string `json:"authoredOn,omitempty"` + LastModified *string `json:"lastModified,omitempty"` + Requester *FHIRReference `json:"requester,omitempty"` + PerformerType []*FHIRCodeableConcept `json:"performerType,omitempty"` + Owner *FHIRReference `json:"owner,omitempty"` + Location *FHIRReference `json:"location,omitempty"` + ReasonCode *FHIRCodeableConcept `json:"reasonCode,omitempty"` + ReasonReference *FHIRReference `json:"reasonReference,omitempty"` + Insurance []*FHIRReference `json:"insurance,omitempty"` + Note []*FHIRAnnotation `json:"note,omitempty"` + RelevantHistory []*FHIRReference `json:"relevantHistory,omitempty"` + Restriction *TaskRestriction `json:"restriction,omitempty"` + Input []TaskInput `json:"input,omitempty"` + Output []TaskOutput `json:"output,omitempty"` +} + +// GetServiceRequestIDFromTask is used to extract the referral (service request) ID from a task. +func (t *FHIRTask) GetServiceRequestIDFromTask() (string, error) { + if t == nil { + return "", errors.New("task is nil") + } + + var referralID string + + for _, serviceRequest := range t.BasedOn { + if serviceRequest.Type != nil && string(*serviceRequest.Type) == ReferralServiceRequestType.String() { + referralID = "ServiceRequest/" + *serviceRequest.ID + + break + } + } + + return referralID, nil +} + +// TaskRestriction models the constraints on fulfillment tasks. +type TaskRestriction struct { + ID *string `json:"id,omitempty"` + Extension []*FHIRExtension `json:"extension,omitempty"` + ModifierExtension []*FHIRExtension `json:"modifierExtension,omitempty"` + Repetitions *int `json:"repetitions,omitempty"` + Period *FHIRPeriod `json:"period,omitempty"` + Recipient []*FHIRReference `json:"recipient,omitempty"` +} + +// TaskInput models the information needed to perform a task. +type TaskInput struct { + ID *string `json:"id,omitempty"` + Extension []*FHIRExtension `json:"extension,omitempty"` + ModifierExtension []*FHIRExtension `json:"modifierExtension,omitempty"` + Type *FHIRCodeableConcept `json:"type"` + ValueBase64Binary string `json:"valueBase64Binary"` + ValueBoolean bool `json:"valueBoolean"` + ValueCanonical string `json:"valueCanonical"` + ValueCode string `json:"valueCode"` + ValueDate string `json:"valueDate"` + ValueDateTime string `json:"valueDateTime"` + ValueDecimal json.Number `json:"valueDecimal"` + ValueID string `json:"valueId"` + ValueInstant string `json:"valueInstant"` + ValueInteger int `json:"valueInteger"` + ValueMarkdown string `json:"valueMarkdown"` + ValueOID string `json:"valueOid"` + ValuePositiveInt int `json:"valuePositiveInt"` + ValueString string `json:"valueString"` + ValueTime string `json:"valueTime"` + ValueUnsignedInt int `json:"valueUnsignedInt"` + ValueURI string `json:"valueUri"` + ValueURL string `json:"valueUrl"` +} + +// TaskOutput models the information produced as part of task. +type TaskOutput struct { + ID *string `json:"id,omitempty"` + Extension []*FHIRExtension `json:"extension,omitempty"` + ModifierExtension []*FHIRExtension `json:"modifierExtension,omitempty"` + Type *FHIRCodeableConcept `json:"type"` + ValueBase64Binary string `json:"valueBase64Binary"` + ValueBoolean bool `json:"valueBoolean"` + ValueCanonical string `json:"valueCanonical"` + ValueCode string `json:"valueCode"` + ValueDate string `json:"valueDate"` + ValueDateTime string `json:"valueDateTime"` + ValueDecimal json.Number `json:"valueDecimal"` + ValueID string `json:"valueId"` + ValueInstant string `json:"valueInstant"` + ValueInteger int `json:"valueInteger"` + ValueMarkdown string `json:"valueMarkdown"` + ValueOID string `json:"valueOid"` + ValuePositiveInt int `json:"valuePositiveInt"` + ValueString string `json:"valueString"` + ValueTime string `json:"valueTime"` + ValueUnsignedInt int `json:"valueUnsignedInt"` + ValueURI string `json:"valueUri"` + ValueURL string `json:"valueUrl"` + ValueUUUID string `json:"valueUuid"` +} + +// FHIRTaskRelayPayload is used to return single instances of Task. +type FHIRTaskRelayPayload struct { + Resource *FHIRTask `json:"resource,omitempty"` +} diff --git a/observation.go b/observation.go new file mode 100644 index 0000000..e1ecf7a --- /dev/null +++ b/observation.go @@ -0,0 +1,44 @@ +package hapifhirgo + +import ( + "context" + "fmt" + + "github.com/savannahghi/hapi-fhir-go/models" +) + +func (c *Client) CreateFHIRObservation(ctx context.Context, input *models.FHIRObservation) (*models.FHIRObservation, error) { + payload, err := structToMap(input) + if err != nil { + return nil, fmt.Errorf("unable to turn %s input into a map: %w", observationResourceType, err) + } + + resource := &models.FHIRObservation{} + + err = c.createFHIRResource(ctx, observationResourceType, payload, resource) + if err != nil { + return nil, fmt.Errorf("unable to create %s resource: %w", observationResourceType, err) + } + + return resource, nil +} + +func (c *Client) GetFHIRObservation(ctx context.Context, id string) (*models.FHIRObservation, error) { + resource := &models.FHIRObservation{} + + err := c.getFHIRResource(ctx, observationResourceType, id, resource) + if err != nil { + return nil, fmt.Errorf("unable to get %s with ID %s, err: %w", observationResourceType, id, err) + } + + return resource, nil +} + +func (c *Client) SearchFHIRObservation(ctx context.Context, searchParams map[string]interface{}) (*models.Bundle, error) { + response, err := c.searchFHIRResource(ctx, observationResourceType, searchParams) + if err != nil { + return nil, err + } + + return response, nil +} diff --git a/operations.go b/operations.go index 917aff1..f6d1f9f 100644 --- a/operations.go +++ b/operations.go @@ -112,11 +112,24 @@ func (c *Client) validateResource(ctx context.Context, resourceType string, payl // // This operation returns a patient's entire medical record // in a single request. -func (c *Client) getPatientEverything(ctx context.Context, patientFhirID string) (*models.Bundle, error) { +func (c *Client) getPatientEverything(ctx context.Context, patientFhirID string, searchParams map[string]interface{}) (*models.Bundle, error) { path := fmt.Sprintf("Patient/%v/$everything", patientFhirID) bundle := models.Bundle{} - err := c.makeRequest(ctx, http.MethodGet, path, nil, nil, bundle) + err := c.makeRequest(ctx, http.MethodGet, path, nil, searchParams, bundle) + if err != nil { + return nil, fmt.Errorf("unable to search: %w", err) + } + + return &bundle, nil +} + +// getEncounterEverything retrieves all the resources associated to an encounter. +func (c *Client) getEncounterEverything(ctx context.Context, encounterID string, searchParams map[string]interface{}) (*models.Bundle, error) { + path := fmt.Sprintf("Encounter/%v/$everything", encounterID) + bundle := models.Bundle{} + + err := c.makeRequest(ctx, http.MethodGet, path, nil, searchParams, bundle) if err != nil { return nil, fmt.Errorf("unable to search: %w", err) } diff --git a/organization.go b/organization.go new file mode 100644 index 0000000..cf47fa5 --- /dev/null +++ b/organization.go @@ -0,0 +1,44 @@ +package hapifhirgo + +import ( + "context" + "fmt" + + "github.com/savannahghi/hapi-fhir-go/models" +) + +func (c *Client) CreateFHIROrganization(ctx context.Context, input *models.FHIROrganization) (*models.FHIROrganization, error) { + payload, err := structToMap(input) + if err != nil { + return nil, fmt.Errorf("unable to turn %s input into a map: %w", organizationResource, err) + } + + resource := &models.FHIROrganization{} + + err = c.createFHIRResource(ctx, organizationResource, payload, resource) + if err != nil { + return nil, fmt.Errorf("unable to create %s resource: %w", organizationResource, err) + } + + return resource, nil +} + +func (c *Client) GetFHIROrganization(ctx context.Context, id string) (*models.FHIROrganization, error) { + resource := &models.FHIROrganization{} + + err := c.getFHIRResource(ctx, organizationResource, id, resource) + if err != nil { + return nil, fmt.Errorf("unable to get %s with ID %s, err: %w", organizationResource, id, err) + } + + return resource, nil +} + +func (c *Client) SearchFHIROrganization(ctx context.Context, searchParams map[string]interface{}) (*models.Bundle, error) { + response, err := c.searchFHIRResource(ctx, organizationResource, searchParams) + if err != nil { + return nil, err + } + + return response, nil +} diff --git a/patient.go b/patient.go index 2dc954d..3a06ca8 100644 --- a/patient.go +++ b/patient.go @@ -7,10 +7,6 @@ import ( "github.com/savannahghi/hapi-fhir-go/models" ) -const ( - patientResourceType = "Patient" -) - // CreateFHIRPatient creates a new FHIR Patient resource. func (c *Client) CreateFHIRPatient(ctx context.Context, input *models.FHIRPatient) (*models.PatientPayload, error) { payload, err := structToMap(input) @@ -46,7 +42,7 @@ func (c *Client) GetFHIRPatient(ctx context.Context, id string) (*models.Patient // GetFHIRPatientEverything is used to retrieve all patient related information. func (c *Client) GetFHIRPatientAllData(ctx context.Context, id string, params map[string]interface{}) (*models.Bundle, error) { - response, err := c.getPatientEverything(ctx, id) + response, err := c.getPatientEverything(ctx, id, params) if err != nil { return nil, err } diff --git a/service_request.go b/service_request.go new file mode 100644 index 0000000..6f63636 --- /dev/null +++ b/service_request.go @@ -0,0 +1,44 @@ +package hapifhirgo + +import ( + "context" + "fmt" + + "github.com/savannahghi/hapi-fhir-go/models" +) + +func (c *Client) CreateFHIRServiceRequest(ctx context.Context, input *models.FHIRServiceRequest) (*models.FHIRServiceRequest, error) { + payload, err := structToMap(input) + if err != nil { + return nil, fmt.Errorf("unable to turn %s input into a map: %w", serviceRequestResourceType, err) + } + + resource := &models.FHIRServiceRequest{} + + err = c.createFHIRResource(ctx, serviceRequestResourceType, payload, resource) + if err != nil { + return nil, fmt.Errorf("unable to create %s resource: %w", serviceRequestResourceType, err) + } + + return resource, nil +} + +func (c *Client) GetFHIRServiceRequest(ctx context.Context, id string) (*models.FHIRServiceRequest, error) { + resource := &models.FHIRServiceRequest{} + + err := c.getFHIRResource(ctx, serviceRequestResourceType, id, resource) + if err != nil { + return nil, fmt.Errorf("unable to get %s with ID %s, err: %w", serviceRequestResourceType, id, err) + } + + return resource, nil +} + +func (c *Client) SearchFHIRServiceRequest(ctx context.Context, searchParams map[string]interface{}) (*models.Bundle, error) { + response, err := c.searchFHIRResource(ctx, serviceRequestResourceType, searchParams) + if err != nil { + return nil, err + } + + return response, nil +} diff --git a/task.go b/task.go new file mode 100644 index 0000000..b78666d --- /dev/null +++ b/task.go @@ -0,0 +1,44 @@ +package hapifhirgo + +import ( + "context" + "fmt" + + "github.com/savannahghi/hapi-fhir-go/models" +) + +func (c *Client) CreateFHIRTask(ctx context.Context, input *models.FHIRTask) (*models.FHIRTask, error) { + payload, err := structToMap(input) + if err != nil { + return nil, fmt.Errorf("unable to turn %s input into a map: %w", taskResourceType, err) + } + + resource := &models.FHIRTask{} + + err = c.createFHIRResource(ctx, taskResourceType, payload, resource) + if err != nil { + return nil, fmt.Errorf("unable to create %s resource: %w", taskResourceType, err) + } + + return resource, nil +} + +func (c *Client) GetFHIRTask(ctx context.Context, id string) (*models.FHIRTask, error) { + resource := &models.FHIRTask{} + + err := c.getFHIRResource(ctx, taskResourceType, id, resource) + if err != nil { + return nil, fmt.Errorf("unable to get %s with ID %s, err: %w", taskResourceType, id, err) + } + + return resource, nil +} + +func (c *Client) SearchFHIRTask(ctx context.Context, searchParams map[string]interface{}) (*models.Bundle, error) { + response, err := c.searchFHIRResource(ctx, taskResourceType, searchParams) + if err != nil { + return nil, err + } + + return response, nil +}