Class: CanvasOauth::CanvasApi
- Inherits:
-
Object
- Object
- CanvasOauth::CanvasApi
show all
- Includes:
- HTTParty
- Defined in:
- lib/canvas_oauth/canvas_api.rb
Defined Under Namespace
Classes: Authenticate, Unauthorized
Constant Summary
collapse
- PER_PAGE =
50
Instance Attribute Summary collapse
Instance Method Summary
collapse
-
#auth_url(redirect_uri, oauth2_state) ⇒ Object
-
#authenticated_get(*params) ⇒ Object
-
#authenticated_post(*params) ⇒ Object
-
#authenticated_put(*params) ⇒ Object
-
#authenticated_request(method, *params) ⇒ Object
-
#course_account_id(course_id) ⇒ Object
-
#course_root_account_id(course_id) ⇒ Object
-
#create_assignment(course_id, params) ⇒ Object
-
#get_access_token(code) ⇒ Object
-
#get_account(account_id) ⇒ Object
-
#get_account_courses(account_id) ⇒ Object
-
#get_account_sub_accounts(account_id) ⇒ Object
-
#get_account_users(account_id) ⇒ Object
-
#get_accounts_provisioning_report(account_id) ⇒ Object
-
#get_all_course_users(course_id) ⇒ Object
-
#get_assignment(course_id, assignment_id) ⇒ Object
-
#get_assignments(course_id) ⇒ Object
-
#get_course(course_id) ⇒ Object
-
#get_course_students(course_id) ⇒ Object
-
#get_course_teachers_and_tas(course_id) ⇒ Object
-
#get_course_users(course_id) ⇒ Object
-
#get_courses ⇒ Object
-
#get_file(file_id) ⇒ Object
-
#get_report(account_id, report_type, params) ⇒ Object
-
#get_section(section_id) ⇒ Object
-
#get_section_enrollments(section_id) ⇒ Object
-
#get_sections(course_id) ⇒ Object
-
#get_submission(course_id, assignment_id, user_id) ⇒ Object
-
#get_user_enrollments(user_id) ⇒ Object
-
#get_user_profile(user_id) ⇒ Object
-
#grade_assignment(course_id, assignment_id, user_id, params) ⇒ Object
-
#hash_csv(csv_string) ⇒ Object
Needs to be refactored to somewhere more generic.
-
#hex_sis_id(name, value) ⇒ Object
-
#initialize(canvas_url, token, key, secret) ⇒ CanvasApi
constructor
A new instance of CanvasApi.
-
#paginated_get(url, params = {}) ⇒ Object
-
#root_account_id(account_id) ⇒ Object
-
#update_assignment(course_id, assignment_id, params) ⇒ Object
-
#valid_page?(page) ⇒ Boolean
Constructor Details
#initialize(canvas_url, token, key, secret) ⇒ CanvasApi
Returns a new instance of CanvasApi.
9
10
11
12
13
14
15
16
17
18
|
# File 'lib/canvas_oauth/canvas_api.rb', line 9
def initialize(canvas_url, token, key, secret)
unless [key, secret].all?(&:present?)
raise "Invalid Canvas oAuth configuration"
end
self.canvas_url = canvas_url
self.token = token
self.key = key
self.secret = secret
end
|
Instance Attribute Details
#canvas_url ⇒ Object
Returns the value of attribute canvas_url.
7
8
9
|
# File 'lib/canvas_oauth/canvas_api.rb', line 7
def canvas_url
@canvas_url
end
|
#key ⇒ Object
Returns the value of attribute key.
6
7
8
|
# File 'lib/canvas_oauth/canvas_api.rb', line 6
def key
@key
end
|
#secret ⇒ Object
Returns the value of attribute secret.
6
7
8
|
# File 'lib/canvas_oauth/canvas_api.rb', line 6
def secret
@secret
end
|
#token ⇒ Object
Returns the value of attribute token.
6
7
8
|
# File 'lib/canvas_oauth/canvas_api.rb', line 6
def token
@token
end
|
Instance Method Details
#auth_url(redirect_uri, oauth2_state) ⇒ Object
227
228
229
|
# File 'lib/canvas_oauth/canvas_api.rb', line 227
def auth_url(redirect_uri, oauth2_state)
"#{canvas_url}/login/oauth2/auth?client_id=#{key}&response_type=code&state=#{oauth2_state}&redirect_uri=#{redirect_uri}"
end
|
#authenticated_get(*params) ⇒ Object
114
115
116
|
# File 'lib/canvas_oauth/canvas_api.rb', line 114
def authenticated_get(*params)
authenticated_request(:get, *params)
end
|
#authenticated_post(*params) ⇒ Object
118
119
120
|
# File 'lib/canvas_oauth/canvas_api.rb', line 118
def authenticated_post(*params)
authenticated_request(:post, *params)
end
|
#authenticated_put(*params) ⇒ Object
122
123
124
|
# File 'lib/canvas_oauth/canvas_api.rb', line 122
def authenticated_put(*params)
authenticated_request(:put, *params)
end
|
#authenticated_request(method, *params) ⇒ Object
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
# File 'lib/canvas_oauth/canvas_api.rb', line 20
def authenticated_request(method, *params)
params << {} if params.size == 1
params.last[:headers] ||= {}
params.last[:headers]['Authorization'] = "Bearer #{token}"
start = Time.now
response = self.class.send(method, *params)
Rails.logger.info {
stop = Time.now
elapsed = ((stop - start) * 1000).round(2)
params.last[:headers].reject! { |k| k == 'Authorization' }
"API call (#{elapsed}ms): #{method} #{params.inspect}"
}
if response && response.unauthorized?
if response.['WWW-Authenticate'].present?
raise CanvasApi::Authenticate
else
raise CanvasApi::Unauthorized
end
else
return response
end
end
|
#course_account_id(course_id) ⇒ Object
210
211
212
213
|
# File 'lib/canvas_oauth/canvas_api.rb', line 210
def course_account_id(course_id)
course = get_course(course_id)
course['account_id'] if course
end
|
#course_root_account_id(course_id) ⇒ Object
223
224
225
|
# File 'lib/canvas_oauth/canvas_api.rb', line 223
def course_root_account_id(course_id)
root_account_id(course_account_id(course_id))
end
|
#create_assignment(course_id, params) ⇒ Object
194
195
196
|
# File 'lib/canvas_oauth/canvas_api.rb', line 194
def create_assignment(course_id, params)
authenticated_post "/api/v1/courses/#{course_id}/assignments", { body: { assignment: params } }
end
|
#get_access_token(code) ⇒ Object
231
232
233
234
235
236
237
238
239
240
241
242
|
# File 'lib/canvas_oauth/canvas_api.rb', line 231
def get_access_token(code)
params = {
body: {
client_id: key,
client_secret: secret,
code: code
}
}
response = self.class.post '/login/oauth2/token', params
self.token = response['access_token']
end
|
#get_account(account_id) ⇒ Object
130
131
132
|
# File 'lib/canvas_oauth/canvas_api.rb', line 130
def get_account(account_id)
authenticated_get "/api/v1/accounts/#{account_id}"
end
|
#get_account_courses(account_id) ⇒ Object
138
139
140
|
# File 'lib/canvas_oauth/canvas_api.rb', line 138
def get_account_courses(account_id)
paginated_get "/api/v1/accounts/#{account_id}/courses"
end
|
#get_account_sub_accounts(account_id) ⇒ Object
134
135
136
|
# File 'lib/canvas_oauth/canvas_api.rb', line 134
def get_account_sub_accounts(account_id)
paginated_get "/api/v1/accounts/#{account_id}/sub_accounts", { query: { :recursive => true } }
end
|
#get_account_users(account_id) ⇒ Object
142
143
144
|
# File 'lib/canvas_oauth/canvas_api.rb', line 142
def get_account_users(account_id)
paginated_get "/api/v1/accounts/#{account_id}/users"
end
|
#get_accounts_provisioning_report(account_id) ⇒ Object
91
92
93
|
# File 'lib/canvas_oauth/canvas_api.rb', line 91
def get_accounts_provisioning_report(account_id)
get_report(account_id, :provisioning_csv, 'parameters[accounts]' => true)
end
|
#get_all_course_users(course_id) ⇒ Object
162
163
164
|
# File 'lib/canvas_oauth/canvas_api.rb', line 162
def get_all_course_users(course_id)
paginated_get "/api/v1/courses/#{course_id}/users", { query: {enrollment_state: ["active","invited","rejected","completed","inactive"] } }
end
|
#get_assignment(course_id, assignment_id) ⇒ Object
186
187
188
|
# File 'lib/canvas_oauth/canvas_api.rb', line 186
def get_assignment(course_id, assignment_id)
authenticated_get "/api/v1/courses/#{course_id}/assignments/#{assignment_id}"
end
|
#get_assignments(course_id) ⇒ Object
182
183
184
|
# File 'lib/canvas_oauth/canvas_api.rb', line 182
def get_assignments(course_id)
paginated_get "/api/v1/courses/#{course_id}/assignments"
end
|
#get_course(course_id) ⇒ Object
146
147
148
|
# File 'lib/canvas_oauth/canvas_api.rb', line 146
def get_course(course_id)
authenticated_get "/api/v1/courses/#{course_id}"
end
|
#get_course_students(course_id) ⇒ Object
170
171
172
|
# File 'lib/canvas_oauth/canvas_api.rb', line 170
def get_course_students(course_id)
paginated_get "/api/v1/courses/#{course_id}/students"
end
|
#get_course_teachers_and_tas(course_id) ⇒ Object
166
167
168
|
# File 'lib/canvas_oauth/canvas_api.rb', line 166
def get_course_teachers_and_tas(course_id)
paginated_get "/api/v1/courses/#{course_id}/users", { query: { enrollment_type: ['teacher', 'ta'] } }
end
|
#get_course_users(course_id) ⇒ Object
158
159
160
|
# File 'lib/canvas_oauth/canvas_api.rb', line 158
def get_course_users(course_id)
paginated_get "/api/v1/courses/#{course_id}/users"
end
|
#get_courses ⇒ Object
126
127
128
|
# File 'lib/canvas_oauth/canvas_api.rb', line 126
def get_courses
paginated_get "/api/v1/courses"
end
|
#get_file(file_id) ⇒ Object
87
88
89
|
# File 'lib/canvas_oauth/canvas_api.rb', line 87
def get_file(file_id)
authenticated_get "/api/v1/files/#{file_id}"
end
|
#get_report(account_id, report_type, params) ⇒ Object
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/canvas_oauth/canvas_api.rb', line 66
def get_report(account_id, report_type, params)
report = authenticated_post("/api/v1/accounts/#{account_id}/reports/#{report_type}", { body: params })
report = authenticated_get "/api/v1/accounts/#{account_id}/reports/#{report_type}/#{report['id']}"
while (report['status'] == 'created' || report['status'] == 'running')
sleep(4)
report = authenticated_get "/api/v1/accounts/#{account_id}/reports/#{report_type}/#{report['id']}"
end
if report['status'] == 'complete'
file_id = report['file_url'].match(/files\/([0-9]+)\/download/)[1]
file = get_file(file_id)
return hash_csv(self.class.get(file['url'], limit: 15, parser: DefaultUTF8Parser).parsed_response)
else
return report
end
end
|
#get_section(section_id) ⇒ Object
174
175
176
|
# File 'lib/canvas_oauth/canvas_api.rb', line 174
def get_section(section_id)
authenticated_get "/api/v1/sections/#{section_id}"
end
|
#get_section_enrollments(section_id) ⇒ Object
150
151
152
|
# File 'lib/canvas_oauth/canvas_api.rb', line 150
def get_section_enrollments(section_id)
paginated_get "/api/v1/sections/#{section_id}/enrollments"
end
|
#get_sections(course_id) ⇒ Object
178
179
180
|
# File 'lib/canvas_oauth/canvas_api.rb', line 178
def get_sections(course_id)
paginated_get "/api/v1/courses/#{course_id}/sections", { query: { :include => ['students', 'avatar_url', 'enrollments'] } }
end
|
#get_submission(course_id, assignment_id, user_id) ⇒ Object
206
207
208
|
# File 'lib/canvas_oauth/canvas_api.rb', line 206
def get_submission(course_id, assignment_id, user_id)
authenticated_get "/api/v1/courses/#{course_id}/assignments/#{assignment_id}/submissions/#{user_id}"
end
|
#get_user_enrollments(user_id) ⇒ Object
154
155
156
|
# File 'lib/canvas_oauth/canvas_api.rb', line 154
def get_user_enrollments(user_id)
paginated_get "/api/v1/users/#{user_id}/enrollments"
end
|
#get_user_profile(user_id) ⇒ Object
190
191
192
|
# File 'lib/canvas_oauth/canvas_api.rb', line 190
def get_user_profile(user_id)
authenticated_get "/api/v1/users/#{user_id}/profile"
end
|
#grade_assignment(course_id, assignment_id, user_id, params) ⇒ Object
202
203
204
|
# File 'lib/canvas_oauth/canvas_api.rb', line 202
def grade_assignment(course_id, assignment_id, user_id, params)
authenticated_put "/api/v1/courses/#{course_id}/assignments/#{assignment_id}/submissions/#{user_id}", { body: params }
end
|
#hash_csv(csv_string) ⇒ Object
Needs to be refactored to somewhere more generic
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
# File 'lib/canvas_oauth/canvas_api.rb', line 96
def hash_csv(csv_string)
require 'csv'
csv = csv_string.is_a?(String) ? CSV.parse(csv_string) : csv_string
= csv.shift
output = []
csv.each do |row|
hash = {}
.each do ||
hash[] = row.shift.to_s
end
output << hash
end
return output
end
|
#hex_sis_id(name, value) ⇒ Object
244
245
246
247
|
# File 'lib/canvas_oauth/canvas_api.rb', line 244
def hex_sis_id(name, value)
hex = value.unpack("H*")[0]
return "hex:#{name}:#{hex}"
end
|
#paginated_get(url, params = {}) ⇒ Object
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# File 'lib/canvas_oauth/canvas_api.rb', line 49
def paginated_get(url, params = {})
params[:query] ||= {}
params[:query][:per_page] = PER_PAGE
all_pages = []
while url && current_page = authenticated_get(url, params) do
all_pages.concat(current_page) if valid_page?(current_page)
links = LinkHeader.parse(current_page.['link'])
url = links.find_link(["rel", "next"]).try(:href)
params[:query] = nil if params[:query]
end
all_pages
end
|
#root_account_id(account_id) ⇒ Object
215
216
217
218
219
220
221
|
# File 'lib/canvas_oauth/canvas_api.rb', line 215
def root_account_id(account_id)
if account_id && account = get_account(account_id)
root_id = account['root_account_id']
end
root_id || account_id
end
|
#update_assignment(course_id, assignment_id, params) ⇒ Object
198
199
200
|
# File 'lib/canvas_oauth/canvas_api.rb', line 198
def update_assignment(course_id, assignment_id, params)
authenticated_put "/api/v1/courses/#{course_id}/assignments/#{assignment_id}", { body: { assignment: params } }
end
|
#valid_page?(page) ⇒ Boolean
83
84
85
|
# File 'lib/canvas_oauth/canvas_api.rb', line 83
def valid_page?(page)
page && page.size > 0
end
|