aboutsummaryrefslogtreecommitdiff
path: root/app/jobs/agency_watcher_job.rb
diff options
context:
space:
mode:
authorhellekin <hellekin@cepheide.org>2021-02-02 23:13:58 +0100
committerhellekin <hellekin@cepheide.org>2021-02-02 23:13:58 +0100
commitb5739232a535f89b48b54ee52ea7d9bb59f8a46f (patch)
tree189ce7ebf48371b29def0fddc7c2e41e7cfa38bd /app/jobs/agency_watcher_job.rb
parent8e404c4f3cf7880681b6f4cdf3c378e084ad54d2 (diff)
downloadincommon-map-b5739232a535f89b48b54ee52ea7d9bb59f8a46f.tar.gz
Introduce an Anonymous Agent
Since we moved away from Roles it's important to maintain a default Agent that is distinct from the previous default IN COMMON Agent. Previously, a user without a proper group would be granted the `observer` role in the default Agent, enough to create new resources. Now, we consider anonymous users to be part of the Anonymous Agent, which also brings the possibility for them to edit yet to be accepted Resources.
Diffstat (limited to 'app/jobs/agency_watcher_job.rb')
-rw-r--r--app/jobs/agency_watcher_job.rb60
1 files changed, 0 insertions, 60 deletions
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