diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/application_controller.rb | 6 | ||||
-rw-r--r-- | app/helpers/agents_helper.rb | 20 | ||||
-rw-r--r-- | app/jobs/agency_watcher_job.rb | 60 |
3 files changed, 25 insertions, 61 deletions
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5299f54..1eff1a9 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -10,14 +10,18 @@ class ApplicationController < ActionController::Base protected include ApplicationHelper + include AgentsHelper + # Set current agent globally def current_agent - @current_agent = Agent.find_by(name: session[:current_agent] || current_user.presence&.agents&.first&.name || 'incommon') + @current_agent = Agent.find_by(name: current_agent_name) end helper_method :current_agent + # Set current user globally def current_user @current_user ||= User.find_by(external_id: session[:current_user]) if session[:current_user].present? end helper_method :current_user + end diff --git a/app/helpers/agents_helper.rb b/app/helpers/agents_helper.rb index bbaeeca..3ecfd73 100644 --- a/app/helpers/agents_helper.rb +++ b/app/helpers/agents_helper.rb @@ -3,4 +3,24 @@ # SPDX-License-Identifier: AGPL-3.0-or-later module AgentsHelper + DEFAULT_AGENT_UUID = "154cd5a4-3341-4c5f-8dd3-805c976c2a26".freeze + DEFAULT_AGENT_NAME = 'Anonymous'.freeze + + protected + + # Return the name of the current agent from context + def current_agent_name + session[:current_agent] || current_user.presence&.agents&.first&.name || default_agent_name + end + + # Default Agent for users coming from unknown sources + # This agent uses a different database for writing resources + def default_agent + @default_agent ||= Agent.find_by(uuid: DEFAULT_AGENT_UUID) # Anonymous + end + + # Return the name of the default + def default_agent_name + DEFAULT_AGENT_NAME + end end diff --git a/app/jobs/agency_watcher_job.rb b/app/jobs/agency_watcher_job.rb deleted file mode 100644 index 23266e8..0000000 --- a/app/jobs/agency_watcher_job.rb +++ /dev/null @@ -1,60 +0,0 @@ -# SPDX-FileCopyrightText: 2020 IN COMMON Collective <collective@incommon.cc> -# -# SPDX-License-Identifier: AGPL-3.0-or-later - -# frozen_string_literal: true - -# = AgencyWatcherJob -# -# This job performs checks on existing records for the given user and group -# names and updates Agencies accordingly. -# -# @param user (User) currently logged in user -# @param groups (Array) a list of group names -# -class AgencyWatcherJob < ApplicationJob - queue_as :default - - def perform(user, groups) - # Check groups against user agents - existing_agents = Agent.where(name: groups) - existing_agent_names = existing_agents.map(&:name) - - groups.each do |g| - # Only work with existing agents - next unless existing_agent_names.include?(g) - - a = existing_agents.select { |a| a.name = g }.first - - Rails.logger.debug("AgencyWatcher checking roles for %s in %s" % [user.username, g]) - # Check if user is a group owner - r = a.agencies.find_or_create_by(user: user) - if !r.leader? && is_group_owner?(g, user.username) - Rails.logger.debug("AgencyWatcher: grant leader to %s in %s" % [user.username, g]) - # Grant leader - r.grant(:leader) - # Grant maintainer - r.grant(:maintainer) - elsif r.roles == 0 - # No role: grant editor - Rails.logger.debug("AgencyWatcher: grant editor to %s in %s" % [user.username, g]) - r.grant(:observer) - else - # No change - Rails.logger.debug("AgencyWatcher: %s's roles in %s are %s" % [user.username, g, r.bitfield_values(:roles)]) - end - end - end - - private - - # Connect to Discourse and check whether current user is a group owner - def is_group_owner?(group, username) - c = ::DiscourseApi::Client.new('https://talk.incommon.cc') - c.api_key = Rails.application.credentials.talk_api_key - c.api_username = username - - group = c.group(group) - group['group']['is_group_owner'] == true - end -end |