class OneRoster::Client

Attributes

api_url[RW]
app_id[RW]
app_secret[RW]
app_token[RW]
authenticated[R]
logger[RW]
oauth_strategy[RW]
staff_username_source[RW]
username_source[RW]
vendor_key[RW]

Public Class Methods

configure() { |client| ... } click to toggle source
# File lib/one_roster/client.rb, line 16
def self.configure
  client = new
  yield(client) if block_given?
  client
end
new(oauth_strategy = 'oauth') click to toggle source
# File lib/one_roster/client.rb, line 11
def initialize(oauth_strategy = 'oauth')
  @authenticated = false
  @oauth_strategy = oauth_strategy
end

Public Instance Methods

authenticate() click to toggle source
# File lib/one_roster/client.rb, line 103
def authenticate
  return if authenticated?

  if oauth_strategy == 'oauth2'
    response = token

    fail ConnectionError, response.raw_body unless response.success?

    set_auth_headers(response.raw_body, response.headers['set-cookie'])
  else
    response = connection.execute(TEACHERS_ENDPOINT, :get, limit: 1)

    fail ConnectionError, response.raw_body unless response.success?
  end

  @authenticated = true
end
authenticated?() click to toggle source
# File lib/one_roster/client.rb, line 121
def authenticated?
  @authenticated
end
classrooms(course_codes = []) click to toggle source
# File lib/one_roster/client.rb, line 38
def classrooms(course_codes = [])
  authenticate

  oneroster_classes = classes

  terms_hash = terms.each_with_object({}) { |term, terms| terms[term.uid] = term }

  courses = courses(course_codes, oneroster_classes)

  oneroster_classes.each_with_object([]) do |oneroster_class, oneroster_classes|
    course = courses.find { |course| course.uid == oneroster_class.course_uid }
    next unless course

    term = terms_hash[oneroster_class.term_id]

    oneroster_classes << Types::Classroom.new(
      'id' => oneroster_class.uid,
      'name' => oneroster_class.title,
      'course_number' => course.course_code,
      'period' => oneroster_class.period,
      'grades' => oneroster_class.grades,
      'subjects' => oneroster_class.subjects,
      'term_name' => term&.name,
      'term_start_date' => term&.start_date,
      'term_end_date' => term&.end_date
    )
  end
end
connection() click to toggle source
# File lib/one_roster/client.rb, line 125
def connection
  @connection ||= Connection.new(self, oauth_strategy)
end
courses(course_codes = [], oneroster_classes = classes) click to toggle source
# File lib/one_roster/client.rb, line 77
def courses(course_codes = [], oneroster_classes = classes)
  authenticate

  class_course_numbers = oneroster_classes.map(&:course_uid)

  courses = Paginator.fetch(
    connection,
    COURSES_ENDPOINT,
    :get,
    Types::Course,
    client: self
  ).force

  parse_courses(courses, course_codes, class_course_numbers)
end
enrollments(classroom_uids = []) click to toggle source
# File lib/one_roster/client.rb, line 93
def enrollments(classroom_uids = [])
  authenticate

  enrollments = parse_enrollments(classroom_uids)

  p "Found #{enrollments.values.flatten.length} enrollments."

  enrollments
end
set_auth_headers(token, cookie) click to toggle source
# File lib/one_roster/client.rb, line 133
def set_auth_headers(token, cookie)
  connection.set_auth_headers(token['access_token'], cookie)
end
terms() click to toggle source
# File lib/one_roster/client.rb, line 67
def terms
  authenticate

  endpoint = OneRoster::ACADEMIC_SESSIONS_ENDPOINT

  type = Types::Term

  Paginator.fetch(connection, endpoint, :get, type, client: self).force
end
token() click to toggle source
# File lib/one_roster/client.rb, line 129
def token
  connection.execute("#{api_url}/token", :post)
end

Private Instance Methods

parse_courses(courses, course_codes, course_numbers) click to toggle source
# File lib/one_roster/client.rb, line 155
def parse_courses(courses, course_codes, course_numbers)
  courses.select do |course|
    in_course_numbers = course_numbers.include?(course.uid)

    if course_codes.any?
      course_codes.include?(course.course_code) && in_course_numbers
    else
      in_course_numbers
    end
  end
end
parse_enrollments(classroom_uids = []) click to toggle source
# File lib/one_roster/client.rb, line 139
def parse_enrollments(classroom_uids = [])
  enrollments = Paginator.fetch(
    connection,
    ENROLLMENTS_ENDPOINT,
    :get,
    Types::Enrollment,
    client: self
  ).force

  enrollments.each_with_object(teacher: [], student: []) do |enrollment, enrollments|
    next if classroom_uids.any? && !classroom_uids.include?(enrollment.classroom_uid)

    enrollments[enrollment.role.to_sym] << enrollment if enrollment.valid?
  end
end