-- PostgreSQL database dump
--
-\restrict Ve94ffDejRZQh0k9F68Ox20B8hRjYq5z5defUdh578csjd9BHIC5XKZB0q1nuan
+\restrict EeYKZnslrxGmNaeqO4o6gPUM6JSs7wWdVd6NvcQqHzBRusgbfSbKjYZDw8t1hjq
-- Dumped from database version 17.6 (Debian 17.6-0+deb13u1)
-- Dumped by pg_dump version 17.6 (Debian 17.6-0+deb13u1)
removed_at timestamp with time zone,
removed_by text,
updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
- report_id uuid
+ report_id uuid,
+ block boolean DEFAULT true
);
-- PostgreSQL database dump complete
--
-\unrestrict Ve94ffDejRZQh0k9F68Ox20B8hRjYq5z5defUdh578csjd9BHIC5XKZB0q1nuan
+\unrestrict EeYKZnslrxGmNaeqO4o6gPUM6JSs7wWdVd6NvcQqHzBRusgbfSbKjYZDw8t1hjq
"""
A CTE to access all (active) domains on this list
"""
- cte = (
+ # Fetch all domains that should be blocked
+ blocked_domains = (
sqlmodel
.select(
- domains.Domain.name.label("name"),
- )
- .distinct(
- domains.Domain.name,
+ domains.Domain,
)
.join(
checker.CheckerDomain,
# Select only domains from this list
domains.Domain.list == self,
+ # Only select domains that should be blocked
+ domains.Domain.block == True,
+
# Ignore domains that have been removed
domains.Domain.removed_at == None,
checker.CheckerDomain.status == True,
),
)
- .order_by(
- domains.Domain.name,
+ .cte("blocked_domains")
+ )
+
+ # Fetch all whitelisted domains
+ whitelisted_domains = (
+ sqlmodel
+ .select(
+ domains.Domain,
+ )
+ .where(
+ # Select only domains from this list
+ domains.Domain.list == self,
+
+ # Only select domains that should not be blocked
+ domains.Domain.block == False,
+
+ # Ignore domains that have been removed
+ domains.Domain.removed_at == None,
+ )
+ .cte("whitelisted_domains")
+ )
+
+ # Remove any whitelisted and subdomains of any whitelisted domains
+ # from the list of blocked domains
+ listed_domains = (
+ sqlmodel
+ .select(
+ blocked_domains.c.name,
+ )
+ .distinct(
+ blocked_domains.c.name,
+ )
+ .where(
+ ~sqlmodel.exists(
+ sqlmodel
+ .select(
+ whitelisted_domains.c.name,
+ )
+ .where(
+ (blocked_domains.c.name == whitelisted_domains.c.name) |
+ (blocked_domains.c.name.like("%." + whitelisted_domains.c.name))
+ )
+ )
)
- .cte("domains")
+ .cte("listed_domains")
)
- return cte
+ return listed_domains
@property
def domains(self):