From cedae31c9593e43d80a6533143048b0bcf831ad7 Mon Sep 17 00:00:00 2001
From: Arnaud Levy <contact@arnaudlevy.com>
Date: Wed, 11 Aug 2021 18:06:46 +0200
Subject: [PATCH] only html for admin, users restricted to university

---
 app/assets/stylesheets/admin/styles.sass      |  4 +--
 .../admin/universities_controller.rb          | 33 +++++++------------
 app/controllers/admin/users_controller.rb     | 30 ++++++-----------
 .../users/registrations_controller.rb         | 15 +++++++++
 app/controllers/users/sessions_controller.rb  | 15 +++++++++
 app/models/university.rb                      |  2 +-
 app/models/university/with_identifier.rb      |  6 ++--
 app/models/university/with_users.rb           |  7 ++++
 app/models/user.rb                            | 22 ++++++++-----
 app/models/user/with_devise.rb                | 11 +++++++
 app/views/devise/shared/_links.html.erb       |  4 +--
 config/initializers/devise.rb                 |  2 +-
 config/routes.rb                              |  5 ++-
 db/migrate/20210708041914_fix_uuids.rb        | 25 --------------
 .../20210708052012_add_fields_to_programs.rb  |  6 ----
 ..._uuid.rb => 20210801041644_enable_uuid.rb} |  0
 ... => 20210801043544_create_universities.rb} |  3 +-
 ... => 20210801043712_devise_create_users.rb} | 12 ++++---
 ...s.rb => 20210808043034_create_programs.rb} |  4 ++-
 ...10808122438_create_qualiopi_criterions.rb} |  2 +-
 ...10808122519_create_qualiopi_indicators.rb} |  4 +--
 ...0809084645_add_identifier_to_university.rb |  5 ---
 .../20210811082802_namespace_features.rb      |  7 ----
 db/schema.rb                                  | 13 ++++----
 db/seeds.rb                                   |  8 +----
 test/fixtures/universities.yml                |  1 -
 test/fixtures/users.yml                       | 15 ++++++---
 test/models/university_test.rb                |  1 -
 test/models/user_test.rb                      | 15 ++++++---
 29 files changed, 137 insertions(+), 140 deletions(-)
 create mode 100644 app/controllers/users/registrations_controller.rb
 create mode 100644 app/controllers/users/sessions_controller.rb
 create mode 100644 app/models/university/with_users.rb
 create mode 100644 app/models/user/with_devise.rb
 delete mode 100644 db/migrate/20210708041914_fix_uuids.rb
 delete mode 100644 db/migrate/20210708052012_add_fields_to_programs.rb
 rename db/migrate/{20210708041644_enable_uuid.rb => 20210801041644_enable_uuid.rb} (100%)
 rename db/migrate/{20210701043544_create_universities.rb => 20210801043544_create_universities.rb} (76%)
 rename db/migrate/{20210701043712_devise_create_users.rb => 20210801043712_devise_create_users.rb} (76%)
 rename db/migrate/{20210708043034_create_programs.rb => 20210808043034_create_programs.rb} (81%)
 rename db/migrate/{20210708122438_create_qualiopi_criterions.rb => 20210808122438_create_qualiopi_criterions.rb} (70%)
 rename db/migrate/{20210708122519_create_qualiopi_indicators.rb => 20210808122519_create_qualiopi_indicators.rb} (70%)
 delete mode 100644 db/migrate/20210809084645_add_identifier_to_university.rb
 delete mode 100644 db/migrate/20210811082802_namespace_features.rb

diff --git a/app/assets/stylesheets/admin/styles.sass b/app/assets/stylesheets/admin/styles.sass
index 749a772a4..2bef76650 100644
--- a/app/assets/stylesheets/admin/styles.sass
+++ b/app/assets/stylesheets/admin/styles.sass
@@ -1,8 +1,8 @@
 h1
-  margin-bottom: 30px
+    margin-bottom: 30px
 
 .sidebar-nav .fas
-  min-width: 20px
+    min-width: 20px
 
 body, body[data-theme=dark]
     .sidebar-content
diff --git a/app/controllers/admin/universities_controller.rb b/app/controllers/admin/universities_controller.rb
index e34d9f1cd..8347979a3 100644
--- a/app/controllers/admin/universities_controller.rb
+++ b/app/controllers/admin/universities_controller.rb
@@ -19,37 +19,26 @@ class Admin::UniversitiesController < Admin::ApplicationController
   end
 
   def create
-    breadcrumb
-    respond_to do |format|
-      if @university.save
-        format.html { redirect_to [:admin, @university], notice: "University was successfully created." }
-        format.json { render :show, status: :created, location: [:admin, @university] }
-      else
-        format.html { render :new, status: :unprocessable_entity }
-        format.json { render json: @university.errors, status: :unprocessable_entity }
-      end
+    if @university.save
+      redirect_to [:admin, @university], notice: "University was successfully created."
+    else
+      breadcrumb
+      render :new, status: :unprocessable_entity
     end
   end
 
   def update
-    breadcrumb
-    respond_to do |format|
-      if @university.update(university_params)
-        format.html { redirect_to [:admin, @university], notice: "University was successfully updated." }
-        format.json { render :show, status: :ok, location: [:admin, @university] }
-      else
-        format.html { render :edit, status: :unprocessable_entity }
-        format.json { render json: @university.errors, status: :unprocessable_entity }
-      end
+    if @university.update(university_params)
+      redirect_to [:admin, @university], notice: "University was successfully updated."
+    else
+      breadcrumb
+      render :edit, status: :unprocessable_entity
     end
   end
 
   def destroy
     @university.destroy
-    respond_to do |format|
-      format.html { redirect_to admin_universities_url, notice: "University was successfully destroyed." }
-      format.json { head :no_content }
-    end
+    redirect_to admin_universities_url, notice: "University was successfully destroyed."
   end
 
   protected
diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index df4532226..949ebb8c8 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -2,6 +2,7 @@ class Admin::UsersController < Admin::ApplicationController
   load_and_authorize_resource
 
   def index
+    @users = current_university.users
     breadcrumb
   end
 
@@ -20,36 +21,25 @@ class Admin::UsersController < Admin::ApplicationController
 
   def create
     breadcrumb
-    respond_to do |format|
-      if @user.save
-        format.html { redirect_to [:admin, @user], notice: "User was successfully created." }
-        format.json { render :show, status: :created, location: [:admin, @user] }
-      else
-        format.html { render :new, status: :unprocessable_entity }
-        format.json { render json: @user.errors, status: :unprocessable_entity }
-      end
+    if @user.save
+      redirect_to [:admin, @user], notice: "User was successfully created."
+    else
+      render :new, status: :unprocessable_entity
     end
   end
 
   def update
     breadcrumb
-    respond_to do |format|
-      if @user.update(user_params)
-        format.html { redirect_to [:admin, @user], notice: "User was successfully updated." }
-        format.json { render :show, status: :ok, location: [:admin, @user] }
-      else
-        format.html { render :edit, status: :unprocessable_entity }
-        format.json { render json: @user.errors, status: :unprocessable_entity }
-      end
+    if @user.update(user_params)
+      redirect_to [:admin, @user], notice: "User was successfully updated."
+    else
+      render :edit, status: :unprocessable_entity
     end
   end
 
   def destroy
     @user.destroy
-    respond_to do |format|
-      format.html { redirect_to admin_users_url, notice: "User was successfully destroyed." }
-      format.json { head :no_content }
-    end
+    redirect_to admin_users_url, notice: "User was successfully destroyed."
   end
 
   protected
diff --git a/app/controllers/users/registrations_controller.rb b/app/controllers/users/registrations_controller.rb
new file mode 100644
index 000000000..9cbed5e1c
--- /dev/null
+++ b/app/controllers/users/registrations_controller.rb
@@ -0,0 +1,15 @@
+class Users::RegistrationsController < Devise::RegistrationsController
+  prepend_before_action :set_university, only: :create
+  before_action :configure_sign_up_params, only: :create
+
+  protected
+
+  def set_university
+    return if request.params[:user].nil?
+    request.params[:user][:university_id] = current_university.id
+  end
+
+  def configure_sign_up_params
+    devise_parameter_sanitizer.permit(:sign_up, keys: [:university_id])
+  end
+end
diff --git a/app/controllers/users/sessions_controller.rb b/app/controllers/users/sessions_controller.rb
new file mode 100644
index 000000000..5871b7790
--- /dev/null
+++ b/app/controllers/users/sessions_controller.rb
@@ -0,0 +1,15 @@
+class Users::SessionsController < Devise::SessionsController
+  prepend_before_action :set_university, only: :create
+  before_action :configure_sign_in_params, only: :create
+
+  protected
+
+  def set_university
+    return if request.params[:user].nil?
+    request.params[:user][:university_id] = current_university.id
+  end
+
+  def configure_sign_in_params
+    devise_parameter_sanitizer.permit(:sign_in, keys: [:university_id])
+  end
+end
diff --git a/app/models/university.rb b/app/models/university.rb
index 80d480cd9..9354058d4 100644
--- a/app/models/university.rb
+++ b/app/models/university.rb
@@ -12,13 +12,13 @@
 #  zipcode    :string
 #  created_at :datetime         not null
 #  updated_at :datetime         not null
-#  integer_id :bigint
 #
 class University < ApplicationRecord
   validates_presence_of :name
   scope :ordered, -> { order(:name) }
 
   include WithIdentifier
+  include WithUsers
   include WithFeatures
 
   def to_s
diff --git a/app/models/university/with_identifier.rb b/app/models/university/with_identifier.rb
index 678144f5a..04d3a3a84 100644
--- a/app/models/university/with_identifier.rb
+++ b/app/models/university/with_identifier.rb
@@ -4,10 +4,8 @@ module University::WithIdentifier
   included do
     # TODO restrict to lower case, numbers, -, _
     validates :identifier, presence: true, uniqueness: true
-  end
 
-  class_methods do
-    def with_host(host)
+    def self.with_host(host)
       find_by(identifier: extract_identifier_from(host)) || first
     end
 
@@ -17,7 +15,7 @@ module University::WithIdentifier
     # Production  osuny.osuny.org   -> osuny
     # Staging     osuny.osuny.dev   -> osuny
     # Dev         osuny.osuny       -> osuny
-    def extract_identifier_from(host)
+    def self.extract_identifier_from(host)
       host.remove('.osuny.org')
           .remove('.osuny.dev')
           .remove('.osuny')
diff --git a/app/models/university/with_users.rb b/app/models/university/with_users.rb
new file mode 100644
index 000000000..7f81767ca
--- /dev/null
+++ b/app/models/university/with_users.rb
@@ -0,0 +1,7 @@
+module University::WithUsers
+  extend ActiveSupport::Concern
+
+  included do
+    has_many :users, dependent: :destroy
+  end
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index d8935a9c5..b9ea0fbf2 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -25,20 +25,24 @@
 #  unlock_token           :string
 #  created_at             :datetime         not null
 #  updated_at             :datetime         not null
-#  integer_id             :bigint
+#  university_id          :uuid             not null
 #
 # Indexes
 #
-#  index_users_on_confirmation_token    (confirmation_token) UNIQUE
-#  index_users_on_email                 (email) UNIQUE
-#  index_users_on_reset_password_token  (reset_password_token) UNIQUE
-#  index_users_on_unlock_token          (unlock_token) UNIQUE
+#  index_users_on_confirmation_token       (confirmation_token) UNIQUE
+#  index_users_on_email_and_university_id  (email,university_id) UNIQUE
+#  index_users_on_reset_password_token     (reset_password_token) UNIQUE
+#  index_users_on_university_id            (university_id)
+#  index_users_on_unlock_token             (unlock_token) UNIQUE
+#
+# Foreign Keys
+#
+#  fk_rails_...  (university_id => universities.id)
 #
 class User < ApplicationRecord
-  # Include default devise modules. Others available are:
-  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
-  devise :database_authenticatable, :registerable,
-         :recoverable, :rememberable, :validatable
+  include WithDevise
+
+  belongs_to :university
 
   def to_s
     first_name || last_name ? "#{first_name} #{last_name}"
diff --git a/app/models/user/with_devise.rb b/app/models/user/with_devise.rb
new file mode 100644
index 000000000..fcdda620e
--- /dev/null
+++ b/app/models/user/with_devise.rb
@@ -0,0 +1,11 @@
+module User::WithDevise
+  extend ActiveSupport::Concern
+
+  included do
+    devise  :database_authenticatable, :registerable, :recoverable, :rememberable
+
+    def self.find_for_authentication(warden_conditions)
+      where(email: warden_conditions[:email].downcase, university_id: warden_conditions[:university_id]).first
+    end
+  end
+end
diff --git a/app/views/devise/shared/_links.html.erb b/app/views/devise/shared/_links.html.erb
index 96a941241..57c971143 100644
--- a/app/views/devise/shared/_links.html.erb
+++ b/app/views/devise/shared/_links.html.erb
@@ -11,11 +11,11 @@
 <% end %>
 
 <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
-  <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br />
+  <%= link_to "Didn't receive confirmation instructions?", new_user_confirmation_path(resource_name) %><br />
 <% end %>
 
 <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
-  <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
+  <%= link_to "Didn't receive unlock instructions?", new_user_unlock_path(resource_name) %><br />
 <% end %>
 
 <%- if devise_mapping.omniauthable? %>
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
index 6cba4e7ce..8d9308c99 100644
--- a/config/initializers/devise.rb
+++ b/config/initializers/devise.rb
@@ -46,7 +46,7 @@ Devise.setup do |config|
   # session. If you need permissions, you should implement that in a before filter.
   # You can also supply a hash where the value is a boolean determining whether
   # or not authentication should be aborted when the value is not present.
-  # config.authentication_keys = [:email]
+  config.authentication_keys = [:email, :university_id]
 
   # Configure parameters from the request object used for authentication. Each entry
   # given should be a request method and it will automatically be passed to the
diff --git a/config/routes.rb b/config/routes.rb
index 5be3f77b0..5a01e8091 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,5 +1,8 @@
 Rails.application.routes.draw do
-  devise_for :users
+  devise_for :users, controllers: {
+    registrations: 'users/registrations',
+    sessions: 'users/sessions'
+  }
 
   draw 'adminserver'
   draw 'admin'
diff --git a/db/migrate/20210708041914_fix_uuids.rb b/db/migrate/20210708041914_fix_uuids.rb
deleted file mode 100644
index 05f4191d0..000000000
--- a/db/migrate/20210708041914_fix_uuids.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-class FixUuids < ActiveRecord::Migration[6.1]
-  def up
-    add_column :users, :uuid, :uuid, default: "gen_random_uuid()", null: false
-    rename_column :users, :id, :integer_id
-    rename_column :users, :uuid, :id
-    execute "ALTER TABLE users drop constraint users_pkey;"
-    execute "ALTER TABLE users ADD PRIMARY KEY (id);"
-    execute "ALTER TABLE ONLY users ALTER COLUMN integer_id DROP DEFAULT;"
-    change_column_null :users, :integer_id, true
-    execute "DROP SEQUENCE IF EXISTS users_id_seq"
-
-    add_column :universities, :uuid, :uuid, default: "gen_random_uuid()", null: false
-    rename_column :universities, :id, :integer_id
-    rename_column :universities, :uuid, :id
-    execute "ALTER TABLE universities drop constraint universities_pkey;"
-    execute "ALTER TABLE universities ADD PRIMARY KEY (id);"
-    execute "ALTER TABLE ONLY universities ALTER COLUMN integer_id DROP DEFAULT;"
-    change_column_null :universities, :integer_id, true
-    execute "DROP SEQUENCE IF EXISTS universities_id_seq"
-  end
-
-  def down
-    raise ActiveRecord::IrreversibleMigration
-  end
-end
diff --git a/db/migrate/20210708052012_add_fields_to_programs.rb b/db/migrate/20210708052012_add_fields_to_programs.rb
deleted file mode 100644
index 024a496e2..000000000
--- a/db/migrate/20210708052012_add_fields_to_programs.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-class AddFieldsToPrograms < ActiveRecord::Migration[6.1]
-  def change
-    add_column :programs, :pricing, :text
-    add_column :programs, :contacts, :text
-  end
-end
diff --git a/db/migrate/20210708041644_enable_uuid.rb b/db/migrate/20210801041644_enable_uuid.rb
similarity index 100%
rename from db/migrate/20210708041644_enable_uuid.rb
rename to db/migrate/20210801041644_enable_uuid.rb
diff --git a/db/migrate/20210701043544_create_universities.rb b/db/migrate/20210801043544_create_universities.rb
similarity index 76%
rename from db/migrate/20210701043544_create_universities.rb
rename to db/migrate/20210801043544_create_universities.rb
index fbc9770b5..0a30e73fa 100644
--- a/db/migrate/20210701043544_create_universities.rb
+++ b/db/migrate/20210801043544_create_universities.rb
@@ -1,7 +1,8 @@
 class CreateUniversities < ActiveRecord::Migration[6.1]
   def change
-    create_table :universities do |t|
+    create_table :universities, id: :uuid do |t|
       t.string :name
+      t.string :identifier
       t.string :address
       t.string :zipcode
       t.string :city
diff --git a/db/migrate/20210701043712_devise_create_users.rb b/db/migrate/20210801043712_devise_create_users.rb
similarity index 76%
rename from db/migrate/20210701043712_devise_create_users.rb
rename to db/migrate/20210801043712_devise_create_users.rb
index dc90a460a..2cbe92285 100644
--- a/db/migrate/20210701043712_devise_create_users.rb
+++ b/db/migrate/20210801043712_devise_create_users.rb
@@ -2,7 +2,9 @@
 
 class DeviseCreateUsers < ActiveRecord::Migration[6.1]
   def change
-    create_table :users do |t|
+    create_table :users, id: :uuid do |t|
+      t.references :university, null: false, foreign_key: true, type: :uuid
+
       t.string :first_name
       t.string :last_name
       t.integer :role
@@ -39,9 +41,9 @@ class DeviseCreateUsers < ActiveRecord::Migration[6.1]
       t.timestamps null: false
     end
 
-    add_index :users, :email,                unique: true
-    add_index :users, :reset_password_token, unique: true
-    add_index :users, :confirmation_token,   unique: true
-    add_index :users, :unlock_token,         unique: true
+    add_index :users, [:email, :university_id], unique: true
+    add_index :users, :reset_password_token,    unique: true
+    add_index :users, :confirmation_token,      unique: true
+    add_index :users, :unlock_token,            unique: true
   end
 end
diff --git a/db/migrate/20210708043034_create_programs.rb b/db/migrate/20210808043034_create_programs.rb
similarity index 81%
rename from db/migrate/20210708043034_create_programs.rb
rename to db/migrate/20210808043034_create_programs.rb
index 801b6d961..df9c7eb45 100644
--- a/db/migrate/20210708043034_create_programs.rb
+++ b/db/migrate/20210808043034_create_programs.rb
@@ -1,6 +1,6 @@
 class CreatePrograms < ActiveRecord::Migration[6.1]
   def change
-    create_table :programs, id: :uuid do |t|
+    create_table :features_education_programs, id: :uuid do |t|
       t.references :university, null: false, foreign_key: true, type: :uuid
       t.string :name
       t.integer :level
@@ -14,6 +14,8 @@ class CreatePrograms < ActiveRecord::Migration[6.1]
       t.text :pedagogy
       t.text :evaluation
       t.text :accessibility
+      t.text :pricing
+      t.text :contacts
 
       t.timestamps
     end
diff --git a/db/migrate/20210708122438_create_qualiopi_criterions.rb b/db/migrate/20210808122438_create_qualiopi_criterions.rb
similarity index 70%
rename from db/migrate/20210708122438_create_qualiopi_criterions.rb
rename to db/migrate/20210808122438_create_qualiopi_criterions.rb
index fa80b36e2..960867581 100644
--- a/db/migrate/20210708122438_create_qualiopi_criterions.rb
+++ b/db/migrate/20210808122438_create_qualiopi_criterions.rb
@@ -1,6 +1,6 @@
 class CreateQualiopiCriterions < ActiveRecord::Migration[6.1]
   def change
-    create_table :qualiopi_criterions, id: :uuid do |t|
+    create_table :features_education_qualiopi_criterions, id: :uuid do |t|
       t.integer :number
       t.text :name
       t.text :description
diff --git a/db/migrate/20210708122519_create_qualiopi_indicators.rb b/db/migrate/20210808122519_create_qualiopi_indicators.rb
similarity index 70%
rename from db/migrate/20210708122519_create_qualiopi_indicators.rb
rename to db/migrate/20210808122519_create_qualiopi_indicators.rb
index 24481f58a..d296f3c78 100644
--- a/db/migrate/20210708122519_create_qualiopi_indicators.rb
+++ b/db/migrate/20210808122519_create_qualiopi_indicators.rb
@@ -1,7 +1,7 @@
 class CreateQualiopiIndicators < ActiveRecord::Migration[6.1]
   def change
-    create_table :qualiopi_indicators, id: :uuid do |t|
-      t.references :criterion, null: false, foreign_key: {to_table: :qualiopi_criterions}, type: :uuid
+    create_table :features_education_qualiopi_indicators, id: :uuid do |t|
+      t.references :criterion, null: false, foreign_key: {to_table: :features_education_qualiopi_criterions}, type: :uuid
       t.integer :number
       t.text :name
       t.text :level_expected
diff --git a/db/migrate/20210809084645_add_identifier_to_university.rb b/db/migrate/20210809084645_add_identifier_to_university.rb
deleted file mode 100644
index 149203d29..000000000
--- a/db/migrate/20210809084645_add_identifier_to_university.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddIdentifierToUniversity < ActiveRecord::Migration[6.1]
-  def change
-    add_column :universities, :identifier, :string
-  end
-end
diff --git a/db/migrate/20210811082802_namespace_features.rb b/db/migrate/20210811082802_namespace_features.rb
deleted file mode 100644
index 81ff89fb8..000000000
--- a/db/migrate/20210811082802_namespace_features.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-class NamespaceFeatures < ActiveRecord::Migration[6.1]
-  def change
-    rename_table :programs, :features_education_programs
-    rename_table :qualiopi_indicators, :features_education_qualiopi_indicators
-    rename_table :qualiopi_criterions, :features_education_qualiopi_criterions
-  end
-end
diff --git a/db/schema.rb b/db/schema.rb
index 631bea021..99bb8102e 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -30,10 +30,10 @@ ActiveRecord::Schema.define(version: 2021_08_11_102819) do
     t.text "pedagogy"
     t.text "evaluation"
     t.text "accessibility"
-    t.datetime "created_at", precision: 6, null: false
-    t.datetime "updated_at", precision: 6, null: false
     t.text "pricing"
     t.text "contacts"
+    t.datetime "created_at", precision: 6, null: false
+    t.datetime "updated_at", precision: 6, null: false
     t.index ["university_id"], name: "index_features_education_programs_on_university_id"
   end
 
@@ -68,8 +68,8 @@ ActiveRecord::Schema.define(version: 2021_08_11_102819) do
   end
 
   create_table "universities", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
-    t.bigint "integer_id"
     t.string "name"
+    t.string "identifier"
     t.string "address"
     t.string "zipcode"
     t.string "city"
@@ -77,11 +77,10 @@ ActiveRecord::Schema.define(version: 2021_08_11_102819) do
     t.boolean "private"
     t.datetime "created_at", precision: 6, null: false
     t.datetime "updated_at", precision: 6, null: false
-    t.string "identifier"
   end
 
   create_table "users", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
-    t.bigint "integer_id"
+    t.uuid "university_id", null: false
     t.string "first_name"
     t.string "last_name"
     t.integer "role"
@@ -105,12 +104,14 @@ ActiveRecord::Schema.define(version: 2021_08_11_102819) do
     t.datetime "created_at", precision: 6, null: false
     t.datetime "updated_at", precision: 6, null: false
     t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
-    t.index ["email"], name: "index_users_on_email", unique: true
+    t.index ["email", "university_id"], name: "index_users_on_email_and_university_id", unique: true
     t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
+    t.index ["university_id"], name: "index_users_on_university_id"
     t.index ["unlock_token"], name: "index_users_on_unlock_token", unique: true
   end
 
   add_foreign_key "features_education_programs", "universities"
   add_foreign_key "features_education_qualiopi_indicators", "features_education_qualiopi_criterions", column: "criterion_id"
   add_foreign_key "features_websites_sites", "universities"
+  add_foreign_key "users", "universities"
 end
diff --git a/db/seeds.rb b/db/seeds.rb
index f3a0480d1..2c7336dfa 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -1,7 +1 @@
-# This file should contain all the record creation needed to seed the database with its default values.
-# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup).
-#
-# Examples:
-#
-#   movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }])
-#   Character.create(name: 'Luke', movie: movies.first)
+University.create name: 'Osuny', identifier: 'osuny'
diff --git a/test/fixtures/universities.yml b/test/fixtures/universities.yml
index 60abd2d59..44db33a42 100644
--- a/test/fixtures/universities.yml
+++ b/test/fixtures/universities.yml
@@ -12,7 +12,6 @@
 #  zipcode    :string
 #  created_at :datetime         not null
 #  updated_at :datetime         not null
-#  integer_id :bigint
 #
 
 one:
diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml
index fe5dff24c..e99a05588 100644
--- a/test/fixtures/users.yml
+++ b/test/fixtures/users.yml
@@ -25,14 +25,19 @@
 #  unlock_token           :string
 #  created_at             :datetime         not null
 #  updated_at             :datetime         not null
-#  integer_id             :bigint
+#  university_id          :uuid             not null
 #
 # Indexes
 #
-#  index_users_on_confirmation_token    (confirmation_token) UNIQUE
-#  index_users_on_email                 (email) UNIQUE
-#  index_users_on_reset_password_token  (reset_password_token) UNIQUE
-#  index_users_on_unlock_token          (unlock_token) UNIQUE
+#  index_users_on_confirmation_token       (confirmation_token) UNIQUE
+#  index_users_on_email_and_university_id  (email,university_id) UNIQUE
+#  index_users_on_reset_password_token     (reset_password_token) UNIQUE
+#  index_users_on_university_id            (university_id)
+#  index_users_on_unlock_token             (unlock_token) UNIQUE
+#
+# Foreign Keys
+#
+#  fk_rails_...  (university_id => universities.id)
 #
 
 # This model initially had no columns defined. If you add columns to the
diff --git a/test/models/university_test.rb b/test/models/university_test.rb
index 1960b952e..dac831a2e 100644
--- a/test/models/university_test.rb
+++ b/test/models/university_test.rb
@@ -12,7 +12,6 @@
 #  zipcode    :string
 #  created_at :datetime         not null
 #  updated_at :datetime         not null
-#  integer_id :bigint
 #
 require "test_helper"
 
diff --git a/test/models/user_test.rb b/test/models/user_test.rb
index 8ea003217..a54213fd1 100644
--- a/test/models/user_test.rb
+++ b/test/models/user_test.rb
@@ -25,14 +25,19 @@
 #  unlock_token           :string
 #  created_at             :datetime         not null
 #  updated_at             :datetime         not null
-#  integer_id             :bigint
+#  university_id          :uuid             not null
 #
 # Indexes
 #
-#  index_users_on_confirmation_token    (confirmation_token) UNIQUE
-#  index_users_on_email                 (email) UNIQUE
-#  index_users_on_reset_password_token  (reset_password_token) UNIQUE
-#  index_users_on_unlock_token          (unlock_token) UNIQUE
+#  index_users_on_confirmation_token       (confirmation_token) UNIQUE
+#  index_users_on_email_and_university_id  (email,university_id) UNIQUE
+#  index_users_on_reset_password_token     (reset_password_token) UNIQUE
+#  index_users_on_university_id            (university_id)
+#  index_users_on_unlock_token             (unlock_token) UNIQUE
+#
+# Foreign Keys
+#
+#  fk_rails_...  (university_id => universities.id)
 #
 require "test_helper"
 
-- 
GitLab