File size: 2,407 Bytes
ce0719e
 
 
 
 
 
 
 
 
 
 
 
 
cf289c1
ce0719e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
02a8414
cf289c1
02a8414
4312f62
 
02a8414
 
 
ce0719e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3d6b7f2
 
 
 
 
ce0719e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cf289c1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
from __future__ import annotations

from datetime import timedelta

from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from starlette.middleware.sessions import SessionMiddleware

from app.auth import get_current_admin, get_current_user
from app.config import ROOT_DIR, settings
from app.database import SessionLocal
from app.routes import admin, auth, media, user
from app.services.bootstrap import initialize_database, seed_super_admin
from app.web import redirect, templates


app = FastAPI(title=settings.app_name)
app.add_middleware(SessionMiddleware, secret_key=settings.session_secret, same_site="lax")
app.mount("/static", StaticFiles(directory=str(ROOT_DIR / "app" / "static")), name="static")


@app.on_event("startup")
def on_startup() -> None:
    initialize_database()
    db = SessionLocal()
    try:
        seed_super_admin(db)
    finally:
        db.close()


@app.middleware("http")
async def apply_response_policies(request: Request, call_next):
    response = await call_next(request)
    if request.url.path.startswith("/static"):
        response.headers["Cache-Control"] = "no-store"
    return response


@app.get("/")
def index(request: Request):
    db = SessionLocal()
    try:
        if get_current_admin(request, db):
            return redirect("/admin/dashboard")
        if get_current_user(request, db):
            return redirect("/dashboard")
    finally:
        db.close()
    return redirect("/login")


@app.get("/health")
def health():
    return {"status": "ok"}


@app.get("/favicon.ico", include_in_schema=False)
def favicon():
    return redirect("/static/favicon.ico", status_code=307)


app.include_router(auth.router)
app.include_router(user.router)
app.include_router(admin.router)
app.include_router(media.router)


def format_datetime(value):
    if not value:
        return "-"
    return value.strftime("%Y-%m-%d %H:%M")


def format_timedelta(value):
    if value is None:
        return "-"
    if isinstance(value, int):
        minutes = value
    elif isinstance(value, timedelta):
        minutes = int(value.total_seconds() // 60)
    else:
        return str(value)
    hours, mins = divmod(minutes, 60)
    if hours:
        return f"{hours}小时 {mins}分钟"
    return f"{mins}分钟"


templates.env.filters["datetime_local"] = format_datetime
templates.env.filters["duration_human"] = format_timedelta