Skip to content

Commit 5480bb1

Browse files
author
David Wang
authored
feat(user): Add option to only return verified emails from verify_user_emails (#69812)
Will be used to fetch only verified emails when notifying users that their monitors have been in a broken state for an extended period of time Ensured that I only updated the function with an optional parameter, and didn't have the callers use the new parameter yet.
1 parent f9e6717 commit 5480bb1

File tree

3 files changed

+41
-4
lines changed

3 files changed

+41
-4
lines changed

src/sentry/services/hybrid_cloud/user/impl.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -277,14 +277,18 @@ def trigger_user_consent_email_if_applicable(self, *, user_id: int) -> None:
277277
user.send_confirm_emails(is_new_user=True)
278278

279279
def verify_user_emails(
280-
self, *, user_id_emails: list[UserIdEmailArgs]
280+
self, *, user_id_emails: list[UserIdEmailArgs], only_verified: bool = False
281281
) -> dict[int, RpcVerifyUserEmail]:
282282
results = {}
283283
for user_id_email in user_id_emails:
284284
user_id = user_id_email["user_id"]
285285
email = user_id_email["email"]
286-
exists = UserEmail.objects.filter(user_id=user_id, email__iexact=email).exists()
287-
results[user_id] = RpcVerifyUserEmail(email=email, exists=exists)
286+
287+
user_email_qs = UserEmail.objects.filter(user_id=user_id, email__iexact=email)
288+
if only_verified:
289+
user_email_qs = user_email_qs.filter(is_verified=True)
290+
291+
results[user_id] = RpcVerifyUserEmail(email=email, exists=user_email_qs.exists())
288292
return results
289293

290294
def get_user_avatar(self, *, user_id: int) -> RpcAvatar | None:

src/sentry/services/hybrid_cloud/user/service.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ def trigger_user_consent_email_if_applicable(self, *, user_id: int) -> None:
198198
@rpc_method
199199
@abstractmethod
200200
def verify_user_emails(
201-
self, *, user_id_emails: list[UserIdEmailArgs]
201+
self, *, user_id_emails: list[UserIdEmailArgs], only_verified: bool = False
202202
) -> dict[int, RpcVerifyUserEmail]:
203203
pass
204204

tests/sentry/services/hybrid_cloud/user/test_impl.py

+33
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from sentry.models.authidentity import AuthIdentity
33
from sentry.models.authprovider import AuthProvider
44
from sentry.models.user import User
5+
from sentry.models.useremail import UserEmail
56
from sentry.services.hybrid_cloud.user.service import user_service
67
from sentry.testutils.cases import TestCase
78
from sentry.testutils.silo import control_silo_test
@@ -65,3 +66,35 @@ def test_get_user_with_ident(self):
6566
assert user2.id == fetched_user.id
6667
assert user1.id != fetched_user.id
6768
assert created is False
69+
70+
def test_verify_user_emails(self):
71+
user1 = self.create_user(email="[email protected]")
72+
user2 = self.create_user(email="[email protected]")
73+
verified_emails = user_service.verify_user_emails(
74+
user_id_emails=[
75+
{"user_id": user1.id, "email": "[email protected]"},
76+
{"user_id": user2.id, "email": "[email protected]"},
77+
],
78+
only_verified=False,
79+
)
80+
81+
# Tests that matching emails to user ids exist
82+
assert verified_emails[user1.id].exists
83+
assert not verified_emails[user2.id].exists
84+
85+
def test_verify_user_emails_only_verified(self):
86+
user1 = self.create_user(email="[email protected]")
87+
user2 = self.create_user(email="[email protected]")
88+
UserEmail.objects.filter(user=user2, email="[email protected]").update(is_verified=False)
89+
90+
verified_emails = user_service.verify_user_emails(
91+
user_id_emails=[
92+
{"user_id": user1.id, "email": "[email protected]"},
93+
{"user_id": user2.id, "email": "[email protected]"},
94+
],
95+
only_verified=True,
96+
)
97+
98+
# Tests that only verified emails are returned
99+
assert verified_emails[user1.id].exists
100+
assert not verified_emails[user2.id].exists

0 commit comments

Comments
 (0)