diff --git a/app/controllers/usuaries_controller.rb b/app/controllers/usuaries_controller.rb index 8520899..3c85579 100644 --- a/app/controllers/usuaries_controller.rb +++ b/app/controllers/usuaries_controller.rb @@ -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 diff --git a/app/models/rol.rb b/app/models/rol.rb new file mode 100644 index 0000000..0942a22 --- /dev/null +++ b/app/models/rol.rb @@ -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 diff --git a/app/models/site.rb b/app/models/site.rb index 3052f1f..b659c8a 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -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' diff --git a/app/models/usuarie.rb b/app/models/usuarie.rb index 8fea94a..7f754b3 100644 --- a/app/models/usuarie.rb +++ b/app/models/usuarie.rb @@ -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', diff --git a/app/views/usuaries/invite.haml b/app/views/usuaries/invite.haml index 49d8320..472d09c 100644 --- a/app/views/usuaries/invite.haml +++ b/app/views/usuaries/invite.haml @@ -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') diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index 25d6de2..62a4533 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -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 diff --git a/db/migrate/20190706000159_create_roles.rb b/db/migrate/20190706000159_create_roles.rb new file mode 100644 index 0000000..231dff2 --- /dev/null +++ b/db/migrate/20190706000159_create_roles.rb @@ -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 diff --git a/db/schema.rb b/db/schema.rb index 4a6bfe3..34a38a8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -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 diff --git a/doc/autenticacion.md b/doc/autenticacion.md index 93335fa..de3d9c0 100644 --- a/doc/autenticacion.md +++ b/doc/autenticacion.md @@ -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