8380b1d2cc
serve/server.py is now 69 lines — app factory, middleware, and router
registration only.
New modules:
deps.py (168 lines) — module-level globals + auth dependency functions
models.py (85 lines) — all Pydantic request/response models
tasks.py (136 lines) — background workers and job tracker
routers/ — one file per domain (10 routers, ~2750 lines total)
auth.py, me.py, admin.py, activities.py, uploads.py,
segments.py, strava.py, garmin.py, ideas.py, feed.py
cli.py updated to set globals on deps instead of server.
88 new regression tests in tests/serve/ cover auth guards and key
behaviours for every router; 294 total passing after the split.
70 lines
1.7 KiB
Python
70 lines
1.7 KiB
Python
"""bincio serve — multi-user FastAPI application server.
|
|
|
|
Handles auth, user management, and auth-gated write operations.
|
|
nginx serves static files; this server only handles /api/* routes.
|
|
|
|
Run via `bincio serve` CLI command.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import glob as _glob
|
|
import threading
|
|
from pathlib import Path
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from fastapi.middleware.gzip import GZipMiddleware
|
|
|
|
from bincio.serve import deps, tasks
|
|
from bincio.serve.routers import (
|
|
activities,
|
|
admin,
|
|
auth,
|
|
feed,
|
|
garmin,
|
|
ideas,
|
|
me,
|
|
segments,
|
|
strava,
|
|
uploads,
|
|
)
|
|
|
|
app = FastAPI(title="BincioActivity Serve")
|
|
|
|
|
|
@app.on_event("startup")
|
|
async def _on_startup() -> None:
|
|
"""Startup tasks: clean orphaned tmp zips; launch site-rebuild worker if --webroot set."""
|
|
data_dir = deps._get_data_dir()
|
|
for p in _glob.glob(str(data_dir / "*" / "tmp*.zip")):
|
|
try:
|
|
Path(p).unlink()
|
|
except Exception:
|
|
pass
|
|
if deps.webroot is not None:
|
|
threading.Thread(target=tasks._site_rebuild_worker, daemon=True, name="site-rebuild").start()
|
|
|
|
|
|
app.add_middleware(GZipMiddleware, minimum_size=1024)
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origin_regex=r"https?://localhost(:\d+)?|https://[a-z0-9-]+\.bincio\.org",
|
|
allow_credentials=True,
|
|
allow_methods=["GET", "POST", "DELETE"],
|
|
allow_headers=["Content-Type"],
|
|
)
|
|
|
|
for _router in [
|
|
feed.router,
|
|
auth.router,
|
|
me.router,
|
|
admin.router,
|
|
activities.router,
|
|
uploads.router,
|
|
segments.router,
|
|
strava.router,
|
|
garmin.router,
|
|
ideas.router,
|
|
]:
|
|
app.include_router(_router)
|