Module: CanvasSync::Concerns::AbilityHelper

Extended by:
ActiveSupport::Concern
Defined in:
lib/canvas_sync/concerns/ability_helper.rb

Defined Under Namespace

Classes: RoleStore

Instance Method Summary collapse

Instance Method Details

#cache_on_session(key, &blk) ⇒ Object



152
153
154
155
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 152

def cache_on_session(key, &blk)
  panda_pal_session[:ability_cache] ||= {}
  panda_pal_session[:ability_cache][key] ||= blk.call
end

#canvas_account_role_labels(account = 'self') ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 38

def ( = 'self')
   = 'self' if .to_s == "root"
   = .canvas_id if .respond_to?(:canvas_id)

  if "::Admin".safe_constantize && ::Admin < ::ActiveRecord::Base
     = current_organization. if  == 'self'
    adm_query = ::Admin.where(canvas_account_id: , workflow_state: "active")
    adm_query.pluck(:role_name)
  else
    Rails.cache.fetch([self.class.name, "AccountAdminLinks", , canvas_user_id], expires_in: 1.hour) do
      admin_entries = canvas_sync_client.(, user_id: [canvas_user_id])
      admin_entries = admin_entries.select{|ent| ent[:workflow_state] == 'active' }
      admin_entries.map{|ent| ent[:role] }
    end
  end
end

#canvas_account_rolesObject



172
173
174
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 172

def 
  canvas_roles.where(base_role_type: 'AccountMembership')
end

#canvas_course_rolesObject



176
177
178
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 176

def canvas_course_roles
  canvas_roles.where.not(base_role_type: 'AccountMembership')
end

#canvas_permissionsObject

CanvasSync Domain



159
160
161
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 159

def canvas_permissions
  panda_pal_session[:canvas_permissions] ||= ::Role.role_permissions(canvas_roles)
end

#canvas_role_labelsObject



33
34
35
36
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 33

def canvas_role_labels
  labels = get_lti_cust_param('custom_canvas_role')
  labels.is_a?(String) ? labels.split(',') : []
end

#canvas_rolesObject



163
164
165
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 163

def canvas_roles
  @canvas_roles ||= Role.for_labels(canvas_role_labels, )
end

#canvas_root_account_rolesObject



167
168
169
170
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 167

def 
  role_labels = ('self')
  ::Role.for_labels(role_labels, ::Account.find_by(canvas_parent_account_id: nil))
end

#canvas_site_admin?Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 59

def canvas_site_admin?
  lti_roles.system_roles.include?("sys_admin")
end

#canvas_super_user?Boolean

Returns:

  • (Boolean)


180
181
182
183
184
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 180

def canvas_super_user?
  cache_on_session(:canvas_super_user?) do
    canvas_site_admin? || ((:root) & ["AccountAdmin", "Account Admin"]).present?
  end
end

#canvas_user_idObject



186
187
188
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 186

def canvas_user_id
  user&.canvas_id || get_lti_cust_param('canvas_user_id')
end

#get_lti_cust_param(key) ⇒ Object



23
24
25
26
27
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 23

def get_lti_cust_param(key)
  nkey = key.to_s.gsub(/^custom_/, '')

  launch_params.dig("https://purl.imsglobal.org/spec/lti/claim/custom", nkey) || launch_params[nkey] || launch_params["custom_#{nkey}"]
end

#is_lti_launch?Boolean

Returns:

  • (Boolean)


15
16
17
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 15

def is_lti_launch?
  panda_pal_session.present?
end

#launch_accountObject



148
149
150
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 148

def 
  @launch_account ||= launch_context.respond_to?(:account) ? launch_context. : ::Account.find_by(canvas_id: get_lti_cust_param('custom_canvas_account_id'))
end

#launch_contextObject

Middle Domain



136
137
138
139
140
141
142
143
144
145
146
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 136

def launch_context
  @launch_context ||= begin
    if lti_launch_placement == "global_navigation"
      :global
    elsif get_lti_cust_param('custom_canvas_course_id').present?
      ::Course.find_by(canvas_id: get_lti_cust_param('custom_canvas_course_id'))
    else
      ::Account.find_by(canvas_id: get_lti_cust_param('custom_canvas_account_id'))
    end
  end
end

#launch_paramsObject



19
20
21
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 19

def launch_params
  @launch_params ||= panda_pal_session[:launch_params] || {}
end

#lti_launch_placementObject



29
30
31
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 29

def lti_launch_placement
  launch_params['https://www.instructure.com/placement'] || launch_params[:launch_type]
end

#lti_rolesObject



55
56
57
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 55

def lti_roles
  @lti_roles ||= RoleStore.new(launch_params["https://purl.imsglobal.org/spec/lti/claim/roles"] || launch_params['ext_roles'] || '')
end

#panda_pal_sessionObject

PandaPal Domain



7
8
9
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 7

def panda_pal_session
  @panda_pal_session ||= @controller.current_session&.data || {}
end

#rails_sessionObject



11
12
13
# File 'lib/canvas_sync/concerns/ability_helper.rb', line 11

def rails_session
  @rails_session ||= @controller.session
end