Просмотр исходного кода

ref(integrations): add abstract search_issues method for issue integrations (#76311)

Cathy Teng 6 месяцев назад
Родитель
Сommit
c24c702ab7

+ 7 - 0
src/sentry/integrations/bitbucket/issues.py

@@ -171,3 +171,10 @@ class BitbucketIssuesSpec(SourceCodeIssueIntegration):
                 )
             except ApiError as e:
                 self.raise_error(e)
+
+    def search_issues(self, query: str | None, **kwargs) -> dict[str, Any]:
+        client = self.get_client()
+        repo = kwargs["repo"]
+        resp = client.search_issues(repo, query)
+        assert isinstance(resp, dict)
+        return resp

+ 1 - 1
src/sentry/integrations/bitbucket/search.py

@@ -48,7 +48,7 @@ class BitbucketSearchEndpoint(IntegrationEndpoint):
 
             full_query = f'title~"{query}"'
             try:
-                resp = installation.get_client().search_issues(repo, full_query)
+                resp = installation.search_issues(query=full_query, repo=repo)
             except ApiError as e:
                 if "no issue tracker" in str(e):
                     logger.info(

+ 3 - 0
src/sentry/integrations/example/integration.py

@@ -191,6 +191,9 @@ class ExampleIntegration(RepositoryIntegration, SourceCodeIssueIntegration, Issu
     def has_repo_access(self, repo: RpcRepository) -> bool:
         return False
 
+    def search_issues(self, query: str | None, **kwargs):
+        return []
+
 
 class ExampleIntegrationProvider(IntegrationProvider):
     """

+ 4 - 3
src/sentry/integrations/github/integration.py

@@ -296,9 +296,10 @@ class GitHubIntegration(RepositoryIntegration, GitHubIssuesSpec, CommitContextIn
 
         return trees
 
-    # TODO(cathy): define in issue ABC
-    def search_issues(self, query: str) -> Mapping[str, Sequence[Mapping[str, Any]]]:
-        return self.get_client().search_issues(query)
+    def search_issues(self, query: str | None, **kwargs) -> dict[str, Any]:
+        resp = self.get_client().search_issues(query)
+        assert isinstance(resp, dict)
+        return resp
 
 
 class GitHubIntegrationProvider(IntegrationProvider):

+ 1 - 1
src/sentry/integrations/github_enterprise/integration.py

@@ -203,7 +203,7 @@ class GitHubEnterpriseIntegration(
     def extract_source_path_from_source_url(self, repo: Repository, url: str) -> str:
         raise IntegrationFeatureNotImplementedError
 
-    def search_issues(self, query):
+    def search_issues(self, query: str | None, **kwargs):
         return self.get_client().search_issues(query)
 
     def has_repo_access(self, repo: RpcRepository) -> bool:

+ 7 - 2
src/sentry/integrations/gitlab/integration.py

@@ -1,5 +1,6 @@
 from __future__ import annotations
 
+from typing import Any
 from urllib.parse import urlparse
 
 from django import forms
@@ -172,9 +173,13 @@ class GitlabIntegration(RepositoryIntegration, GitlabIssuesSpec, CommitContextIn
         return client.search_projects(group_id, query)
 
     # TODO(cathy): define in issue ABC
-    def search_issues(self, project_id, query, iids):
+    def search_issues(self, query: str | None, **kwargs) -> list[dict[str, Any]]:
         client = self.get_client()
-        return client.search_project_issues(project_id, query, iids)
+        project_id = kwargs["project_id"]
+        iids = kwargs["iids"]
+        resp = client.search_project_issues(project_id, query, iids)
+        assert isinstance(resp, list)
+        return resp
 
 
 class InstallationForm(forms.Form):

+ 4 - 2
src/sentry/integrations/jira/integration.py

@@ -451,9 +451,11 @@ class JiraIntegration(IssueSyncIntegration):
             issue_id, group_note.data["external_id"], quoted_comment
         )
 
-    def search_issues(self, query):
+    def search_issues(self, query: str | None, **kwargs) -> dict[str, Any]:
         try:
-            return self.get_client().search_issues(query)
+            resp = self.get_client().search_issues(query)
+            assert isinstance(resp, dict)
+            return resp
         except ApiError as e:
             self.raise_error(e)
 

+ 4 - 2
src/sentry/integrations/jira_server/integration.py

@@ -572,9 +572,11 @@ class JiraServerIntegration(IssueSyncIntegration):
             issue_id, group_note.data["external_id"], quoted_comment
         )
 
-    def search_issues(self, query):
+    def search_issues(self, query: str | None, **kwargs) -> dict[str, Any]:
         try:
-            return self.get_client().search_issues(query)
+            resp = self.get_client().search_issues(query)
+            assert isinstance(resp, dict)
+            return resp
         except ApiError as e:
             self.raise_error(e)
 

+ 4 - 1
src/sentry/integrations/jira_server/search.py

@@ -8,6 +8,7 @@ from sentry.api.api_owners import ApiOwner
 from sentry.api.api_publish_status import ApiPublishStatus
 from sentry.api.base import control_silo_endpoint
 from sentry.integrations.api.bases.integration import IntegrationEndpoint
+from sentry.integrations.jira_server.integration import JiraServerIntegration
 from sentry.integrations.models.integration import Integration
 from sentry.organizations.services.organization import RpcOrganization
 from sentry.shared_integrations.exceptions import ApiError, ApiUnauthorized, IntegrationError
@@ -23,7 +24,7 @@ class JiraServerSearchEndpoint(IntegrationEndpoint):
     }
     provider = "jira_server"
 
-    def _get_integration(self, organization, integration_id):
+    def _get_integration(self, organization, integration_id) -> Integration:
         return Integration.objects.get(
             organizationintegration__organization_id=organization.id,
             id=integration_id,
@@ -38,6 +39,8 @@ class JiraServerSearchEndpoint(IntegrationEndpoint):
         except Integration.DoesNotExist:
             return Response(status=404)
         installation = integration.get_installation(organization.id)
+
+        assert isinstance(installation, JiraServerIntegration), installation
         jira_client = installation.get_client()
 
         field = request.GET.get("field")

+ 4 - 0
src/sentry/integrations/mixins/issues.py

@@ -303,6 +303,10 @@ class IssueBasicIntegration(IntegrationInstallation, ABC):
         """
         raise NotImplementedError
 
+    @abstractmethod
+    def search_issues(self, query: str | None, **kwargs) -> list[dict[str, Any]] | dict[str, Any]:
+        raise NotImplementedError
+
     def after_link_issue(self, external_issue, **kwargs):
         """
         Takes the external issue that has been linked via `get_issue`.

Некоторые файлы не были показаны из-за большого количества измененных файлов