class Arisaid::Usergroups

Public Class Methods

usergroup_valid_attributes() click to toggle source
# File lib/arisaid/usergroups.rb, line 169
def usergroup_valid_attributes
  %i(
    name
    description
    handle
  )
end

Public Instance Methods

apply() click to toggle source
# File lib/arisaid/usergroups.rb, line 32
def apply
  enabled = false

  local.each do |src|
    dst = remote.find_by(name: src['name'])
    next unless dst.nil?

    group = usergroups_with_disabled.find_by(name: src['name'])
    if group
      enable group
      enabled = true
    end
  end

  remote! if enabled

  if Arisaid.read_only?
    local.each do |src|
      dst = remote.find_by(name: src['name'])

      if dst.nil?
        puts "create usergroup: #{src['name']}"
        puts "  + description: #{src['description']}"
        src['users'].flatten.each do |user|
          puts "  + user #{user}"
        end

        next
      end

      next if same?(src, dst)

      if changed?(src, dst) || users_changed?(src, dst)
        puts "update usergroup: #{src['name']}"
      end

      if users_changed?(src, dst)
        add = src['users'].flatten.sort  - dst['users'].flatten.sort
        delete = dst['users'].flatten.sort - src['users'].flatten.sort
        add.each do |u|
          puts "  + user #{u}"
        end
        delete.each do |u|
          puts "  - user #{u}"
        end
      end
    end

    remote.each do |dst|
      src = local.find_by(name: dst['name'])
      puts "disable #{dst['name']}" if src.nil?
    end
  end

  local.each do |src|
    dst = remote.find_by(name: src['name'])
    case
    when dst.nil? then create src
    when same?(src, dst) then nil
    when changed?(src, dst) then update(src)
    else
      usergroup = usergroups.find_by(name: src['name'])
      update_users(usergroup.id, src)
    end
  end if !(enabled && Arisaid.read_only?)

  remote.each do |dst|
    src = local.find_by(name: dst['name'])
    disable dst if src.nil?
  end

  nil
end
changed?(src, dst) click to toggle source
# File lib/arisaid/usergroups.rb, line 113
def changed?(src, dst)
  !same?(src, dst) && src['users'] == dst['users']
end
create(src) click to toggle source
# File lib/arisaid/usergroups.rb, line 125
def create(src)
  group = client.create_usergroup(
    src.slice(*self.class.usergroup_valid_attributes.map(&:to_s)))
  update_users(group.id, src) if group.respond_to?(:id)
end
description_changed?(src, dst) click to toggle source
# File lib/arisaid/usergroups.rb, line 121
def description_changed?(src, dst)
  src['description'] != dst['description']
end
disable(dst) click to toggle source
# File lib/arisaid/usergroups.rb, line 135
def disable(dst)
  group = usergroups.find_by(name: dst['name'])
  client.disable_usergroup(usergroup: group.id)
end
enable(group) click to toggle source
# File lib/arisaid/usergroups.rb, line 131
def enable(group)
  client.enable_usergroup(usergroup: group.id)
end
remote!() click to toggle source
# File lib/arisaid/usergroups.rb, line 24
def remote!
  @remote = usergroups!.map { |group|
    hash = group.to_h.slice(*self.class.usergroup_valid_attributes)
    hash[:users] = group.users ? group.users.map { |id| users.find_by(id: id).name } : {}
    hash.stringify_keys
  }
end
same?(src, dst) click to toggle source
# File lib/arisaid/usergroups.rb, line 106
def same?(src, dst)
  src['name'] == dst['name'] &&
      src['description'] == dst['description'] &&
      src['handle'] == dst['handle'] &&
      src['users'].flatten.sort == dst['users'].flatten.sort
end
update(src) click to toggle source
# File lib/arisaid/usergroups.rb, line 140
def update(src)
  group = usergroups.find_by(name: src['name'])
  data = src.dup
  data['usergroup'] = group.id
  data.delete('users') unless data['users'].nil?
  client.update_usergroup(data)
end
update_users(group_id, src) click to toggle source
# File lib/arisaid/usergroups.rb, line 148
def update_users(group_id, src)
  data = {
    usergroup: group_id,
    users: usernames_to_ids(src['users']).join(',')
  }
  client.update_usergroup_users(data)
end
usergroups() click to toggle source
# File lib/arisaid/usergroups.rb, line 7
def usergroups
  @usergroups || usergroups!
end
usergroups!() click to toggle source
# File lib/arisaid/usergroups.rb, line 11
def usergroups!
  @usergroups = usergroups_with_disabled!.select { |g| g.deleted_by.nil? }
end
usergroups_with_disabled() click to toggle source
# File lib/arisaid/usergroups.rb, line 15
def usergroups_with_disabled
  @usergroups_with_disabled || usergroups_with_disabled!
end
usergroups_with_disabled!() click to toggle source
# File lib/arisaid/usergroups.rb, line 19
def usergroups_with_disabled!
  @usergroups_with_disabled =
    client.usergroups(include_users: 1, include_disabled: 1)
end
usernames_to_ids(usernames) click to toggle source
# File lib/arisaid/usergroups.rb, line 156
def usernames_to_ids(usernames)
  usernames.each.with_object([]) do |username, memo|
    user = users.find_by(name: username)
    if user
      memo << user.id
    else
      puts "#{'user not found:'.colorize(:red)} #{username}"
      Arisaid.exit_status = 1
    end
  end
end
users_changed?(src, dst) click to toggle source
# File lib/arisaid/usergroups.rb, line 117
def users_changed?(src, dst)
  src['users'].flatten.sort != dst['users'].flatten.sort
end