|
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 |
|
|
|
|
|
app = FastAPI(title="Tabble - Hotel Management App") |
|
|
|
|
|
app.add_middleware( |
|
CORSMiddleware, |
|
allow_origins=["*"], |
|
allow_credentials=True, |
|
allow_methods=["*"], |
|
allow_headers=["*"], |
|
) |
|
|
|
|
|
app.mount("/static", StaticFiles(directory="app/static"), name="static") |
|
|
|
|
|
templates = Jinja2Templates(directory="templates") |
|
|
|
|
|
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) |
|
|
|
|
|
create_tables() |
|
|
|
|
|
react_build_dir = "frontend/build" |
|
has_react_build = os.path.isdir(react_build_dir) |
|
|
|
if has_react_build: |
|
|
|
app.mount("/", StaticFiles(directory=react_build_dir, html=True), name="react") |
|
|
|
|
|
|
|
@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}) |
|
|
|
|
|
|
|
@app.get("/chef", response_class=HTMLResponse) |
|
async def chef_page(request: Request): |
|
return templates.TemplateResponse("chef/index.html", {"request": request}) |
|
|
|
|
|
|
|
@app.get("/chef/orders", response_class=HTMLResponse) |
|
async def chef_orders_page(request: Request): |
|
return templates.TemplateResponse("chef/orders.html", {"request": request}) |
|
|
|
|
|
|
|
@app.get("/customer", response_class=HTMLResponse) |
|
async def customer_login_page(request: Request): |
|
return templates.TemplateResponse("customer/login.html", {"request": request}) |
|
|
|
|
|
|
|
@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}, |
|
) |
|
|
|
|
|
|
|
@app.get("/admin", response_class=HTMLResponse) |
|
async def admin_page(request: Request): |
|
return templates.TemplateResponse("admin/index.html", {"request": request}) |
|
|
|
|
|
|
|
@app.get("/admin/dishes", response_class=HTMLResponse) |
|
async def admin_dishes_page(request: Request): |
|
return templates.TemplateResponse("admin/dishes.html", {"request": request}) |
|
|
|
|
|
|
|
@app.get("/analysis", response_class=HTMLResponse) |
|
async def analysis_page(request: Request): |
|
return templates.TemplateResponse("analysis/index.html", {"request": request}) |
|
|
|
|
|
|
|
@app.get("/analysis/chef", response_class=HTMLResponse) |
|
async def chef_analysis_page(request: Request): |
|
return templates.TemplateResponse("analysis/chef.html", {"request": request}) |
|
|
|
|
|
|
|
@app.get("/analysis/customer", response_class=HTMLResponse) |
|
async def customer_analysis_page(request: Request): |
|
return templates.TemplateResponse("analysis/customer.html", {"request": request}) |
|
|
|
|
|
|
|
@app.get("/analysis/dish", response_class=HTMLResponse) |
|
async def dish_analysis_page(request: Request): |
|
return templates.TemplateResponse("analysis/dish.html", {"request": request}) |
|
|
|
|
|
if __name__ == "__main__": |
|
uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True) |
|
|