# Table name: email_domain_blocks
#
# id :bigint not null, primary key
-# domain :string not null
+# domain :string default(""), not null
# created_at :datetime not null
# updated_at :datetime not null
#
class EmailDomainBlock < ApplicationRecord
+ before_validation :normalize_domain
+
+ validates :domain, presence: true, uniqueness: true
+
def self.block?(email)
- domain = email.gsub(/.+@([^.]+)/, '\1')
+ _, domain = email.split('@', 2)
+
+ return true if domain.nil?
+
+ begin
+ domain = TagManager.instance.normalize_domain(domain)
+ rescue Addressable::URI::InvalidURIError
+ return true
+ end
+
where(domain: domain).exists?
end
+
+ private
+
+ def normalize_domain
+ self.domain = TagManager.instance.normalize_domain(domain)
+ end
end
--- /dev/null
+class AddIndexDomainToEmailDomainBlocks < ActiveRecord::Migration[5.1]
+ disable_ddl_transaction!
+
+ def change
+ add_index :email_domain_blocks, :domain, algorithm: :concurrently, unique: true
+ change_column_default :email_domain_blocks, :domain, from: nil, to: ''
+ end
+end
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20171109012327) do
+ActiveRecord::Schema.define(version: 20171114080328) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
end
create_table "email_domain_blocks", force: :cascade do |t|
- t.string "domain", null: false
+ t.string "domain", default: "", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.index ["domain"], name: "index_email_domain_blocks_on_domain", unique: true
end
create_table "favourites", force: :cascade do |t|
Fabricate(:email_domain_block, domain: 'example.com')
expect(EmailDomainBlock.block?('nyarn@example.com')).to eq true
end
+
it 'returns true if the domain is not registed' do
- Fabricate(:email_domain_block, domain: 'domain')
- expect(EmailDomainBlock.block?('example')).to eq false
+ Fabricate(:email_domain_block, domain: 'example.com')
+ expect(EmailDomainBlock.block?('nyarn@example.net')).to eq false
end
end
end