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.
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