# SPDX-FileCopyrightText: 2020 IN COMMON Collective # # 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