empezar a migrar a roles, que nos permiten otras cosas

This commit is contained in:
f 2019-07-05 21:21:49 -03:00
parent 64fcf61c67
commit e485971940
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
9 changed files with 68 additions and 9 deletions

View file

@ -74,9 +74,10 @@ class UsuariesController < ApplicationController
usuarie = Usuarie.invite! email: invitacion.address
# No invitar al sitio si ya estaba en la lista!
unless @site.invitade?(usuarie) || @site.usuarie?(usuarie)
@site.send(invited_as) << usuarie
end
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)
@ -101,9 +102,10 @@ class UsuariesController < ApplicationController
# El tipo de invitación que tenemos que enviar, si alguien mandó
# cualquier cosa, usamos el privilegio menor.
def invited_as
invited_as = params[:invited_as].try(:to_sym)
invited_as = :invitades unless %i[usuaries invitades].include?(invited_as)
invited_as
if Rol::ROLES.include?(params[:invited_as])
params[:invited_as]
else
'invitade'
end
end
end

14
app/models/rol.rb Normal file
View file

@ -0,0 +1,14 @@
# frozen_string_literal: true
# Define el rol que tiene una usuaria en un sitio
#
# Un rol puede ser temporal, es decir que aun no se ha aceptado y
# necesita del consentimiento de le usuarie :)
class Rol < ApplicationRecord
ROLES = %w[usuarie invitade].freeze
belongs_to :usuarie
belongs_to :site
validates_inclusion_of :rol, in: ROLES
end

View file

@ -7,6 +7,7 @@ class Site < ApplicationRecord
friendly_id :name, use: %i[finders]
has_many :roles
has_and_belongs_to_many :usuaries, class_name: 'Usuarie'
has_and_belongs_to_many :invitades, class_name: 'Usuarie',
join_table: 'invitades_sites'

View file

@ -8,6 +8,7 @@ class Usuarie < ApplicationRecord
validates_uniqueness_of :email
has_many :roles
has_and_belongs_to_many :sites
has_and_belongs_to_many :sites_as_invitade,
class_name: 'Site',

View file

@ -15,7 +15,7 @@
.row
.col
= form_with url: site_usuaries_invite_path(@site) do |f|
= f.hidden_field :invite_as, value: params[:invite_as]
= f.hidden_field :invited_as, value: params[:invite_as].singularize
.form-group
= f.label :invitaciones do
= t('.invitaciones')

View file

@ -7,6 +7,8 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.singular 'invitades', 'invitade'
inflect.plural 'usuarie', 'usuaries'
inflect.singular 'usuaries', 'usuarie'
inflect.plural 'rol', 'roles'
inflect.singular 'roles', 'rol'
end
ActiveSupport::Inflector.inflections(:es) do |inflect|
@ -16,4 +18,6 @@ ActiveSupport::Inflector.inflections(:es) do |inflect|
inflect.singular 'invitades', 'invitade'
inflect.plural 'usuarie', 'usuaries'
inflect.singular 'usuaries', 'usuarie'
inflect.plural 'rol', 'roles'
inflect.singular 'roles', 'rol'
end

View file

@ -0,0 +1,17 @@
# frozen_string_literal: true
# Crea la tabla de roles
class CreateRoles < ActiveRecord::Migration[5.2]
def change
create_table :roles do |t|
t.timestamps
t.belongs_to :site
t.belongs_to :usuarie
t.string :rol
t.boolean :temporal
# Solo podemos tener un rol a la vez
t.index %i[site_id usuarie_id], unique: true
end
end
end

View file

@ -12,13 +12,25 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20_190_705_215_536) do
ActiveRecord::Schema.define(version: 20_190_706_000_159) do
create_table 'invitades_sites', id: false, force: :cascade do |t|
t.integer 'site_id'
t.integer 'usuarie_id'
t.index %w[site_id usuarie_id], name: 'index_invitades_sites_on_site_id_and_usuarie_id', unique: true
end
create_table 'roles', force: :cascade do |t|
t.datetime 'created_at', null: false
t.datetime 'updated_at', null: false
t.integer 'site_id'
t.integer 'usuarie_id'
t.string 'rol'
t.boolean 'temporal'
t.index %w[site_id usuarie_id], name: 'index_roles_on_site_id_and_usuarie_id', unique: true
t.index ['site_id'], name: 'index_roles_on_site_id'
t.index ['usuarie_id'], name: 'index_roles_on_usuarie_id'
end
create_table 'sites', force: :cascade do |t|
t.datetime 'created_at', null: false
t.datetime 'updated_at', null: false

View file

@ -58,6 +58,14 @@ momento, sino se pueden loguear normalmente.
Si ya están logueades, se acepta la invitación inmediatamente.
Para poder hacer una invitación con consentimiento, se guarda la
relación en una tabla aparte. Cuando la usuaria acepta la invitación
esa relación se borra y se aplican los cambios.
En el futuro cambiaríamos el sistema de permisos separados que tenemos
ahora por una tabla de roles (por qué no la hicimos desde el principio!)
con un campo binario que indique si ya se aceptó la invitación o no.
### Invitades desde la web
Al publicar la URL de invitación, les invitades se puedan registrar