Files
org-parking/main.py
Stefano Manfredi 7168fa4b72 Refactor to manager-centric model, add team calendar for all users
Key changes:
- Removed office-centric model (deleted offices.py, office-rules)
- Renamed to team-rules, managers are part of their own team
- Team calendar visible to all (read-only for employees)
- Admins can have a manager assigned
2025-12-02 13:30:04 +00:00

126 lines
3.2 KiB
Python

"""
Parking Manager Application
FastAPI + SQLite + Vanilla JS
"""
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse, RedirectResponse
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
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
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Initialize database on startup"""
init_db()
yield
app = FastAPI(title="Parking Manager", version="1.0.0", lifespan=lifespan)
# 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)