diff --git a/funkwhale_network/db.py b/funkwhale_network/db.py index 9553ea973c28c673d72f42b22e68d8fdb234f180..d98336783a1b1a265fe3293f57d410609d5361ef 100644 --- a/funkwhale_network/db.py +++ b/funkwhale_network/db.py @@ -118,15 +118,22 @@ async def get_stats(conn): def get_domain_query(**kwargs): - supported_fields = [ - "up", - "open_registrations", - "federation_enabled", - "anonymous_can_listen", - "private", - ] + supported_fields = dict( + [ + ("up", "up"), + ("open_registrations", "open_registrations"), + ("federation_enabled", "federation_enabled"), + ("anonymous_can_listen", "anonymous_can_listen"), + ("private", "private"), + ("blocked", "domains.blocked"), + ] + ) base_query = "SELECT DISTINCT on (domain) domain, * FROM checks INNER JOIN domains ON checks.domain = domains.name{where_clause} ORDER BY domain, time DESC" - filters = [(key, value) for key, value in kwargs.items() if key in supported_fields] + filters = [ + (supported_fields[key], value) + for key, value in kwargs.items() + if key in supported_fields + ] if not filters: return base_query.format(where_clause=""), [] diff --git a/funkwhale_network/routes.py b/funkwhale_network/routes.py index 1a0a530858930b15fcdc938e49c45068897a8106..ba6a5fb4d4f6a9e487837d3eaf2fca3dee292f04 100644 --- a/funkwhale_network/routes.py +++ b/funkwhale_network/routes.py @@ -51,7 +51,9 @@ async def domains(request): if request.method == "GET": filters = await parser.parse(domain_filters, request) limit = filters.pop("limit", 0) - rows = await db.get_domains(request["conn"], private=False, **filters) + rows = await db.get_domains( + request["conn"], private=False, blocked=False, **filters + ) total = len(rows) if limit: rows = rows[:limit] diff --git a/tests/factories.py b/tests/factories.py index 938c27c632be7497bf4b8f7c4d08446195b867fc..94bc6655a329ef9e588f37206368d409d900bf89 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -43,6 +43,7 @@ class DBFactory(factory.Factory): class DomainFactory(DBFactory): name = factory.Faker("domain_name") node_name = factory.Faker("paragraph") + blocked = False class CheckFactory(DBFactory): diff --git a/tests/test_routes.py b/tests/test_routes.py index fbe969819a44b9f1fbcf5d2af7465b427423f1a2..3c5fbc105f230320191ffa511e2f2e5b7eb08770 100644 --- a/tests/test_routes.py +++ b/tests/test_routes.py @@ -74,6 +74,24 @@ async def test_domains_get_filter_up(db_conn, client, factories, field, value): } +async def test_domains_exclude_blocked(db_conn, client, factories): + + blocked = await factories["Domain"].c(blocked=True) + await factories["Check"].c(private=False, domain=blocked["name"]) + check = await factories["Check"].c(private=False) + domain = await db.get_domain(db_conn, check["domain"]) + check["first_seen"] = domain["first_seen"] + check["node_name"] = domain["node_name"] + resp = await client.get("/api/domains") + assert resp.status == 200 + assert await resp.json() == { + "count": 1, + "next": None, + "previous": None, + "results": [serializers.serialize_domain_from_check(check)], + } + + async def test_domains_create(client, coroutine_mock, mocker): payload = {"name": "test.domain"} mocker.patch("funkwhale_network.crawler.fetch_nodeinfo", coroutine_mock())