Skip to content

Commit a441f3d

Browse files
committed
add helper
1 parent 6ace6fc commit a441f3d

File tree

1 file changed

+34
-66
lines changed
  • src/sentry/integrations/services/repository

1 file changed

+34
-66
lines changed

src/sentry/integrations/services/repository/impl.py

Lines changed: 34 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,37 @@ def update_repositories(self, *, organization_id: int, updates: list[RpcReposito
128128

129129
Repository.objects.bulk_update(repositories, fields=list(fields_to_update))
130130

131+
def _cleanup_seer_project_repositories(
132+
self,
133+
organization_id: int,
134+
repo_tuples: list[tuple[int, str, str]],
135+
) -> None:
136+
"""Delete SeerProjectRepository rows and call Seer API cleanup.
137+
138+
repo_tuples: list of (repo_id, external_id, provider).
139+
"""
140+
try:
141+
organization = Organization.objects.get_from_cache(id=organization_id)
142+
if features.has("organizations:seer-project-settings-dual-write", organization):
143+
SeerProjectRepository.objects.filter(
144+
repository_id__in=[repo_id for repo_id, _, _ in repo_tuples]
145+
).delete()
146+
except Organization.DoesNotExist:
147+
pass
148+
149+
repos_to_clean = [
150+
{"repo_external_id": external_id, "repo_provider": repo_provider}
151+
for _, external_id, repo_provider in repo_tuples
152+
if external_id and repo_provider
153+
]
154+
if repos_to_clean:
155+
bulk_cleanup_seer_repository_preferences.apply_async(
156+
kwargs={
157+
"organization_id": organization_id,
158+
"repos": repos_to_clean,
159+
}
160+
)
161+
131162
def disable_repositories_for_integration(
132163
self, *, organization_id: int, integration_id: int, provider: str
133164
) -> None:
@@ -143,26 +174,7 @@ def disable_repositories_for_integration(
143174

144175
if repo_ids:
145176
Repository.objects.filter(id__in=repo_ids).update(status=ObjectStatus.DISABLED)
146-
147-
try:
148-
organization = Organization.objects.get_from_cache(id=organization_id)
149-
if features.has("organizations:seer-project-settings-dual-write", organization):
150-
SeerProjectRepository.objects.filter(repository_id__in=repo_ids).delete()
151-
except Organization.DoesNotExist:
152-
pass
153-
154-
repos_to_clean = [
155-
{"repo_external_id": external_id, "repo_provider": repo_provider}
156-
for _, external_id, repo_provider in repos
157-
if external_id and repo_provider
158-
]
159-
if repos_to_clean:
160-
bulk_cleanup_seer_repository_preferences.apply_async(
161-
kwargs={
162-
"organization_id": organization_id,
163-
"repos": repos_to_clean,
164-
}
165-
)
177+
self._cleanup_seer_project_repositories(organization_id, repos)
166178

167179
def disable_repositories_by_external_ids(
168180
self,
@@ -186,26 +198,7 @@ def disable_repositories_by_external_ids(
186198

187199
if repo_ids:
188200
Repository.objects.filter(id__in=repo_ids).update(status=ObjectStatus.DISABLED)
189-
190-
try:
191-
organization = Organization.objects.get_from_cache(id=organization_id)
192-
if features.has("organizations:seer-project-settings-dual-write", organization):
193-
SeerProjectRepository.objects.filter(repository_id__in=repo_ids).delete()
194-
except Organization.DoesNotExist:
195-
pass
196-
197-
repos_to_clean = [
198-
{"repo_external_id": external_id, "repo_provider": repo_provider}
199-
for _, external_id, repo_provider in repos
200-
if external_id and repo_provider
201-
]
202-
if repos_to_clean:
203-
bulk_cleanup_seer_repository_preferences.apply_async(
204-
kwargs={
205-
"organization_id": organization_id,
206-
"repos": repos_to_clean,
207-
}
208-
)
201+
self._cleanup_seer_project_repositories(organization_id, repos)
209202

210203
def disassociate_organization_integration(
211204
self,
@@ -223,19 +216,8 @@ def disassociate_organization_integration(
223216
repo_ids = [repo_id for repo_id, _, _ in repos]
224217

225218
if repo_ids:
226-
# Disassociate repos from the organization integration being deleted
227219
Repository.objects.filter(id__in=repo_ids).update(integration_id=None)
228-
229-
# Delete Seer project preferences for the affected repos.
230-
# Organization may already be deleted if org deletion and integration
231-
# uninstall overlap; skip SeerProjectRepository cleanup in that case
232-
# since cascades will handle it.
233-
try:
234-
organization = Organization.objects.get_from_cache(id=organization_id)
235-
if features.has("organizations:seer-project-settings-dual-write", organization):
236-
SeerProjectRepository.objects.filter(repository_id__in=repo_ids).delete()
237-
except Organization.DoesNotExist:
238-
pass
220+
self._cleanup_seer_project_repositories(organization_id, repos)
239221

240222
# Delete Code Owners with a Code Mapping using the OrganizationIntegration
241223
ProjectCodeOwners.objects.filter(
@@ -248,17 +230,3 @@ def disassociate_organization_integration(
248230
RepositoryProjectPathConfig.objects.filter(
249231
organization_integration_id=organization_integration_id
250232
).delete()
251-
252-
# Delete Seer project preferences for the affected repos via Seer API
253-
repos_to_clean = [
254-
{"repo_external_id": external_id, "repo_provider": provider}
255-
for _, external_id, provider in repos
256-
if external_id and provider
257-
]
258-
if repos_to_clean:
259-
bulk_cleanup_seer_repository_preferences.apply_async(
260-
kwargs={
261-
"organization_id": organization_id,
262-
"repos": repos_to_clean,
263-
}
264-
)

0 commit comments

Comments
 (0)