mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-16 16:01:41 +00:00
70 lines
1.8 KiB
Ruby
70 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Controlador para gestionar colaboraciones abiertas
|
|
#
|
|
# No necesitamos autenticación aun
|
|
class CollaborationsController < ApplicationController
|
|
include Pundit
|
|
|
|
def collaborate
|
|
@site = Site.find_by_name(params[:site_id])
|
|
authorize Collaboration.new(@site)
|
|
|
|
@invitade = current_usuarie || @site.usuaries.build
|
|
end
|
|
|
|
# Aceptar una colaboración tiene varios pasos
|
|
#
|
|
# * Si le usuarie no existe, hay que crearle
|
|
#
|
|
# * Si le usuarie existe, hay que darle un rol si no lo tiene
|
|
#
|
|
# * Si le usuarie existe y no está logueade, pedirle la contraseña
|
|
def accept_collaboration
|
|
@site = Site.find_by_name(params[:site_id])
|
|
authorize Collaboration.new(@site)
|
|
|
|
@invitade = current_usuarie
|
|
@invitade ||= logged_out_invitade
|
|
|
|
# Salir si no se pudo validar le invitade
|
|
return if @invitade == false
|
|
|
|
Usuarie.transaction do
|
|
# Si la cuenta no existe, crearla
|
|
@invitade ||= Usuarie.create(invitade_params)
|
|
# Y asignar un rol si no existe
|
|
unless @invitade.rol_for_site(@site)
|
|
@site.roles << Rol.create(site: @site, usuarie: @invitade,
|
|
temporal: false, rol: 'invitade')
|
|
end
|
|
|
|
sign_in :usuarie, @invitade unless current_usuarie
|
|
|
|
redirect_to site_path(@site)
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def invitade_params
|
|
params.require(:usuarie).permit(:email, :password)
|
|
end
|
|
|
|
def logged_out_invitade
|
|
invitade = Usuarie.find_by_email(invitade_params[:email])
|
|
return unless invitade
|
|
|
|
# Si la contraseña no es válida, volver atrás
|
|
if invitade.can_sign_in? invitade_params[:password]
|
|
invitade
|
|
else
|
|
invitade.increment_and_lock!
|
|
|
|
flash[:warning] = I18n.t('collaborations.password.incorrect')
|
|
redirect_to site_collaborate_path(@site)
|
|
|
|
false
|
|
end
|
|
end
|
|
end
|