Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ def _create(**overrides) -> BaseArgs:
"sender_id": random.randint(1, 999999),
"sender_name": "test-sender",
"sender_email": "test@example.com",
"sender_display_name": "Test Sender",
"is_automation": False,
"reviewers": [],
"github_urls": [],
Expand Down
2 changes: 2 additions & 0 deletions schemas/supabase/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,7 @@ class Users(TypedDict):
created_at: datetime.datetime
created_by: str | None
user_rules: str
display_name: str


class UsersInsert(TypedDict):
Expand All @@ -610,6 +611,7 @@ class UsersInsert(TypedDict):
email: NotRequired[str | None]
created_by: NotRequired[str | None]
user_rules: str
display_name: str


class WebhookDeliveries(TypedDict):
Expand Down
1 change: 1 addition & 0 deletions services/github/refs/test_update_reference.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ def sample_base_args():
sender_id=111222333,
sender_name="test-sender",
sender_email="test@example.com",
sender_display_name="Test Sender",
is_automation=False,
reviewers=[],
github_urls=[],
Expand Down
1 change: 1 addition & 0 deletions services/github/types/github_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class BaseArgs(TypedDict):
sender_id: int
sender_name: str
sender_email: str | None
sender_display_name: str
is_automation: bool
reviewers: list[str]
github_urls: list[str]
Expand Down
31 changes: 23 additions & 8 deletions services/github/users/get_user_public_email.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,38 @@
from dataclasses import dataclass

import requests

from config import GITHUB_API_URL, TIMEOUT
from services.github.utils.create_headers import create_headers
from utils.error.handle_exceptions import handle_exceptions


@handle_exceptions(default_return_value=None, raise_on_error=False)
def get_user_public_email(username: str, token: str) -> str | None:
@dataclass
class UserPublicInfo:
email: str | None
display_name: str


@handle_exceptions(
default_return_value=UserPublicInfo(email=None, display_name=""),
raise_on_error=False,
)
def get_user_public_info(username: str, token: str):
"""https://docs.github.com/en/rest/users/users?apiVersion=2022-11-28#get-a-user"""
# If the user is a bot, the email is not available.
# Bots (e.g. dependabot[bot]) have name=null and email=null on the API, so skip the call
if "[bot]" in username:
return None
return UserPublicInfo(email=None, display_name="")

# If the user is not a bot, get the user's email
response: requests.Response = requests.get(
url=f"{GITHUB_API_URL}/users/{username}",
headers=create_headers(token=token),
timeout=TIMEOUT,
)
response.raise_for_status()
user_data: dict = response.json()
email: str | None = user_data.get("email")
return email
user_data: dict[str, str | None] = response.json()
name: str = user_data.get("name") or ""
# Title-case if all lowercase or all uppercase (e.g., "wes nishio" -> "Wes Nishio", "HIROSHI" -> "Hiroshi")
# Cross-ref: website/app/api/auth/[...nextauth]/route.ts
if name == name.lower() or name == name.upper():
name = name.title()
return UserPublicInfo(email=user_data.get("email"), display_name=name)
Loading
Loading