class CanvasInteractor::CanvasApi

Constants

PER_PAGE

Attributes

canvas_url[R]
key[RW]
secret[RW]
token[RW]

Public Class Methods

new(canvas_url, token, key, secret) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 9
def initialize(canvas_url, token, key, secret)
  self.canvas_url = canvas_url
  self.token = token
  self.key = key
  self.secret = secret
end

Public Instance Methods

auth_url(redirect_uri, oauth2_state) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 219
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) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 114
def authenticated_get(*params)
  authenticated_request(:get, *params)
end
authenticated_post(*params) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 118
def authenticated_post(*params)
  authenticated_request(:post, *params)
end
authenticated_put(*params) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 122
def authenticated_put(*params)
  authenticated_request(:put, *params)
end
authenticated_request(method, *params) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 16
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
canvas_url=(value) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 241
def canvas_url=(value)
  @canvas_url = value
  self.class.base_uri(value)
end
course_account_id(course_id) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 202
def course_account_id(course_id)
  course = get_course(course_id)
  course['account_id'] if course
end
course_root_account_id(course_id) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 215
def course_root_account_id(course_id)
  root_account_id(course_account_id(course_id))
end
create_assignment(course_id, params) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 223
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) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 130
def get_account(account_id)
  authenticated_get "/api/v1/accounts/#{account_id}"
end
get_account_courses(account_id) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 182
def get_assignments(course_id)
  paginated_get "/api/v1/courses/#{course_id}/assignments"
end
get_course(course_id) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 146
def get_course(course_id)
  authenticated_get "/api/v1/courses/#{course_id}"
end
get_course_students(course_id) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 158
def get_course_users(course_id)
  paginated_get "/api/v1/courses/#{course_id}/users"
end
get_courses() click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 126
def get_courses
  paginated_get "/api/v1/courses"
end
get_file(file_id) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/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'] == '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).parsed_response)
  else
    return report
  end
end
get_section(section_id) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 174
def get_section(section_id)
  authenticated_get "/api/v1/sections/#{section_id}"
end
get_section_enrollments(section_id) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 150
def get_section_enrollments(section_id)
  paginated_get "/api/v1/sections/#{section_id}/enrollments"
end
get_sections(course_id) click to toggle source
# File lib/canvas_interactor/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_user_enrollments(user_id) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/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) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 198
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) click to toggle source

Needs to be refactored to somewhere more generic

# File lib/canvas_interactor/canvas_api.rb, line 96
def hash_csv(csv_string)
  require 'csv'

  csv = CSV.parse(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) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 236
def hex_sis_id(name, value)
  hex = value.unpack("H*")[0]
  return "hex:#{name}:#{hex}"
end
paginated_get(*params) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 45
def paginated_get(*params)
  params[1] ||= {}
  params[1][:query] ||= {}
  params[1][:query][:per_page] = PER_PAGE

  all_pages = []

  while params[0] do
    if current_page = authenticated_get(*params)
      all_pages += current_page if valid_page?(current_page)

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

  all_pages
end
root_account_id(account_id) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 207
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
valid_page?(page) click to toggle source
# File lib/canvas_interactor/canvas_api.rb, line 83
def valid_page?(page)
  page && page.size > 0
end