Commit 45ff4e31 authored by Stan Hu's avatar Stan Hu

Add support for searching users by confirmed e-mails

This is in preparation for modifying importers to assign e-mails for
only confirmed emails.
parent 87f03f01
...@@ -248,6 +248,7 @@ class User < ActiveRecord::Base ...@@ -248,6 +248,7 @@ class User < ActiveRecord::Base
scope :todo_authors, ->(user_id, state) { where(id: Todo.where(user_id: user_id, state: state).select(:author_id)) } scope :todo_authors, ->(user_id, state) { where(id: Todo.where(user_id: user_id, state: state).select(:author_id)) }
scope :order_recent_sign_in, -> { reorder(Gitlab::Database.nulls_last_order('current_sign_in_at', 'DESC')) } scope :order_recent_sign_in, -> { reorder(Gitlab::Database.nulls_last_order('current_sign_in_at', 'DESC')) }
scope :order_oldest_sign_in, -> { reorder(Gitlab::Database.nulls_last_order('current_sign_in_at', 'ASC')) } scope :order_oldest_sign_in, -> { reorder(Gitlab::Database.nulls_last_order('current_sign_in_at', 'ASC')) }
scope :confirmed, -> { where.not(confirmed_at: nil) }
def self.with_two_factor_indistinct def self.with_two_factor_indistinct
joins("LEFT OUTER JOIN u2f_registrations AS u2f ON u2f.user_id = users.id") joins("LEFT OUTER JOIN u2f_registrations AS u2f ON u2f.user_id = users.id")
...@@ -293,14 +294,17 @@ class User < ActiveRecord::Base ...@@ -293,14 +294,17 @@ class User < ActiveRecord::Base
end end
# Find a User by their primary email or any associated secondary email # Find a User by their primary email or any associated secondary email
def find_by_any_email(email) def find_by_any_email(email, confirmed: false)
by_any_email(email).take by_any_email(email, confirmed: confirmed).take
end end
# Returns a relation containing all the users for the given Email address # Returns a relation containing all the users for the given Email address
def by_any_email(email) def by_any_email(email, confirmed: false)
users = where(email: email) users = where(email: email)
users = users.confirmed if confirmed
emails = joins(:emails).where(emails: { email: email }) emails = joins(:emails).where(emails: { email: email })
emails = emails.confirmed if confirmed
union = Gitlab::SQL::Union.new([users, emails]) union = Gitlab::SQL::Union.new([users, emails])
from("(#{union.to_sql}) #{table_name}") from("(#{union.to_sql}) #{table_name}")
......
---
title: Add support for searching users by confirmed e-mails
merge_request: 20893
author:
type: other
...@@ -949,6 +949,7 @@ describe User do ...@@ -949,6 +949,7 @@ describe User do
user = create(:user, email: 'foo@example.com') user = create(:user, email: 'foo@example.com')
expect(described_class.find_by_any_email(user.email)).to eq user expect(described_class.find_by_any_email(user.email)).to eq user
expect(described_class.find_by_any_email(user.email, confirmed: true)).to eq user
end end
it 'finds by secondary email' do it 'finds by secondary email' do
...@@ -956,11 +957,19 @@ describe User do ...@@ -956,11 +957,19 @@ describe User do
user = email.user user = email.user
expect(described_class.find_by_any_email(email.email)).to eq user expect(described_class.find_by_any_email(email.email)).to eq user
expect(described_class.find_by_any_email(email.email, confirmed: true)).to eq user
end end
it 'returns nil when nothing found' do it 'returns nil when nothing found' do
expect(described_class.find_by_any_email('')).to be_nil expect(described_class.find_by_any_email('')).to be_nil
end end
it 'returns nil when user is not confirmed' do
user = create(:user, email: 'foo@example.com', confirmed_at: nil)
expect(described_class.find_by_any_email(user.email, confirmed: false)).to eq(user)
expect(described_class.find_by_any_email(user.email, confirmed: true)).to be_nil
end
end end
describe '.by_any_email' do describe '.by_any_email' do
...@@ -974,6 +983,12 @@ describe User do ...@@ -974,6 +983,12 @@ describe User do
expect(described_class.by_any_email(user.email)).to eq([user]) expect(described_class.by_any_email(user.email)).to eq([user])
end end
it 'returns a relation of users for confirmed users' do
user = create(:user)
expect(described_class.by_any_email(user.email, confirmed: true)).to eq([user])
end
end end
describe '.search' do describe '.search' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment