from fba.models import blocks
from fba.models import instances
-router = fastapi.FastAPI(docs_url=config.get("base_url") + "/docs", redoc_url=config.get("base_url") + "/redoc")
+# Base URL for all our own requests
+_base_url = config.get("base_url")
+
+router = fastapi.FastAPI(docs_url=_base_url + "/docs", redoc_url=_base_url + "/redoc")
router.mount(
"/static",
StaticFiles(directory=Path(__file__).parent.absolute() / "static"),
templates = Jinja2Templates(directory="templates")
-@router.get(config.get("base_url") + "/api/info.json", response_class=JSONResponse)
+@router.get(_base_url + "/api/info.json", response_class=JSONResponse)
def api_info() -> None:
database.cursor.execute("SELECT (SELECT COUNT(domain) FROM instances) AS total_websites, (SELECT COUNT(domain) FROM instances WHERE software IN ('pleroma', 'mastodon', 'lemmy', 'friendica', 'misskey', 'peertube', 'takahe', 'gotosocial', 'brighteon', 'wildebeest', 'bookwyrm', 'mitra', 'areionskey', 'mammuthus', 'neodb', 'smithereen', 'vebinet', 'toki', 'snac', 'biblioreads', 'wordpress', 'oolong', 'diaspora')) AS supported_instances, (SELECT COUNT(blocker) FROM blocks) AS total_blocks, (SELECT COUNT(domain) FROM instances WHERE last_error_details IS NOT NULL) AS erroneous_instances")
})
-@router.get(config.get("base_url") + "/api/scoreboard.json", response_class=JSONResponse)
+@router.get(_base_url + "/api/scoreboard.json", response_class=JSONResponse)
def api_scoreboard(mode: str, amount: int) -> None:
if amount > config.get("api_limit"):
raise HTTPException(status_code=400, detail="Too many results")
return JSONResponse(status_code=200, content=scores)
-@router.get(config.get("base_url") + "/api/list.json", response_class=JSONResponse)
+@router.get(_base_url + "/api/list.json", response_class=JSONResponse)
def api_list(request: Request, mode: str, value: str, amount: int) -> None:
if mode is None or value is None or amount is None:
raise HTTPException(status_code=500, detail="No filter specified")
domainlist = database.cursor.fetchall()
return domainlist
-@router.get(config.get("base_url") + "/api/top.json", response_class=JSONResponse)
+@router.get(_base_url + "/api/top.json", response_class=JSONResponse)
def api_top(request: Request, mode: str, value: str, amount: int) -> None:
if mode is None or value is None or amount is None:
raise HTTPException(status_code=500, detail="No filter specified")
return result
-@router.get(config.get("base_url") + "/api/domain.json", response_class=JSONResponse)
+@router.get(_base_url + "/api/domain.json", response_class=JSONResponse)
def api_domain(domain: str) -> None:
if domain is None:
raise HTTPException(status_code=400, detail="Invalid request, parameter 'domain' missing")
return JSONResponse(status_code=200, content=dict(domain_data))
-@router.get(config.get("base_url") + "/api/mutual.json", response_class=JSONResponse)
+@router.get(_base_url + "/api/mutual.json", response_class=JSONResponse)
def api_mutual(domains: list[str] = Query()) -> None:
"""Return 200 if federation is open between the two, 4xx otherwise"""
database.cursor.execute(
# No known blocks
return JSONResponse(status_code=200, content={})
-@router.get(config.get("base_url") + "/.well-known/nodeinfo", response_class=JSONResponse)
+@router.get(_base_url + "/.well-known/nodeinfo", response_class=JSONResponse)
def wellknown_nodeinfo(request: Request) -> None:
return JSONResponse(status_code=200, content={
"links": ({
})
})
-@router.get(config.get("base_url") + "/nodeinfo/1.0", response_class=JSONResponse)
+@router.get(_base_url + "/nodeinfo/1.0", response_class=JSONResponse)
def nodeinfo_1_0(request: Request) -> None:
return JSONResponse(status_code=200, content={
"version": "1.0",
},
})
-@router.get(config.get("base_url") + "/api/v1/instance/domain_blocks", response_class=JSONResponse)
+@router.get(_base_url + "/api/v1/instance/domain_blocks", response_class=JSONResponse)
def api_domain_blocks(request: Request) -> None:
blocked = blacklist.get_all()
blocking = []
return JSONResponse(status_code=200, content=blocking)
-@router.get(config.get("base_url") + "/api/v1/instance/peers", response_class=JSONResponse)
+@router.get(_base_url + "/api/v1/instance/peers", response_class=JSONResponse)
def api_peers(request: Request) -> None:
database.cursor.execute("SELECT domain FROM instances WHERE nodeinfo_url IS NOT NULL")
return JSONResponse(status_code=200, content=peers)
-@router.get(config.get("base_url") + "/scoreboard")
+@router.get(_base_url + "/scoreboard")
def scoreboard(request: Request, mode: str, amount: int) -> None:
if mode == "":
raise HTTPException(status_code=400, detail="No mode specified")
"scores" : json_helper.from_response(response)
})
-@router.get(config.get("base_url") + "/list")
+@router.get(_base_url + "/list")
def list_domains(request: Request, mode: str, value: str, amount: int = config.get("api_limit")) -> None:
if mode == "detection_mode" and not instances.valid(value, "detection_mode"):
raise HTTPException(status_code=500, detail="Invalid detection mode provided")
"theme" : config.get("theme"),
})
-@router.get(config.get("base_url") + "/top")
+@router.get(_base_url + "/top")
def top(request: Request, mode: str, value: str, amount: int = config.get("api_limit")) -> None:
if mode == "block_level" and not blocks.valid(value, "block_level"):
raise HTTPException(status_code=500, detail="Invalid block level provided")
"theme" : config.get("theme"),
})
-@router.get(config.get("base_url") + "/infos")
+@router.get(_base_url + "/infos")
def infos(request: Request, domain: str) -> None:
if domain is None:
raise HTTPException(status_code=400, detail="Invalid request, parameter 'domain' missing")
"slogan" : config.get("slogan"),
})
-@router.get(config.get("base_url") + "/rss")
+@router.get(_base_url + "/rss")
def rss(request: Request, domain: str = None) -> None:
if domain is not None:
domain = tidyup.domain(domain).encode("idna").decode("utf-8")
"Content-Type": "routerlication/rss+xml"
})
-@router.get(config.get("base_url") + "/robots.txt", response_class=PlainTextResponse)
+@router.get(_base_url + "/robots.txt", response_class=PlainTextResponse)
def robots(request: Request) -> None:
return templates.TemplateResponse("views/robots.txt", {
"request" : request,
- "base_url": config.get("base_url")
+ "base_url": _base_url
})
-@router.get(config.get("base_url") + "/")
+@router.get(_base_url + "/")
def index(request: Request) -> None:
# Get info
response = requests.get(