Browse Source

feat(projects): Allow filtering on dsn (#44130)

Evan Purkhiser 2 years ago
parent
commit
a0d8de45b9

+ 2 - 0
src/sentry/api/endpoints/project_index.py

@@ -71,6 +71,8 @@ class ProjectIndexEndpoint(Endpoint):
                             "project_id"
                         )
                     )
+                elif key == "dsn":
+                    queryset = queryset.filter(key_set__public_key__in=value)
                 elif key == "id":
                     queryset = queryset.filter(id__in=value)
                 else:

+ 20 - 1
tests/sentry/api/endpoints/test_project_index.py

@@ -1,7 +1,7 @@
 from django.urls import reverse
 from rest_framework import status
 
-from sentry.models import Project, ProjectStatus, SentryAppInstallationToken
+from sentry.models import Project, ProjectKey, ProjectStatus, SentryAppInstallationToken
 from sentry.models.apitoken import ApiToken
 from sentry.testutils import APITestCase
 
@@ -111,6 +111,25 @@ class ProjectsListTest(APITestCase):
         response = self.get_success_response(qs_params={"query": "slug:baz"})
         assert len(response.data) == 0
 
+    def test_dsn_filter(self):
+        Project.objects.all().delete()
+
+        user = self.create_user()
+        org = self.create_organization()
+        team = self.create_team(organization=org, members=[user])
+        project1 = self.create_project(teams=[team])
+        key = ProjectKey.objects.get_or_create(project=project1)[0]
+        self.create_project(teams=[team])
+
+        self.login_as(user=user)
+
+        response = self.get_success_response(qs_params={"query": f"dsn:{key.public_key}"})
+        assert len(response.data) == 1
+        assert response.data[0]["id"] == str(project1.id)
+
+        response = self.get_success_response(qs_params={"query": "dsn:nope"})
+        assert len(response.data) == 0
+
     def test_id_query(self):
         Project.objects.all().delete()