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(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_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

#keyObject

Returns the value of attribute key.



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

def key
  @key
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



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.headers['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_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_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 ()
  authenticated_get "/api/v1/accounts/#{}"
end

#get_account_courses(account_id) ⇒ Object



138
139
140
# File 'lib/canvas_oauth/canvas_api.rb', line 138

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

#get_account_sub_accounts(account_id) ⇒ Object



134
135
136
# File 'lib/canvas_oauth/canvas_api.rb', line 134

def ()
  paginated_get "/api/v1/accounts/#{}/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 ()
  paginated_get "/api/v1/accounts/#{}/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()
  get_report(, :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_coursesObject



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(, 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_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 (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
  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



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.headers['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 ()
  if  &&  = ()
    root_id = ['root_account_id']
  end

  root_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

Returns:

  • (Boolean)


83
84
85
# File 'lib/canvas_oauth/canvas_api.rb', line 83

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