Skip to content

Commit 2df9a36

Browse files
committed
raise project dne for wrong org id or no project
1 parent b5e5fde commit 2df9a36

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

src/sentry/seer/endpoints/seer_rpc.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -864,10 +864,14 @@ def check_repository_integrations_status(*, repository_integrations: list[dict[s
864864

865865

866866
def get_project_preferences(*, organization_id: int, project_id: int) -> dict | None:
867-
try:
868-
project = Project.objects.get(id=project_id, organization_id=organization_id)
869-
except Project.DoesNotExist:
870-
return None
867+
"""Get Seer project preferences for a single project from Sentry DB.
868+
869+
Raises Project.DoesNotExist if the project is not found or doesn't belong to the org.
870+
Returns None if the project has no configured preferences.
871+
"""
872+
project = Project.objects.get_from_cache(id=project_id)
873+
if project.organization_id != organization_id:
874+
raise Project.DoesNotExist
871875

872876
preference = read_preference_from_sentry_db(project)
873877
if preference is None:
@@ -876,6 +880,11 @@ def get_project_preferences(*, organization_id: int, project_id: int) -> dict |
876880

877881

878882
def bulk_get_project_preferences(*, organization_id: int, project_ids: list[int]) -> dict:
883+
"""Bulk get Seer project preferences from Sentry DB.
884+
885+
Returns a dict keyed by stringified project ID. Values are preference dicts or None
886+
for projects with no configured preferences.
887+
"""
879888
preferences = bulk_read_preferences_from_sentry_db(organization_id, project_ids)
880889
return {
881890
str(project_id): preference.dict() if preference else None

tests/sentry/seer/endpoints/test_seer_rpc.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from sentry.constants import ObjectStatus
1515
from sentry.integrations.models.integration import Integration
1616
from sentry.integrations.models.repository_project_path_config import RepositoryProjectPathConfig
17+
from sentry.models.project import Project
1718
from sentry.models.repository import Repository
1819
from sentry.seer.endpoints.seer_rpc import (
1920
bulk_get_project_preferences,
@@ -1509,12 +1510,21 @@ def test_get_project_preferences_returns_none_when_no_preference(self, mock_read
15091510
)
15101511
assert result is None
15111512

1512-
def test_get_project_preferences_returns_none_for_nonexistent_project(self) -> None:
1513-
result = get_project_preferences(
1514-
organization_id=self.organization.id,
1515-
project_id=999999,
1516-
)
1517-
assert result is None
1513+
def test_get_project_preferences_raises_for_nonexistent_project(self) -> None:
1514+
with pytest.raises(Project.DoesNotExist):
1515+
get_project_preferences(
1516+
organization_id=self.organization.id,
1517+
project_id=999999,
1518+
)
1519+
1520+
def test_get_project_preferences_raises_for_wrong_org(self) -> None:
1521+
project = self.create_project(organization=self.organization)
1522+
other_org = self.create_organization(owner=self.user)
1523+
with pytest.raises(Project.DoesNotExist):
1524+
get_project_preferences(
1525+
organization_id=other_org.id,
1526+
project_id=project.id,
1527+
)
15181528

15191529
@patch("sentry.seer.endpoints.seer_rpc.bulk_read_preferences_from_sentry_db")
15201530
def test_bulk_get_project_preferences_returns_preferences(self, mock_bulk_read: Any) -> None:

0 commit comments

Comments
 (0)