Class: AtomicLti::Services::LineItems

Inherits:
Base
  • Object
show all
Defined in:
app/lib/atomic_lti/services/line_items.rb

Overview

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#get_next_url, #headers, #initialize, #logged_service_call, #service_delete, #service_get, #service_post, #service_put

Constructor Details

This class inherits a constructor from AtomicLti::Services::Base

Class Method Details

.can_manage_line_items?(id_token_decoded) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
57
# File 'app/lib/atomic_lti/services/line_items.rb', line 54

def self.can_manage_line_items?(id_token_decoded)
  id_token_decoded.dig(AtomicLti::Definitions::AGS_CLAIM, "scope")&.
    include?(AtomicLti::Definitions::AGS_SCOPE_LINE_ITEM)
end

.can_query_line_items?(id_token_decoded) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
62
63
# File 'app/lib/atomic_lti/services/line_items.rb', line 59

def self.can_query_line_items?(id_token_decoded)
  can_manage_line_items?(id_token_decoded) ||
    id_token_decoded.dig(AtomicLti::Definitions::AGS_CLAIM, "scope").
      include?(AtomicLti::Definitions::AGS_SCOPE_LINE_ITEM_READONLY)
end

.generate(label:, max_score:, start_date_time: nil, end_date_time: nil, resource_id: nil, tag: nil, resource_link_id: nil, external_tool_url: nil, submission_review: nil) ⇒ Object

Helper method to generate a default set of attributes



18
19
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
48
# File 'app/lib/atomic_lti/services/line_items.rb', line 18

def self.generate(
  label:,
  max_score:,
  start_date_time: nil,
  end_date_time: nil,
  resource_id: nil,
  tag: nil,
  resource_link_id: nil,
  external_tool_url: nil,
  submission_review: nil
)
  attrs = {
    scoreMaximum: max_score,
    label: label,
    resourceId: resource_id,
    tag: tag,
    startDateTime: start_date_time,
    endDateTime: end_date_time,
    resourceLinkId: resource_link_id,
  }.compact
  if external_tool_url
    attrs[AtomicLti::Definitions::CANVAS_SUBMISSION_TYPE] = {
      type: "external_tool",
      external_tool_url: external_tool_url,
    }
  end
  if submission_review
    attrs[:submissionReview] = submission_review
  end
  attrs
end

Instance Method Details

#create(attrs = nil) ⇒ Object



99
100
101
102
103
# File 'app/lib/atomic_lti/services/line_items.rb', line 99

def create(attrs = nil)
  content_type = { "Content-Type" => "application/vnd.ims.lis.v2.lineitem+json" }
  response, = service_post(endpoint(@id_token_decoded), body: JSON.dump(attrs), headers: headers(content_type))
  response
end

#delete(line_item_url) ⇒ Object



113
114
115
116
# File 'app/lib/atomic_lti/services/line_items.rb', line 113

def delete(line_item_url)
  response, = service_delete(line_item_url, headers: headers)
  response
end

#endpoint(id_token_decoded) ⇒ Object



6
7
8
9
10
11
# File 'app/lib/atomic_lti/services/line_items.rb', line 6

def endpoint(id_token_decoded)
  url = id_token_decoded.dig(AtomicLti::Definitions::AGS_CLAIM, "lineitems")
  raise AtomicLti::Exceptions::LineItemError, "Unable to access line items" unless url.present?

  url
end

#generate(attrs) ⇒ Object



50
51
52
# File 'app/lib/atomic_lti/services/line_items.rb', line 50

def generate(attrs)
  self.class.generate(**attrs)
end

#list(query = {}, page_url: nil) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'app/lib/atomic_lti/services/line_items.rb', line 67

def list(query = {}, page_url: nil)
  url = if page_url.present?
          page_url
        else
          uri = Addressable::URI.parse(endpoint(@id_token_decoded))
          uri.query_values = (uri.query_values || {}).merge(query)
          uri.to_str
        end

  accept = { "Accept" => "application/vnd.ims.lis.v2.lineitemcontainer+json" }
  response, = service_get(url, headers: headers(accept))
  response
end

#list_all(query = {}) ⇒ Object



81
82
83
84
85
86
# File 'app/lib/atomic_lti/services/line_items.rb', line 81

def list_all(query = {})
  AtomicLti::PagingHelper.paginate_request do |next_link|
    result_page = list(query, page_url: next_link)
    [JSON.parse(result_page.body), get_next_url(result_page)]
  end
end

#scopesObject



13
14
15
# File 'app/lib/atomic_lti/services/line_items.rb', line 13

def scopes
  @id_token_decoded&.dig(AtomicLti::Definitions::AGS_CLAIM, "scope")
end

#show(line_item_url) ⇒ Object



90
91
92
93
94
# File 'app/lib/atomic_lti/services/line_items.rb', line 90

def show(line_item_url)
  accept = { "Accept" => "application/vnd.ims.lis.v2.lineitem+json" }
  response, = service_get(line_item_url, headers: headers(accept))
  response
end

#update(line_item_url, attrs) ⇒ Object



107
108
109
110
111
# File 'app/lib/atomic_lti/services/line_items.rb', line 107

def update(line_item_url, attrs)
  content_type = { "Content-Type" => "application/vnd.ims.lis.v2.lineitem+json" }
  response, = service_put(line_item_url, body: JSON.dump(attrs), headers: headers(content_type))
  response
end