From e4da74825768bf20ae23f9de85453c8ac10d1551 Mon Sep 17 00:00:00 2001 From: Tim Alby Date: Wed, 6 Jun 2018 14:52:09 +0200 Subject: [PATCH 1/3] add filter to query on emails attribute --- services/web/app/coffee/Features/User/UserGetter.coffee | 3 ++- services/web/test/unit/coffee/User/UserGetterTests.coffee | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/services/web/app/coffee/Features/User/UserGetter.coffee b/services/web/app/coffee/Features/User/UserGetter.coffee index 10a975613e..3160258b24 100644 --- a/services/web/app/coffee/Features/User/UserGetter.coffee +++ b/services/web/app/coffee/Features/User/UserGetter.coffee @@ -37,7 +37,8 @@ module.exports = UserGetter = if arguments.length == 2 callback = projection projection = {} - db.users.findOne 'emails.email': email, projection, (error, user) => + query = emails: { $exists: true }, 'emails.email': email + db.users.findOne query, projection, (error, user) => return callback(error, user) if error? or user? # While multiple emails are being rolled out, check for the main email as diff --git a/services/web/test/unit/coffee/User/UserGetterTests.coffee b/services/web/test/unit/coffee/User/UserGetterTests.coffee index cdc22772f3..b25bab87a7 100644 --- a/services/web/test/unit/coffee/User/UserGetterTests.coffee +++ b/services/web/test/unit/coffee/User/UserGetterTests.coffee @@ -60,9 +60,12 @@ describe "UserGetter", -> describe "getUserByAnyEmail", -> it "query user for any email", (done)-> email = 'hello@world.com' + expectedQuery = + emails: { $exists: true } + 'emails.email': email projection = emails: 1 @UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) => - @findOne.calledWith('emails.email': email, projection).should.equal true + @findOne.calledWith(expectedQuery, projection).should.equal true user.should.deep.equal @fakeUser done() From 7726314e7c8eed9d6e3620f81ca66448b7ec4184 Mon Sep 17 00:00:00 2001 From: Tim Alby Date: Wed, 6 Jun 2018 15:45:12 +0200 Subject: [PATCH 2/3] add test to explicitely check filter --- services/web/test/unit/coffee/User/UserGetterTests.coffee | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/services/web/test/unit/coffee/User/UserGetterTests.coffee b/services/web/test/unit/coffee/User/UserGetterTests.coffee index b25bab87a7..7fb14a7f7d 100644 --- a/services/web/test/unit/coffee/User/UserGetterTests.coffee +++ b/services/web/test/unit/coffee/User/UserGetterTests.coffee @@ -69,6 +69,14 @@ describe "UserGetter", -> user.should.deep.equal @fakeUser done() + it "query contains $exists:true so partial index is used", (done)-> + expectedQuery = + emails: { $exists: true } + 'emails.email': '' + @UserGetter.getUserByAnyEmail '', {}, (error, user) => + @findOne.calledWith(expectedQuery, {}).should.equal true + done() + it "checks main email as well", (done)-> @findOne.callsArgWith(2, null, null) email = 'hello@world.com' From 3cb499a3c2aac549e0dc04f7949083f5519761c8 Mon Sep 17 00:00:00 2001 From: Tim Alby Date: Wed, 6 Jun 2018 15:46:41 +0200 Subject: [PATCH 3/3] add comment --- services/web/app/coffee/Features/User/UserGetter.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/services/web/app/coffee/Features/User/UserGetter.coffee b/services/web/app/coffee/Features/User/UserGetter.coffee index 3160258b24..2e6d4eada6 100644 --- a/services/web/app/coffee/Features/User/UserGetter.coffee +++ b/services/web/app/coffee/Features/User/UserGetter.coffee @@ -37,6 +37,7 @@ module.exports = UserGetter = if arguments.length == 2 callback = projection projection = {} + # $exists: true MUST be set to use the partial index query = emails: { $exists: true }, 'emails.email': email db.users.findOne query, projection, (error, user) => return callback(error, user) if error? or user?