feat(seer): Add Seer project connected repo endpoint #115199
2 issues
High
New Seer project-repos endpoints use removed ORM fields, causing FieldError on every request - `src/sentry/api/urls.py:2462-2473`
SeerProjectRepository no longer has project or repository FK fields — they were removed by migration 0016_remove_old_fks (SafeRemoveField with MOVE_TO_PENDING removes the fields from the Django model state). The current model in src/sentry/seer/models/project_repository.py only declares the project_repository FK to sentry.ProjectRepository.
However, the new endpoints and helpers introduced in this PR repeatedly reference the removed fields:
src/sentry/seer/endpoints/project_seer_repos.py:_get_project_repos_queryset(≈ line 132):SeerProjectRepository.objects.filter(project=project, repository__status=ObjectStatus.ACTIVE).select_related("repository")and annotationReplace("repository__provider", ...)._serialize_project_repo(≈ line 67):project_repo.repositoryattribute access._get_project_repo/OrganizationSeerProjectRepoDetailsEndpoint.delete(≈ line 332):.filter(project=project, repository_id=repo_id, repository__status=...).
src/sentry/seer/autofix/utils.py:add_seer_project_repos(≈ line 891):.filter(project=project, repository_id__in=repo_ids)andSeerProjectRepository.objects.create(project=project, repository_id=...).replace_all_seer_project_repos(≈ line 916):.filter(project=project).delete()and.create(project=project, repository_id=...).
Existing working code (e.g. read_preference_from_sentry_db, has_project_connected_repos) correctly traverses project_repository__project=... and project_repository__repository__status=.... The new endpoints/helpers will raise django.core.exceptions.FieldError: Cannot resolve keyword 'project' into field (and repository) on every GET/POST/PUT/DELETE, and _serialize_project_repo will additionally raise AttributeError because repository is no longer a direct relation.
Fix: replace project=project with project_repository__project=project, repository_id=.../repository_id__in=... with project_repository__repository_id=.../__in=..., repository__status=... with project_repository__repository__status=..., repository__provider/repository__name with project_repository__repository__provider/__name, and access project_repo.project_repository.repository in _serialize_project_repo. For create/delete, construct/select via the ProjectRepository link (e.g. look up or create the ProjectRepository row and pass project_repository=<pr>).
Also found at:
src/sentry/seer/endpoints/project_seer_repos.py:250-282
Medium
Duplicate-repo check runs outside the transaction, causing unhandled IntegrityError under concurrent requests - `src/sentry/seer/autofix/utils.py:895-904`
The connected_ids duplicate check (lines 895–901) is performed before the transaction begins, so two concurrent requests for the same project+repo IDs can both pass the check; the second SeerProjectRepository.objects.create() then violates the unique constraint and raises an unhandled IntegrityError (500). Move the check inside the transaction after select_for_update.
6 skills analyzed
| Skill | Findings | Duration | Cost |
|---|---|---|---|
| security-review | 0 | 2m 31s | $0.91 |
| sentry-backend-bugs | 2 | 10m 24s | $3.38 |
| wrdn-pii | 0 | 1m 50s | $0.12 |
| wrdn-authz | 0 | 4m 58s | $0.66 |
| wrdn-code-execution | 0 | 2m 4s | $0.09 |
| wrdn-data-exfil | 0 | 3m 24s | $0.38 |
⏱ 25m 10s · 4.6M in / 120.5k out · $5.53