Class: CanvasOauth::CanvasApi

Inherits:
Object
  • Object
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

Constructor Details

#initialize(id, canvas_url, canvas_user_id, canvas_root_account_id, token, refresh_token, key, secret) ⇒ CanvasApi

Returns a new instance of CanvasApi.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/canvas_oauth/canvas_api.rb', line 9

def initialize(id, canvas_url, canvas_user_id, , token, refresh_token, key, secret)
  unless [key, secret].all?(&:present?)
    raise "Invalid Qalam oAuth configuration"
  end

  self.id = id
  self.refresh_token = refresh_token
  self.canvas_url = canvas_url
  self.canvas_user_id = canvas_user_id
  self. = 
  self.token = token
  self.key = key
  self.secret = secret
end

Instance Attribute Details

#canvas_root_account_idObject

Returns the value of attribute canvas_root_account_id.



7
8
9
# File 'lib/canvas_oauth/canvas_api.rb', line 7

def 
  @canvas_root_account_id
end

#canvas_urlObject

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

#canvas_user_idObject

Returns the value of attribute canvas_user_id.



7
8
9
# File 'lib/canvas_oauth/canvas_api.rb', line 7

def canvas_user_id
  @canvas_user_id
end

#idObject

Returns the value of attribute id.



7
8
9
# File 'lib/canvas_oauth/canvas_api.rb', line 7

def id
  @id
end

#keyObject

Returns the value of attribute key.



6
7
8
# File 'lib/canvas_oauth/canvas_api.rb', line 6

def key
  @key
end

#refresh_tokenObject

Returns the value of attribute refresh_token.



6
7
8
# File 'lib/canvas_oauth/canvas_api.rb', line 6

def refresh_token
  @refresh_token
end

#secretObject

Returns the value of attribute secret.



6
7
8
# File 'lib/canvas_oauth/canvas_api.rb', line 6

def secret
  @secret
end

#tokenObject

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



59
60
61
# File 'lib/canvas_oauth/canvas_api.rb', line 59

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



96
97
98
# File 'lib/canvas_oauth/canvas_api.rb', line 96

def authenticated_get(*params)
  authenticated_request(:get, *params)
end

#authenticated_post(*params) ⇒ Object



100
101
102
# File 'lib/canvas_oauth/canvas_api.rb', line 100

def authenticated_post(*params)
  authenticated_request(:post, *params)
end

#authenticated_put(*params) ⇒ Object



104
105
106
# File 'lib/canvas_oauth/canvas_api.rb', line 104

def authenticated_put(*params)
  authenticated_request(:put, *params)
end

#authenticated_request(method, *params) ⇒ Object

START AUTH ###



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/canvas_oauth/canvas_api.rb', line 25

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 refresh_token
      get_access_token_by_refresh_token
      authenticated_request(method, *params)
    else
      if response.headers['WWW-Authenticate'].present?
        raise CanvasApi::Authenticate
      else
        raise CanvasApi::Unauthorized
      end
    end
  else
    return response
  end
end

#course_account_id(course_id, params = {}) ⇒ Object



321
322
323
324
# File 'lib/canvas_oauth/canvas_api.rb', line 321

def (course_id, params={})
  course = get_course(course_id)
  course['account_id'] if course
end

#course_root_account_id(course_id, params = {}) ⇒ Object



334
335
336
# File 'lib/canvas_oauth/canvas_api.rb', line 334

def (course_id, params={})
  ((course_id))
end

#create_assignment(course_id, params = {}) ⇒ Object



305
306
307
# File 'lib/canvas_oauth/canvas_api.rb', line 305

def create_assignment(course_id, params={})
  authenticated_post "/api/v1/courses/#{course_id}/assignments", { body: { assignment: params } }
end

#get_access_token(code) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/canvas_oauth/canvas_api.rb', line 67

def get_access_token(code)
  params = {
    body: {
      client_id: key,
      client_secret: secret,
      code: code
    }
  }
  
  response = self.class.post '/login/oauth2/token', params
  self.refresh_token = response['refresh_token']
  self.token = response['access_token']
end

#get_access_token_by_refresh_tokenObject



81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/canvas_oauth/canvas_api.rb', line 81

def get_access_token_by_refresh_token
  params = {
    body: {
      grant_type: 'refresh_token',
      client_id: key,
      client_secret: secret,
      refresh_token: refresh_token
    }
  }
  
  response = self.class.post '/login/oauth2/token', params
  self.token = response['access_token']
  CanvasOauth::Authorization.update_token(refresh_token, token)
end

#get_account(account_id, params = {}) ⇒ Object



237
238
239
# File 'lib/canvas_oauth/canvas_api.rb', line 237

def (, params={})
  authenticated_get "/api/v1/accounts/#{}"
end

#get_account_courses(account_id, params = {}) ⇒ Object



245
246
247
# File 'lib/canvas_oauth/canvas_api.rb', line 245

def (, params={})
  paginated_get "/api/v1/accounts/#{}/courses"
end

#get_account_sub_accounts(account_id, params = {}) ⇒ Object



241
242
243
# File 'lib/canvas_oauth/canvas_api.rb', line 241

def (, params={})
  paginated_get "/api/v1/accounts/#{}/sub_accounts", { query: { :recursive => true } }
end

#get_account_users(account_id, params = {}) ⇒ Object



249
250
251
# File 'lib/canvas_oauth/canvas_api.rb', line 249

def (, params={})
  paginated_get "/api/v1/accounts/#{}/users"
end

#get_accounts_provisioning_report(account_id, params = {}) ⇒ Object



229
230
231
# File 'lib/canvas_oauth/canvas_api.rb', line 229

def get_accounts_provisioning_report(, params={})
  get_report(, :provisioning_csv, 'parameters[accounts]' => true)
end

#get_all_course_users(course_id, params = {}) ⇒ Object



269
270
271
# File 'lib/canvas_oauth/canvas_api.rb', line 269

def get_all_course_users(course_id, params={})
  paginated_get "/api/v1/courses/#{course_id}/users", { query: {enrollment_state: ["active","invited","rejected","completed","inactive"] } }
end

#get_assignment(course_id, assignment_id, params = {}) ⇒ Object



297
298
299
# File 'lib/canvas_oauth/canvas_api.rb', line 297

def get_assignment(course_id, assignment_id, params={})
  authenticated_get "/api/v1/courses/#{course_id}/assignments/#{assignment_id}"
end

#get_assignments(course_id, params = {}) ⇒ Object



293
294
295
# File 'lib/canvas_oauth/canvas_api.rb', line 293

def get_assignments(course_id, params={})
  paginated_get "/api/v1/courses/#{course_id}/assignments"
end

#get_canvas_user_profile(params = {}) ⇒ Object

get_canvas_user_profile get_course_active_pages update_external_tool_nav get_school_details get_school_grades get_school_grade get_school_class_rooms get_school_class_room get_school_subjects get_school_subject get_students_by_grade get_students_by_class_room



353
354
355
# File 'lib/canvas_oauth/canvas_api.rb', line 353

def (params={})
  authenticated_get "/api/v1/users/#{canvas_user_id}/profile"
end

#get_course(course_id, params = {}) ⇒ Object



253
254
255
# File 'lib/canvas_oauth/canvas_api.rb', line 253

def get_course(course_id, params={})
  authenticated_get "/api/v1/courses/#{course_id}"
end

#get_course_active_pages(course_id, publish = nil, params = {}) ⇒ Object



357
358
359
360
361
362
363
# File 'lib/canvas_oauth/canvas_api.rb', line 357

def get_course_active_pages(course_id, publish=nil, params={})
  unless publish.nil?
    paginated_get "/api/v1/courses/#{course_id}/pages?published=#{publish}&sort=created_at&order=desc", params
  else
    paginated_get "/api/v1/courses/#{course_id}/pages?sort=created_at&order=desc", params
  end
end

#get_course_active_students(course_id, params = {}) ⇒ Object



281
282
283
# File 'lib/canvas_oauth/canvas_api.rb', line 281

def get_course_active_students(course_id, params={})
  paginated_get "/api/v1/courses/#{course_id}/active_users"
end

#get_course_students(course_id, params = {}) ⇒ Object



277
278
279
# File 'lib/canvas_oauth/canvas_api.rb', line 277

def get_course_students(course_id, params={})
  paginated_get "/api/v1/courses/#{course_id}/students"
end

#get_course_teachers_and_tas(course_id, params = {}) ⇒ Object



273
274
275
# File 'lib/canvas_oauth/canvas_api.rb', line 273

def get_course_teachers_and_tas(course_id, params={})
  paginated_get "/api/v1/courses/#{course_id}/users", { query: { enrollment_type: ['teacher', 'ta'] } }
end

#get_course_users(course_id, params = {}) ⇒ Object



265
266
267
# File 'lib/canvas_oauth/canvas_api.rb', line 265

def get_course_users(course_id, params={})
  paginated_get "/api/v1/courses/#{course_id}/users"
end

#get_courses(params = {}) ⇒ Object



233
234
235
# File 'lib/canvas_oauth/canvas_api.rb', line 233

def get_courses(params={})
  paginated_get "/api/v1/courses"
end

#get_file(file_id, params = {}) ⇒ Object



225
226
227
# File 'lib/canvas_oauth/canvas_api.rb', line 225

def get_file(file_id, params={})
  authenticated_get "/api/v1/files/#{file_id}"
end

#get_report(account_id, report_type, params = {}) ⇒ Object

get_report get_file get_accounts_provisioning_report get_courses get_account get_account_sub_accounts get_account_courses get_account_users get_course get_section_enrollments get_user_enrollments get_course_users get_all_course_users get_course_teachers_and_tas get_course_students get_course_active_students get_section get_sections get_assignments get_assignment get_user_profile create_assignment update_assignment grade_assignment get_submission course_account_id root_account_id course_root_account_id



208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/canvas_oauth/canvas_api.rb', line 208

def get_report(, report_type, params={})
  report = authenticated_post("/api/v1/accounts/#{}/reports/#{report_type}", { body: params })
  report = authenticated_get "/api/v1/accounts/#{}/reports/#{report_type}/#{report['id']}"
  while (report['status'] == 'created' || report['status'] == 'running')
    sleep(4)
    report = authenticated_get "/api/v1/accounts/#{}/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_school_class_room(class_room_id, account_id = @canvas_root_account_id, params = {}) ⇒ Object



407
408
409
410
# File 'lib/canvas_oauth/canvas_api.rb', line 407

def get_school_class_room(class_room_id, =@canvas_root_account_id, params={})
   ||= @canvas_root_account_id
  authenticated_get "/api/v1/accounts/#{}/school_class_rooms/#{class_room_id}", params
end

#get_school_class_rooms(account_id = @canvas_root_account_id, params = {}) ⇒ Object



402
403
404
405
# File 'lib/canvas_oauth/canvas_api.rb', line 402

def get_school_class_rooms(=@canvas_root_account_id, params={})
   ||= @canvas_root_account_id
  paginated_get "/api/v1/accounts/#{}/school_class_rooms", params
end

#get_school_details(account_id = @canvas_root_account_id, params = {}) ⇒ Object



377
378
379
380
# File 'lib/canvas_oauth/canvas_api.rb', line 377

def get_school_details(=@canvas_root_account_id, params={})
   ||= @canvas_root_account_id
  authenticated_get "/api/v1/accounts/#{}/school_details"
end

#get_school_grade(grade_id, account_id = @canvas_root_account_id, params = {}) ⇒ Object



387
388
389
390
# File 'lib/canvas_oauth/canvas_api.rb', line 387

def get_school_grade(grade_id, =@canvas_root_account_id, params={})
   ||= @canvas_root_account_id
  authenticated_get "/api/v1/accounts/#{}/school_grades/#{grade_id}", params
end

#get_school_grades(account_id = @canvas_root_account_id, params = {}) ⇒ Object



382
383
384
385
# File 'lib/canvas_oauth/canvas_api.rb', line 382

def get_school_grades(=@canvas_root_account_id, params={})
   ||= @canvas_root_account_id
  paginated_get "/api/v1/accounts/#{}/school_grades", params
end

#get_school_subject(subject_id, account_id = @canvas_root_account_id, params = {}) ⇒ Object



397
398
399
400
# File 'lib/canvas_oauth/canvas_api.rb', line 397

def get_school_subject(subject_id, =@canvas_root_account_id, params={})
   ||= @canvas_root_account_id
  authenticated_get "/api/v1/accounts/#{}/school_subjects/#{subject_id}", params
end

#get_school_subjects(account_id = @canvas_root_account_id, params = {}) ⇒ Object



392
393
394
395
# File 'lib/canvas_oauth/canvas_api.rb', line 392

def get_school_subjects(=@canvas_root_account_id, params={})
   ||= @canvas_root_account_id
  paginated_get "/api/v1/accounts/#{}/school_subjects", params
end

#get_section(section_id, params = {}) ⇒ Object



285
286
287
# File 'lib/canvas_oauth/canvas_api.rb', line 285

def get_section(section_id, params={})
  authenticated_get "/api/v1/sections/#{section_id}"
end

#get_section_enrollments(section_id, params = {}) ⇒ Object



257
258
259
# File 'lib/canvas_oauth/canvas_api.rb', line 257

def get_section_enrollments(section_id, params={})
  paginated_get "/api/v1/sections/#{section_id}/enrollments"
end

#get_sections(course_id, params = {}) ⇒ Object



289
290
291
# File 'lib/canvas_oauth/canvas_api.rb', line 289

def get_sections(course_id, params={})
  paginated_get "/api/v1/courses/#{course_id}/sections", { query: { :include => ['students', 'avatar_url', 'enrollments'] } }
end

#get_students_by_class_room(class_room_id, account_id = @canvas_root_account_id, params = {}) ⇒ Object



417
418
419
420
# File 'lib/canvas_oauth/canvas_api.rb', line 417

def get_students_by_class_room(class_room_id, =@canvas_root_account_id, params={})
   ||= @canvas_root_account_id
  paginated_get "/api/v1/accounts/#{}/class_room_students/#{class_room_id}", params
end

#get_students_by_grade(grade_id, account_id = @canvas_root_account_id, params = {}) ⇒ Object



412
413
414
415
# File 'lib/canvas_oauth/canvas_api.rb', line 412

def get_students_by_grade(grade_id, =@canvas_root_account_id, params={})
   ||= @canvas_root_account_id
  paginated_get "/api/v1/accounts/#{}/grade_students/#{grade_id}", params
end

#get_submission(course_id, assignment_id, user_id, params = {}) ⇒ Object



317
318
319
# File 'lib/canvas_oauth/canvas_api.rb', line 317

def get_submission(course_id, assignment_id, user_id, params={})
  authenticated_get "/api/v1/courses/#{course_id}/assignments/#{assignment_id}/submissions/#{user_id}"
end

#get_user_enrollments(user_id, params = {}) ⇒ Object



261
262
263
# File 'lib/canvas_oauth/canvas_api.rb', line 261

def get_user_enrollments(user_id, params={})
  paginated_get "/api/v1/users/#{user_id}/enrollments"
end

#get_user_profile(user_id, params = {}) ⇒ Object



301
302
303
# File 'lib/canvas_oauth/canvas_api.rb', line 301

def (user_id, params={})
  authenticated_get "/api/v1/users/#{user_id}/profile"
end

#grade_assignment(course_id, assignment_id, user_id, params = {}) ⇒ Object



313
314
315
# File 'lib/canvas_oauth/canvas_api.rb', line 313

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



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/canvas_oauth/canvas_api.rb', line 159

def hash_csv(csv_string)
  require 'csv'

  csv = csv_string.is_a?(String) ? CSV.parse(csv_string) : csv_string
  headers = csv.shift
  output = []

  csv.each do |row|
    hash = {}
    headers.each do |header|
      hash[header] = row.shift.to_s
    end
    output << hash
  end

  return output
end

#hex_sis_id(name, value) ⇒ Object



149
150
151
152
# File 'lib/canvas_oauth/canvas_api.rb', line 149

def hex_sis_id(name, value)
  hex = value.unpack("H*")[0]
  return "hex:#{name}:#{hex}"
end

#paginated_get(url, params = {}) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/canvas_oauth/canvas_api.rb', line 108

def paginated_get(url, params={})
  params[:query] ||= {}
  params[:query][:per_page] ||= PER_PAGE
  params[:query][:page] ||= 1
  all_pages = []

  if params[:current_page]
    current_page = authenticated_get(url, params)
    all_pages.concat(current_page) if valid_page?(current_page)
  else
    while url && current_page = authenticated_get(url, params) do
      all_pages.concat(current_page) if valid_page?(current_page)

      links = LinkHeader.parse(current_page.headers['link'])
      url = links.find_link(["rel", "next"]).try(:href)
      params[:query] = nil if params[:query]
    end
  end

  all_pages
end

#qalam_auth_url(qalam_url, redirect_uri, oauth2_state) ⇒ Object



63
64
65
# File 'lib/canvas_oauth/canvas_api.rb', line 63

def qalam_auth_url(qalam_url, redirect_uri, oauth2_state)
  "#{qalam_url}/login/oauth2/auth?client_id=#{key}&response_type=code&state=#{oauth2_state}&redirect_uri=#{redirect_uri}"
end

#root_account_id(account_id, params = {}) ⇒ Object



326
327
328
329
330
331
332
# File 'lib/canvas_oauth/canvas_api.rb', line 326

def (, params={})
  if  &&  = ()
    root_id = ['root_account_id']
  end

  root_id || 
end

#update_assignment(course_id, assignment_id, params = {}) ⇒ Object



309
310
311
# File 'lib/canvas_oauth/canvas_api.rb', line 309

def update_assignment(course_id, assignment_id, params={})
  authenticated_put "/api/v1/courses/#{course_id}/assignments/#{assignment_id}", { body: { assignment: params } }
end

#update_external_tool_nav(external_tool_url, tool_id, publish, type, account_id = @canvas_root_account_id, params = {}) ⇒ Object



365
366
367
368
369
370
371
372
373
374
375
# File 'lib/canvas_oauth/canvas_api.rb', line 365

def update_external_tool_nav(external_tool_url, tool_id, publish, type, =@canvas_root_account_id, params={})
   ||= @canvas_root_account_id
  if type == 'account'
    body = {"account_navigation"=>{"enabled"=>"#{publish}"},
    "tool_id"=>tool_id, "external_tool_url"=>external_tool_url}
  elsif type == 'course'
    body = {"course_navigation"=>{"enabled"=>"#{publish}"},
    "tool_id"=>tool_id, "external_tool_url"=>external_tool_url}
  end
  authenticated_put "/api/v1/accounts/#{}/external_tools_url", { body: body } if body
end

#valid_page?(page) ⇒ Boolean

Returns:

  • (Boolean)


154
155
156
# File 'lib/canvas_oauth/canvas_api.rb', line 154

def valid_page?(page)
  page && page.size > 0
end