3c432473e5
Backend: - FastAPI app with 17 REST endpoints covering dashboard, monitoring, media index, file browser, and jobs - Reuses existing clients/domain/services unchanged - pydantic-settings config, dependency injection, CORS setup - Auto-generated OpenAPI docs at /docs Frontend: - Vite + React + TypeScript SPA - @tanstack/react-query for data fetching with polling - ag-grid-react for media table and file browser - recharts for monitoring charts - Tailwind CSS styling - 4 pages: Dashboard, Monitoring, Media, File Browser - Typed API client matching all backend endpoints Also: - docs/MIGRATION_PLAN.md with full architecture plan - Updated .gitignore for both subprojects - Streamlit app preserved for now (can coexist)
52 lines
1.2 KiB
Python
52 lines
1.2 KiB
Python
"""FastAPI application entrypoint."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from contextlib import asynccontextmanager
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
|
|
from routers import dashboard, monitoring, media, files, jobs
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
"""Application lifespan — startup/shutdown."""
|
|
yield
|
|
|
|
|
|
app = FastAPI(
|
|
title="Media Library Viewer API",
|
|
version="0.1.0",
|
|
description="Backend API for Jellyfin media browsing, SSH file inspection, and server monitoring.",
|
|
lifespan=lifespan,
|
|
)
|
|
|
|
# CORS for development (Vite runs on :5173)
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=[
|
|
"http://localhost:5173",
|
|
"http://localhost:3000",
|
|
"http://127.0.0.1:5173",
|
|
"http://127.0.0.1:3000",
|
|
],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
# Register routers
|
|
app.include_router(dashboard.router)
|
|
app.include_router(monitoring.router)
|
|
app.include_router(media.router)
|
|
app.include_router(files.router)
|
|
app.include_router(jobs.router)
|
|
|
|
|
|
@app.get("/api/health")
|
|
def health_check() -> dict[str, str]:
|
|
"""Simple health check endpoint."""
|
|
return {"status": "ok"}
|