Przeglądaj źródła

Merge pull request #636 from sharelatex/ta-add-emails-filter

Add Filter to Query on Emails Attribute
Timothée Alby 8 lat temu
rodzic
commit
e6568a26e7

+ 3 - 1
services/web/app/coffee/Features/User/UserGetter.coffee

@@ -37,7 +37,9 @@ module.exports = UserGetter =
 		if arguments.length == 2
 		if arguments.length == 2
 			callback = projection
 			callback = projection
 			projection = {}
 			projection = {}
-		db.users.findOne 'emails.email': email, projection, (error, user) =>
+		# $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?
 			return callback(error, user) if error? or user?
 
 
 			# While multiple emails are being rolled out, check for the main email as
 			# While multiple emails are being rolled out, check for the main email as

+ 12 - 1
services/web/test/unit/coffee/User/UserGetterTests.coffee

@@ -60,12 +60,23 @@ describe "UserGetter", ->
 	describe "getUserByAnyEmail", ->
 	describe "getUserByAnyEmail", ->
 		it "query user for any email", (done)->
 		it "query user for any email", (done)->
 			email = 'hello@world.com'
 			email = 'hello@world.com'
+			expectedQuery =
+				emails: { $exists: true }
+				'emails.email': email
 			projection = emails: 1
 			projection = emails: 1
 			@UserGetter.getUserByAnyEmail " #{email} ", projection, (error, user) =>
 			@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
 				user.should.deep.equal @fakeUser
 				done()
 				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)->
 		it "checks main email as well", (done)->
 			@findOne.callsArgWith(2, null, null)
 			@findOne.callsArgWith(2, null, null)
 			email = 'hello@world.com'
 			email = 'hello@world.com'