mirah-ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +93 -0
  3. data/.gitignore +14 -0
  4. data/.overcommit.yml +48 -0
  5. data/.overcommit_gems.rb +9 -0
  6. data/.rspec +3 -0
  7. data/.rubocop.yml +54 -0
  8. data/.yardopts +1 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/Gemfile +6 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +187 -0
  13. data/Rakefile +24 -0
  14. data/bin/autocorrect +28 -0
  15. data/bin/console +14 -0
  16. data/bin/setup +8 -0
  17. data/bin/setup_overcommit +12 -0
  18. data/lib/mirah.rb +44 -0
  19. data/lib/mirah/base_input_object.rb +65 -0
  20. data/lib/mirah/base_object.rb +98 -0
  21. data/lib/mirah/client.rb +420 -0
  22. data/lib/mirah/collection.rb +98 -0
  23. data/lib/mirah/data/appointment.rb +65 -0
  24. data/lib/mirah/data/organization.rb +31 -0
  25. data/lib/mirah/data/page_info.rb +40 -0
  26. data/lib/mirah/data/patient.rb +46 -0
  27. data/lib/mirah/data/practitioner.rb +53 -0
  28. data/lib/mirah/errors.rb +39 -0
  29. data/lib/mirah/filters.rb +7 -0
  30. data/lib/mirah/filters/appointment_filters.rb +16 -0
  31. data/lib/mirah/filters/organization_filters.rb +16 -0
  32. data/lib/mirah/filters/paging.rb +33 -0
  33. data/lib/mirah/filters/patient_filters.rb +16 -0
  34. data/lib/mirah/filters/practitioner_filters.rb +16 -0
  35. data/lib/mirah/graphql.rb +33 -0
  36. data/lib/mirah/graphql/fragments.rb +97 -0
  37. data/lib/mirah/graphql/mutations.rb +72 -0
  38. data/lib/mirah/graphql/queries.rb +196 -0
  39. data/lib/mirah/inputs.rb +7 -0
  40. data/lib/mirah/inputs/appointment_input.rb +40 -0
  41. data/lib/mirah/inputs/organization_input.rb +20 -0
  42. data/lib/mirah/inputs/patient_input.rb +40 -0
  43. data/lib/mirah/inputs/practitioner_input.rb +44 -0
  44. data/lib/mirah/push_result.rb +40 -0
  45. data/lib/mirah/serializers.rb +57 -0
  46. data/lib/mirah/version.rb +5 -0
  47. data/mirah-ruby.gemspec +41 -0
  48. data/schema.json +8936 -0
  49. 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
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mirah
4
+ # These filters represent ways of querying data. Each endpoint has a set of filters that you can apply.
5
+ module Inputs
6
+ end
7
+ end
@@ -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