Files
org-parking/main.py
Stefano Manfredi ce9e2fdf2a fix landing page
2025-12-02 23:18:43 +00:00

139 lines
3.7 KiB
Python

"""
Parking Manager Application
FastAPI + SQLite + Vanilla JS
"""
from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse, RedirectResponse, JSONResponse
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
from app import config
from app.routes.auth import router as auth_router
from app.routes.users import router as users_router
from app.routes.managers import router as managers_router
from app.routes.presence import router as presence_router
from app.routes.parking import router as parking_router
from database.connection import init_db
# Rate limiter setup
limiter = Limiter(key_func=get_remote_address)
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Initialize database on startup"""
config.logger.info("Starting Parking Manager application")
init_db()
config.logger.info("Database initialized")
yield
config.logger.info("Shutting down Parking Manager application")
app = FastAPI(title="Parking Manager", version="1.0.0", lifespan=lifespan)
# Add rate limiter
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
# CORS
app.add_middleware(
CORSMiddleware,
allow_origins=config.ALLOWED_ORIGINS,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# API Routes
app.include_router(auth_router)
app.include_router(users_router)
app.include_router(managers_router)
app.include_router(presence_router)
app.include_router(parking_router)
# Static Files
app.mount("/css", StaticFiles(directory=str(config.FRONTEND_DIR / "css")), name="css")
app.mount("/js", StaticFiles(directory=str(config.FRONTEND_DIR / "js")), name="js")
# Page Routes
@app.get("/")
async def index():
"""Landing page"""
return FileResponse(config.FRONTEND_DIR / "pages" / "landing.html")
@app.get("/login")
async def login_page():
"""Login page"""
return FileResponse(config.FRONTEND_DIR / "pages" / "login.html")
@app.get("/register")
async def register_page():
"""Register page"""
return FileResponse(config.FRONTEND_DIR / "pages" / "register.html")
@app.get("/dashboard")
async def dashboard():
"""Dashboard - redirect to team calendar"""
return RedirectResponse(url="/team-calendar", status_code=302)
@app.get("/presence")
async def presence_page():
"""My Presence page"""
return FileResponse(config.FRONTEND_DIR / "pages" / "presence.html")
@app.get("/team-calendar")
async def team_calendar_page():
"""Team Calendar page"""
return FileResponse(config.FRONTEND_DIR / "pages" / "team-calendar.html")
@app.get("/team-rules")
async def team_rules_page():
"""Team Rules page"""
return FileResponse(config.FRONTEND_DIR / "pages" / "team-rules.html")
@app.get("/admin/users")
async def admin_users_page():
"""Admin Users page"""
return FileResponse(config.FRONTEND_DIR / "pages" / "admin-users.html")
@app.get("/profile")
async def profile_page():
"""Profile page"""
return FileResponse(config.FRONTEND_DIR / "pages" / "profile.html")
@app.get("/settings")
async def settings_page():
"""Settings page"""
return FileResponse(config.FRONTEND_DIR / "pages" / "settings.html")
@app.get("/favicon.svg")
async def favicon():
"""Favicon"""
return FileResponse(config.FRONTEND_DIR / "favicon.svg", media_type="image/svg+xml")
@app.get("/health")
async def health():
"""Health check"""
return {"status": "ok"}
if __name__ == "__main__":
import uvicorn
uvicorn.run("main:app", host=config.HOST, port=config.PORT, reload=True)