51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
from pathlib import Path
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from fastapi.staticfiles import StaticFiles
|
|
|
|
from backend.api import accounts, balance, banks, charts, import_api, settings_api
|
|
from backend.db.database import init_db
|
|
|
|
init_db()
|
|
|
|
app = FastAPI(title="Income Calculator", version="0.1.0")
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=["*"],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
app.include_router(banks.router)
|
|
app.include_router(accounts.router)
|
|
app.include_router(import_api.router)
|
|
app.include_router(balance.router)
|
|
app.include_router(charts.router)
|
|
app.include_router(settings_api.router)
|
|
|
|
# Статика Vue (собранная в frontend/dist)
|
|
static_path = Path(__file__).resolve().parent.parent / "frontend" / "dist"
|
|
if static_path.exists():
|
|
app.mount("/assets", StaticFiles(directory=static_path / "assets"), name="assets")
|
|
|
|
@app.get("/")
|
|
def index():
|
|
from fastapi.responses import FileResponse
|
|
return FileResponse(static_path / "index.html")
|
|
|
|
@app.get("/{full_path:path}")
|
|
def serve_spa(full_path: str):
|
|
from fastapi.responses import FileResponse
|
|
if full_path.startswith("api/"):
|
|
return FileResponse(static_path / "index.html") # let API handle; this won't be hit
|
|
f = static_path / full_path
|
|
if f.is_file():
|
|
return FileResponse(f)
|
|
return FileResponse(static_path / "index.html")
|
|
else:
|
|
@app.get("/")
|
|
def root():
|
|
return {"message": "Backend running. Build frontend: cd frontend && npm run build"}
|