Spaces:
Sleeping
Sleeping
File size: 3,917 Bytes
90537f3 9d5f319 90537f3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
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
@app.on_event("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
@app.get("/health")
async def health_check():
return {"status": "healthy", "message": "Tabble API is running"}
# Root route - serve React app in production, otherwise serve index.html template
@app.get("/", response_class=HTMLResponse)
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
@app.get("/chef", response_class=HTMLResponse)
async def chef_page(request: Request):
return templates.TemplateResponse("chef/index.html", {"request": request})
# Chef orders page
@app.get("/chef/orders", response_class=HTMLResponse)
async def chef_orders_page(request: Request):
return templates.TemplateResponse("chef/orders.html", {"request": request})
# Customer login page
@app.get("/customer", response_class=HTMLResponse)
async def customer_login_page(request: Request):
return templates.TemplateResponse("customer/login.html", {"request": request})
# Customer menu page
@app.get("/customer/menu", response_class=HTMLResponse)
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
@app.get("/admin", response_class=HTMLResponse)
async def admin_page(request: Request):
return templates.TemplateResponse("admin/index.html", {"request": request})
# Admin dishes page
@app.get("/admin/dishes", response_class=HTMLResponse)
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)
|