# frozen_string_literal: true # Controlador de Usuaries class UsuariesController < ApplicationController include Pundit before_action :authenticate_usuarie! # Mostrar todes les usuaries e invitades de un sitio def index @site = find_site site_usuarie = SiteUsuarie.new(@site, current_usuarie) authorize site_usuarie @policy = policy(site_usuarie) end # Desasociar une usuarie de un sitio def destroy @site = find_site authorize SiteUsuarie.new(@site, current_usuarie) @usuarie = Usuarie.find(params[:id]) @usuarie.sites.delete(@site) redirect_to site_usuaries_path end # Convertir une usuarie en invitade def demote @site = find_site authorize SiteUsuarie.new(@site, current_usuarie) @usuarie = Usuarie.find(params[:usuarie_id]) @usuarie.sites.delete(@site) @site.invitades << @usuarie redirect_to site_usuaries_path end # Convertir invitade en usuarie def promote @site = find_site authorize SiteUsuarie.new(@site, current_usuarie) @usuarie = Usuarie.find(params[:usuarie_id]) @usuarie.sites_as_invitade.delete(@site) @site.usuaries << @usuarie redirect_to site_usuaries_path end # Poder invitar def invite @site = find_site site_usuarie = SiteUsuarie.new(@site, current_usuarie) authorize site_usuarie @policy = policy(site_usuarie) end # Envía las invitaciones def send_invitations @site = find_site authorize SiteUsuarie.new(@site, current_usuarie) # Enviar la invitación si es necesario y agregar al sitio # # TODO: Pedir consentimiento para agregar a un sitio! invitaciones.each do |invitacion| # Si la cuenta no existe, envía una invitación por correo usuarie = Usuarie.invite! email: invitacion.address # No invitar al sitio si ya estaba en la lista! next if @site.invitade?(usuarie) || @site.usuarie?(usuarie) @site.roles << Rol.create(usuarie: usuarie, site: @site, temporal: true, rol: invited_as) end redirect_to site_usuaries_path(@site) end private # Traer todas las invitaciones que al menos tengan usuarie y dominio def invitaciones # XXX: Podríamos usar EmailAddress pero hace chequeos más lentos i = params[:invitaciones].split("\n").map do |m| Mail::Address.new m rescue Mail::Field::IncompleteParseError nil end.compact i.select do |m| m.local && m.domain end end # El tipo de invitación que tenemos que enviar, si alguien mandó # cualquier cosa, usamos el privilegio menor. def invited_as if Rol::ROLES.include?(params[:invited_as]) params[:invited_as] else 'invitade' end end end