From 4052329ca49b05b14baceee17dd8bd4607c9c9a1 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 10 Mar 2020 17:44:32 -0500 Subject: [PATCH 1/3] Add unique_email field --- app/models/user.rb | 1 + db/migrate/20200310223351_add_unique_email_to_users.rb | 5 +++++ .../20200310224203_add_index_unique_email_on_users.rb | 7 +++++++ db/schema.rb | 4 +++- 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20200310223351_add_unique_email_to_users.rb create mode 100644 db/migrate/20200310224203_add_index_unique_email_on_users.rb diff --git a/app/models/user.rb b/app/models/user.rb index 6eadbb2b..ed081c90 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -39,6 +39,7 @@ # created_by_application_id :bigint(8) # approved :boolean default(TRUE), not null # last_read_notification :bigint(8) +# unique_email :string # class User < ApplicationRecord diff --git a/db/migrate/20200310223351_add_unique_email_to_users.rb b/db/migrate/20200310223351_add_unique_email_to_users.rb new file mode 100644 index 00000000..45b6ffa8 --- /dev/null +++ b/db/migrate/20200310223351_add_unique_email_to_users.rb @@ -0,0 +1,5 @@ +class AddUniqueEmailToUsers < ActiveRecord::Migration[5.2] + def change + add_column :users, :unique_email, :string + end +end diff --git a/db/migrate/20200310224203_add_index_unique_email_on_users.rb b/db/migrate/20200310224203_add_index_unique_email_on_users.rb new file mode 100644 index 00000000..a7b5216d --- /dev/null +++ b/db/migrate/20200310224203_add_index_unique_email_on_users.rb @@ -0,0 +1,7 @@ +class AddIndexUniqueEmailOnUsers < ActiveRecord::Migration[5.2] + disable_ddl_transaction! + + def change + add_index :users, :unique_email, algorithm: :concurrently + end +end diff --git a/db/schema.rb b/db/schema.rb index 3d8c22ab..2570abba 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_12_02_004114) do +ActiveRecord::Schema.define(version: 2020_03_10_224203) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -824,11 +824,13 @@ ActiveRecord::Schema.define(version: 2019_12_02_004114) do t.bigint "created_by_application_id" t.boolean "approved", default: true, null: false t.bigint "last_read_notification" + t.string "unique_email" t.index ["account_id"], name: "index_users_on_account_id" t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true t.index ["created_by_application_id"], name: "index_users_on_created_by_application_id" t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true + t.index ["unique_email"], name: "index_users_on_unique_email" end create_table "web_push_subscriptions", force: :cascade do |t| From c3bc1c08b9c3f63cc7201a1efb2245c13d7206a4 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 10 Mar 2020 17:59:23 -0500 Subject: [PATCH 2/3] Set unique_email upon User creation --- app/models/user.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index ed081c90..9d12601b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -80,6 +80,7 @@ class User < ApplicationRecord accepts_nested_attributes_for :invite_request, reject_if: ->(attributes) { attributes['text'].blank? } validates :locale, inclusion: I18n.available_locales.map(&:to_s), if: :locale? + validates :unique_email, uniqueness: true validates_with BlacklistedEmailValidator, on: :create validates_with EmailMxValidator, if: :validate_email_dns? validates :agreement, acceptance: { allow_nil: false, accept: [true, 'true', '1'] }, on: :create @@ -95,6 +96,7 @@ class User < ApplicationRecord scope :emailable, -> { confirmed.enabled.joins(:account).merge(Account.searchable) } before_validation :sanitize_languages + before_validation :set_unique_email before_create :set_approved # This avoids a deprecation warning from Rails 5.1 @@ -218,7 +220,7 @@ class User < ApplicationRecord def allows_group_in_home_feed? settings.group_in_home_feed end - + def token_for_app(a) return nil if a.nil? || a.owner != self Doorkeeper::AccessToken @@ -347,4 +349,10 @@ class User < ApplicationRecord end end + def set_unique_email + user, domain = self.email.split('@') + user = user.split('+').first + user = user.gsub('.', '') if domain == 'gmail.com' + self.unique_email = "#{user}@#{domain}" + end end From 3d3b51ee1a3d1cea0552ed3039935d2f43fb3199 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 10 Mar 2020 18:24:02 -0500 Subject: [PATCH 3/3] Only validate User.unique_email on create --- app/models/user.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 9d12601b..883719f2 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -80,7 +80,7 @@ class User < ApplicationRecord accepts_nested_attributes_for :invite_request, reject_if: ->(attributes) { attributes['text'].blank? } validates :locale, inclusion: I18n.available_locales.map(&:to_s), if: :locale? - validates :unique_email, uniqueness: true + validates :unique_email, uniqueness: true, on: :create validates_with BlacklistedEmailValidator, on: :create validates_with EmailMxValidator, if: :validate_email_dns? validates :agreement, acceptance: { allow_nil: false, accept: [true, 'true', '1'] }, on: :create