Spaces:
Sleeping
Sleeping
from fastapi import FastAPI, Request, Depends | |
from fastapi.staticfiles import StaticFiles | |
from fastapi.templating import Jinja2Templates | |
from fastapi.responses import HTMLResponse, RedirectResponse, FileResponse | |
from fastapi.middleware.cors import CORSMiddleware | |
from sqlalchemy.orm import Session | |
import uvicorn | |
import os | |
from .database import get_db, create_tables | |
from .routers import chef, customer, admin, feedback, loyalty, selection_offer, table, analytics, settings | |
from .middleware import SessionMiddleware | |
# Create FastAPI app | |
app = FastAPI(title="Tabble - Hotel Management App") | |
# Add CORS middleware to allow cross-origin requests | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], # Allow all origins | |
allow_credentials=True, | |
allow_methods=["*"], # Allow all methods | |
allow_headers=["*"], # Allow all headers | |
) | |
# Add session middleware for database management | |
app.add_middleware(SessionMiddleware, require_database=True) | |
# Mount static files | |
app.mount("/static", StaticFiles(directory="app/static"), name="static") | |
# Setup templates | |
templates = Jinja2Templates(directory="templates") | |
# Include routers | |
app.include_router(chef.router) | |
app.include_router(customer.router) | |
app.include_router(admin.router) | |
app.include_router(feedback.router) | |
app.include_router(loyalty.router) | |
app.include_router(selection_offer.router) | |
app.include_router(table.router) | |
app.include_router(analytics.router) | |
app.include_router(settings.router) | |
# Database initialization on startup | |
async def startup_event(): | |
"""Initialize database tables on application startup""" | |
try: | |
create_tables() | |
except Exception as e: | |
print(f"Warning: Database initialization failed: {e}") | |
# Check if we have the React build folder | |
react_build_dir = "frontend/build" | |
has_react_build = os.path.isdir(react_build_dir) | |
if has_react_build: | |
# Mount the React build folder | |
app.mount("/", StaticFiles(directory=react_build_dir, html=True), name="react") | |
# Health check endpoint for Render | |
async def health_check(): | |
return {"status": "healthy", "message": "Tabble API is running"} | |
# Root route - serve React app in production, otherwise serve index.html template | |
async def root(request: Request): | |
if has_react_build: | |
return FileResponse(f"{react_build_dir}/index.html") | |
return templates.TemplateResponse("index.html", {"request": request}) | |
# Chef page | |
async def chef_page(request: Request): | |
return templates.TemplateResponse("chef/index.html", {"request": request}) | |
# Chef orders page | |
async def chef_orders_page(request: Request): | |
return templates.TemplateResponse("chef/orders.html", {"request": request}) | |
# Customer login page | |
async def customer_login_page(request: Request): | |
return templates.TemplateResponse("customer/login.html", {"request": request}) | |
# Customer menu page | |
async def customer_menu_page(request: Request, table_number: int, unique_id: str): | |
return templates.TemplateResponse( | |
"customer/menu.html", | |
{"request": request, "table_number": table_number, "unique_id": unique_id}, | |
) | |
# Admin page | |
async def admin_page(request: Request): | |
return templates.TemplateResponse("admin/index.html", {"request": request}) | |
# Admin dishes page | |
async def admin_dishes_page(request: Request): | |
return templates.TemplateResponse("admin/dishes.html", {"request": request}) | |
if __name__ == "__main__": | |
PORT = os.getenv("PORT", 8000) | |
uvicorn.run("app.main:app", host="0.0.0.0", port=PORT, reload=True) | |