mirah-ruby 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.circleci/config.yml +93 -0
- data/.gitignore +14 -0
- data/.overcommit.yml +48 -0
- data/.overcommit_gems.rb +9 -0
- data/.rspec +3 -0
- data/.rubocop.yml +54 -0
- data/.yardopts +1 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +187 -0
- data/Rakefile +24 -0
- data/bin/autocorrect +28 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/bin/setup_overcommit +12 -0
- data/lib/mirah.rb +44 -0
- data/lib/mirah/base_input_object.rb +65 -0
- data/lib/mirah/base_object.rb +98 -0
- data/lib/mirah/client.rb +420 -0
- data/lib/mirah/collection.rb +98 -0
- data/lib/mirah/data/appointment.rb +65 -0
- data/lib/mirah/data/organization.rb +31 -0
- data/lib/mirah/data/page_info.rb +40 -0
- data/lib/mirah/data/patient.rb +46 -0
- data/lib/mirah/data/practitioner.rb +53 -0
- data/lib/mirah/errors.rb +39 -0
- data/lib/mirah/filters.rb +7 -0
- data/lib/mirah/filters/appointment_filters.rb +16 -0
- data/lib/mirah/filters/organization_filters.rb +16 -0
- data/lib/mirah/filters/paging.rb +33 -0
- data/lib/mirah/filters/patient_filters.rb +16 -0
- data/lib/mirah/filters/practitioner_filters.rb +16 -0
- data/lib/mirah/graphql.rb +33 -0
- data/lib/mirah/graphql/fragments.rb +97 -0
- data/lib/mirah/graphql/mutations.rb +72 -0
- data/lib/mirah/graphql/queries.rb +196 -0
- data/lib/mirah/inputs.rb +7 -0
- data/lib/mirah/inputs/appointment_input.rb +40 -0
- data/lib/mirah/inputs/organization_input.rb +20 -0
- data/lib/mirah/inputs/patient_input.rb +40 -0
- data/lib/mirah/inputs/practitioner_input.rb +44 -0
- data/lib/mirah/push_result.rb +40 -0
- data/lib/mirah/serializers.rb +57 -0
- data/lib/mirah/version.rb +5 -0
- data/mirah-ruby.gemspec +41 -0
- data/schema.json +8936 -0
- metadata +221 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mirah
|
4
|
+
module Filters
|
5
|
+
# Input parameters and filters for queries returning {Data::Patient} objects.
|
6
|
+
class PatientFilters < BaseObject
|
7
|
+
# @!attribute [r] external_id
|
8
|
+
# @return [Array<string>] An array of external identifiers to match.
|
9
|
+
attribute :external_id
|
10
|
+
|
11
|
+
# @!attribute [r] search
|
12
|
+
# @return [string] Smart search by name and other fields where appropriate
|
13
|
+
attribute :search
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mirah
|
4
|
+
module Filters
|
5
|
+
# Input parameters and filters for queries returning {Data::Practitioner} objects.
|
6
|
+
class PractitionerFilters < BaseObject
|
7
|
+
# @!attribute [r] external_id
|
8
|
+
# @return [Array<string>] An array of external identifiers to match.
|
9
|
+
attribute :external_id
|
10
|
+
|
11
|
+
# @!attribute [r] search
|
12
|
+
# @return [string] Smart search by name and other fields where appropriate
|
13
|
+
attribute :search
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mirah
|
4
|
+
# Graphql provides the direct interface with the graphql client library and can be used directly to query
|
5
|
+
# Mirah endpoints.
|
6
|
+
# @private
|
7
|
+
module Graphql
|
8
|
+
DEFAULT_ENDPOINT = '/integration_api/graphql'
|
9
|
+
|
10
|
+
raw_schema = JSON.parse(File.read(File.dirname(__FILE__) + '/../../schema.json'))
|
11
|
+
Schema = GraphQL::Schema::Loader.load(raw_schema)
|
12
|
+
|
13
|
+
# A graplql executor which will supply the correct HTTP headers to authenticate with Mirah servers.
|
14
|
+
class AuthorizedHttp < GraphQL::Client::HTTP
|
15
|
+
def headers(context)
|
16
|
+
{
|
17
|
+
"API_USER_ID": context[:user_id],
|
18
|
+
"API_KEY": context[:access_token]
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Create a new Graphql client for the given endpoint, authenticating with the given details.
|
24
|
+
def self.create_client(host:)
|
25
|
+
http = AuthorizedHttp.new(host + DEFAULT_ENDPOINT)
|
26
|
+
GraphQL::Client.new(schema: Schema, execute: http)
|
27
|
+
end
|
28
|
+
|
29
|
+
# In order to validate the queries in advance, we need a client, but we don't have an execution context,
|
30
|
+
# so we make a validation client to generate the query types.
|
31
|
+
ValidationClient = GraphQL::Client.new(schema: Schema)
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mirah
|
4
|
+
module Graphql
|
5
|
+
# @private
|
6
|
+
module Fragments
|
7
|
+
PageInfoFragment = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
8
|
+
fragment on PageInfo {
|
9
|
+
hasNextPage
|
10
|
+
hasPreviousPage
|
11
|
+
startCursor
|
12
|
+
endCursor
|
13
|
+
}
|
14
|
+
GRAPHQL
|
15
|
+
|
16
|
+
PatientFragment = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
17
|
+
fragment on Patient {
|
18
|
+
id
|
19
|
+
externalId
|
20
|
+
givenName
|
21
|
+
familyName
|
22
|
+
birthDate
|
23
|
+
gender
|
24
|
+
primaryLanguage
|
25
|
+
email
|
26
|
+
phoneNumber
|
27
|
+
identifier {
|
28
|
+
value
|
29
|
+
}
|
30
|
+
}
|
31
|
+
GRAPHQL
|
32
|
+
|
33
|
+
OrganizationFragment = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
34
|
+
fragment on Organization {
|
35
|
+
id
|
36
|
+
externalId
|
37
|
+
name
|
38
|
+
identifier {
|
39
|
+
value
|
40
|
+
}
|
41
|
+
partOf {
|
42
|
+
id
|
43
|
+
externalId
|
44
|
+
}
|
45
|
+
}
|
46
|
+
GRAPHQL
|
47
|
+
|
48
|
+
PractitionerFragment = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
49
|
+
fragment on Practitioner {
|
50
|
+
id
|
51
|
+
externalId
|
52
|
+
givenName
|
53
|
+
familyName
|
54
|
+
title
|
55
|
+
suffix
|
56
|
+
email
|
57
|
+
defaultPractitionerRole
|
58
|
+
ssoUsername
|
59
|
+
identifier {
|
60
|
+
value
|
61
|
+
}
|
62
|
+
organizations {
|
63
|
+
id
|
64
|
+
externalId
|
65
|
+
}
|
66
|
+
}
|
67
|
+
GRAPHQL
|
68
|
+
|
69
|
+
AppointmentFragment = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
70
|
+
fragment on Appointment {
|
71
|
+
id
|
72
|
+
externalId
|
73
|
+
startDate
|
74
|
+
endDate
|
75
|
+
minutesDuration
|
76
|
+
status
|
77
|
+
patient {
|
78
|
+
id
|
79
|
+
externalId
|
80
|
+
}
|
81
|
+
organization {
|
82
|
+
id
|
83
|
+
externalId
|
84
|
+
}
|
85
|
+
organization {
|
86
|
+
id
|
87
|
+
externalId
|
88
|
+
}
|
89
|
+
practitioner {
|
90
|
+
id
|
91
|
+
externalId
|
92
|
+
}
|
93
|
+
}
|
94
|
+
GRAPHQL
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mirah
|
4
|
+
module Graphql
|
5
|
+
# @private
|
6
|
+
module Mutations
|
7
|
+
# Create or update a patient
|
8
|
+
CreateOrUpdatePatientMutation = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
9
|
+
mutation($input: CreateOrUpdatePatientInput!) {
|
10
|
+
createOrUpdatePatient(input: $input) {
|
11
|
+
status
|
12
|
+
errors {
|
13
|
+
path
|
14
|
+
message
|
15
|
+
}
|
16
|
+
result {
|
17
|
+
...Mirah::Graphql::Fragments::PatientFragment
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
21
|
+
GRAPHQL
|
22
|
+
|
23
|
+
# Create or update an organization
|
24
|
+
CreateOrUpdateOrganizationMutation = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
25
|
+
mutation($input: CreateOrUpdateOrganizationInput!) {
|
26
|
+
createOrUpdateOrganization(input: $input) {
|
27
|
+
status
|
28
|
+
errors {
|
29
|
+
path
|
30
|
+
message
|
31
|
+
}
|
32
|
+
result {
|
33
|
+
...Mirah::Graphql::Fragments::OrganizationFragment
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
GRAPHQL
|
38
|
+
|
39
|
+
# Create or update a practitioner
|
40
|
+
CreateOrUpdatePractitionerMutation = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
41
|
+
mutation($input: CreateOrUpdatePractitionerInput!) {
|
42
|
+
createOrUpdatePractitioner(input: $input) {
|
43
|
+
status
|
44
|
+
errors {
|
45
|
+
path
|
46
|
+
message
|
47
|
+
}
|
48
|
+
result {
|
49
|
+
...Mirah::Graphql::Fragments::PractitionerFragment
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
GRAPHQL
|
54
|
+
|
55
|
+
# Create or update an appointment
|
56
|
+
CreateOrUpdateAppointmentMutation = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
57
|
+
mutation($input: CreateOrUpdateAppointmentInput!) {
|
58
|
+
createOrUpdateAppointment(input: $input) {
|
59
|
+
status
|
60
|
+
errors {
|
61
|
+
path
|
62
|
+
message
|
63
|
+
}
|
64
|
+
result {
|
65
|
+
...Mirah::Graphql::Fragments::AppointmentFragment
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
GRAPHQL
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,196 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mirah
|
4
|
+
module Graphql
|
5
|
+
# @private
|
6
|
+
module Queries # rubocop:disable Metrics/ModuleLength
|
7
|
+
#========================================================================
|
8
|
+
# PATIENT QUERIES
|
9
|
+
#========================================================================
|
10
|
+
|
11
|
+
PatientQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
12
|
+
query(
|
13
|
+
$first: Int
|
14
|
+
$last: Int
|
15
|
+
$after: String
|
16
|
+
$before: String,
|
17
|
+
$externalId: [String!],
|
18
|
+
$search: String
|
19
|
+
) {
|
20
|
+
patients(
|
21
|
+
first: $first
|
22
|
+
after: $after
|
23
|
+
before: $before
|
24
|
+
last: $last,
|
25
|
+
externalId: $externalId,
|
26
|
+
search: $search
|
27
|
+
) {
|
28
|
+
nodes {
|
29
|
+
...Mirah::Graphql::Fragments::PatientFragment
|
30
|
+
}
|
31
|
+
pageInfo {
|
32
|
+
...Mirah::Graphql::Fragments::PageInfoFragment
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
GRAPHQL
|
37
|
+
|
38
|
+
PatientIdQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
39
|
+
query($id: ID!) {
|
40
|
+
patient(id: $id) {
|
41
|
+
...Mirah::Graphql::Fragments::PatientFragment
|
42
|
+
}
|
43
|
+
}
|
44
|
+
GRAPHQL
|
45
|
+
|
46
|
+
PatientExternalIdQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
47
|
+
query($externalId: String!) {
|
48
|
+
patientExternal(externalId: $externalId) {
|
49
|
+
...Mirah::Graphql::Fragments::PatientFragment
|
50
|
+
}
|
51
|
+
}
|
52
|
+
GRAPHQL
|
53
|
+
|
54
|
+
#========================================================================
|
55
|
+
# ORGANIZATION QUERIES
|
56
|
+
#========================================================================
|
57
|
+
|
58
|
+
OrganizationQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
59
|
+
query(
|
60
|
+
$first: Int
|
61
|
+
$last: Int
|
62
|
+
$after: String
|
63
|
+
$before: String,
|
64
|
+
$externalId: [String!],
|
65
|
+
$search: String
|
66
|
+
) {
|
67
|
+
organizations(
|
68
|
+
first: $first
|
69
|
+
after: $after
|
70
|
+
before: $before
|
71
|
+
last: $last,
|
72
|
+
externalId: $externalId,
|
73
|
+
search: $search
|
74
|
+
) {
|
75
|
+
nodes {
|
76
|
+
...Mirah::Graphql::Fragments::OrganizationFragment
|
77
|
+
}
|
78
|
+
pageInfo {
|
79
|
+
...Mirah::Graphql::Fragments::PageInfoFragment
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
GRAPHQL
|
84
|
+
|
85
|
+
OrganizationIdQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
86
|
+
query($id: ID!) {
|
87
|
+
organization(id: $id) {
|
88
|
+
...Mirah::Graphql::Fragments::OrganizationFragment
|
89
|
+
}
|
90
|
+
}
|
91
|
+
GRAPHQL
|
92
|
+
|
93
|
+
OrganizationExternalIdQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
94
|
+
query($externalId: String!) {
|
95
|
+
organizationExternal(externalId: $externalId) {
|
96
|
+
...Mirah::Graphql::Fragments::OrganizationFragment
|
97
|
+
}
|
98
|
+
}
|
99
|
+
GRAPHQL
|
100
|
+
|
101
|
+
#========================================================================
|
102
|
+
# PRACTITIONER QUERIES
|
103
|
+
#========================================================================
|
104
|
+
|
105
|
+
PractitionerQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
106
|
+
query(
|
107
|
+
$first: Int
|
108
|
+
$last: Int
|
109
|
+
$after: String
|
110
|
+
$before: String,
|
111
|
+
$externalId: [String!]
|
112
|
+
$search: String
|
113
|
+
) {
|
114
|
+
practitioners(
|
115
|
+
first: $first
|
116
|
+
after: $after
|
117
|
+
before: $before
|
118
|
+
last: $last,
|
119
|
+
externalId: $externalId,
|
120
|
+
search: $search
|
121
|
+
) {
|
122
|
+
nodes {
|
123
|
+
...Mirah::Graphql::Fragments::PractitionerFragment
|
124
|
+
}
|
125
|
+
pageInfo {
|
126
|
+
...Mirah::Graphql::Fragments::PageInfoFragment
|
127
|
+
}
|
128
|
+
}
|
129
|
+
}
|
130
|
+
GRAPHQL
|
131
|
+
|
132
|
+
PractitionerIdQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
133
|
+
query($id: ID!) {
|
134
|
+
practitioner(id: $id) {
|
135
|
+
...Mirah::Graphql::Fragments::PractitionerFragment
|
136
|
+
}
|
137
|
+
}
|
138
|
+
GRAPHQL
|
139
|
+
|
140
|
+
PractitionerExternalIdQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
141
|
+
query($externalId: String!) {
|
142
|
+
practitionerExternal(externalId: $externalId) {
|
143
|
+
...Mirah::Graphql::Fragments::PractitionerFragment
|
144
|
+
}
|
145
|
+
}
|
146
|
+
GRAPHQL
|
147
|
+
|
148
|
+
#========================================================================
|
149
|
+
# APPOINTMENT QUERIES
|
150
|
+
#========================================================================
|
151
|
+
|
152
|
+
AppointmentQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
153
|
+
query(
|
154
|
+
$first: Int
|
155
|
+
$last: Int
|
156
|
+
$after: String
|
157
|
+
$before: String,
|
158
|
+
$externalId: [String!]
|
159
|
+
$status: [AppointmentStatus!]
|
160
|
+
) {
|
161
|
+
appointments(
|
162
|
+
first: $first
|
163
|
+
after: $after
|
164
|
+
before: $before
|
165
|
+
last: $last,
|
166
|
+
externalId: $externalId,
|
167
|
+
status: $status
|
168
|
+
) {
|
169
|
+
nodes {
|
170
|
+
...Mirah::Graphql::Fragments::AppointmentFragment
|
171
|
+
}
|
172
|
+
pageInfo {
|
173
|
+
...Mirah::Graphql::Fragments::PageInfoFragment
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|
177
|
+
GRAPHQL
|
178
|
+
|
179
|
+
AppointmentIdQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
180
|
+
query($id: ID!) {
|
181
|
+
appointment(id: $id) {
|
182
|
+
...Mirah::Graphql::Fragments::AppointmentFragment
|
183
|
+
}
|
184
|
+
}
|
185
|
+
GRAPHQL
|
186
|
+
|
187
|
+
AppointmentExternalIdQuery = Graphql::ValidationClient.parse <<-'GRAPHQL'
|
188
|
+
query($externalId: String!) {
|
189
|
+
appointmentExternal(externalId: $externalId) {
|
190
|
+
...Mirah::Graphql::Fragments::AppointmentFragment
|
191
|
+
}
|
192
|
+
}
|
193
|
+
GRAPHQL
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
data/lib/mirah/inputs.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mirah
|
4
|
+
module Inputs
|
5
|
+
# A set of parameters for updating a {Data::Appointment}
|
6
|
+
class AppointmentInput < BaseInputObject
|
7
|
+
# @!attribute [r] external_id
|
8
|
+
# @return (see Mirah::Data::Appointment#external_id)
|
9
|
+
input :external_id, required: true
|
10
|
+
|
11
|
+
# @!attribute [r] start_date
|
12
|
+
# @return (see Mirah::Data::Appointment#start_date)
|
13
|
+
input :start_date, required: false, serializer: Serializers::DateTimeSerializer
|
14
|
+
|
15
|
+
# @!attribute [r] end_date
|
16
|
+
# @return (see Mirah::Data::Appointment#end_date)
|
17
|
+
input :end_date, required: false, serializer: Serializers::DateTimeSerializer
|
18
|
+
|
19
|
+
# @!attribute [r] minutes_duration
|
20
|
+
# @return (see Mirah::Data::Appointment#minutes_duration)
|
21
|
+
input :minutes_duration, required: false
|
22
|
+
|
23
|
+
# @!attribute [r] status
|
24
|
+
# @return (see Mirah::Data::Appointment#status)
|
25
|
+
input :status, required: true
|
26
|
+
|
27
|
+
# @!attribute [r] external_patient_id
|
28
|
+
# @return (see Mirah::Data::Appointment#external_patient_id)
|
29
|
+
input :external_patient_id, required: false
|
30
|
+
|
31
|
+
# @!attribute [r] external_organization_id
|
32
|
+
# @return (see Mirah::Data::Appointment#external_organization_id)
|
33
|
+
input :external_organization_id, required: false
|
34
|
+
|
35
|
+
# @!attribute [r] external_practitioner_id
|
36
|
+
# @return (see Mirah::Data::Appointment#external_practitioner_id)
|
37
|
+
input :external_practitioner_id, required: false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|