/
ring0
/
RestaurantApp
Обзор
Документация
Войти
/
ring0
/
RestaurantApp
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app.py
117 строк
5 KB
ring0
Init project
28 май 2026, 20:53
Верифицирован
28 май 2026, 20:53
e63548a
Код
Авторство
О чём код?
from fastapi import FastAPI, Request, Depends, HTTPException, status from fastapi.responses import HTMLResponse, JSONResponse from fastapi.security import HTTPBasic, HTTPBasicCredentials from fastapi.staticfiles import StaticFiles import secrets import os from dotenv import load_dotenv from db import engine, Base, get_db from manager import TableManager, ReservationManager from models import TableCreate, ReservationCreate, StatusUpdate load_dotenv() app = FastAPI(title="Restaurant Booking System") ADMIN_USERNAME = os.getenv("ADMIN_USERNAME") ADMIN_PASSWORD = os.getenv("ADMIN_PASSWORD") security = HTTPBasic() if not ADMIN_USERNAME or not ADMIN_PASSWORD: print("ERROR: Environment variables ADMIN_USERNAME and ADMIN_PASSWORD must be set!") print("Please check your .env file or set these variables in your environment.") os.exit(1) Base.metadata.create_all(bind=engine) table_manager = TableManager() reservation_manager = ReservationManager() def verify_admin(credentials: HTTPBasicCredentials = Depends(security)): """Проверка Basic аутентификации администратора""" is_correct_username = secrets.compare_digest(credentials.username, ADMIN_USERNAME) is_correct_password = secrets.compare_digest(credentials.password, ADMIN_PASSWORD) if not (is_correct_username and is_correct_password): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", headers={"WWW-Authenticate": "Basic"}, ) return credentials @app.get("/api/tables") async def get_tables(date: str = None, time: str = None): """Получение списка столиков с фильтрацией по дате и времени""" db = next(get_db()) try: tables = table_manager.get_tables(db, date, time) return JSONResponse(content=[t.to_dict() for t in tables]) finally: db.close() @app.post("/api/reservations") async def create_reservation(reservation: ReservationCreate): """Создание бронирования с проверкой конфликтов""" db = next(get_db()) try: result = reservation_manager.create_reservation(db, reservation) if "error" in result: return JSONResponse(content=result, status_code=400) return JSONResponse(content=result, status_code=201) finally: db.close() @app.get("/api/reservations") async def get_reservations(date: str = None, table_id: int = None): """Получение списка бронирований с фильтрацией""" db = next(get_db()) try: reservations = reservation_manager.get_reservations(db, date, table_id) return JSONResponse(content=[r.to_dict() for r in reservations]) finally: db.close() @app.put("/api/reservations/{reservation_id}") async def update_reservation_status( reservation_id: int, status_update: StatusUpdate, credentials: HTTPBasicCredentials = Depends(verify_admin) ): """Изменение статуса бронирования (только для админа)""" db = next(get_db()) try: result = reservation_manager.update_status(db, reservation_id, status_update.status) if "error" in result: return JSONResponse(content=result, status_code=400) return JSONResponse(content=result) finally: db.close() @app.put("/api/tables/{table_id}") async def update_table_status( table_id: int, status_update: StatusUpdate, credentials: HTTPBasicCredentials = Depends(verify_admin) ): """Изменение статуса столика (только для админа)""" db = next(get_db()) try: result = table_manager.update_status(db, table_id, status_update.status) if "error" in result: return JSONResponse(content=result, status_code=400) return JSONResponse(content=result) finally: db.close() @app.get("/", response_class=HTMLResponse) async def guest_interface(): """Клиентский интерфейс для просмотра столиков и создания бронирований""" with open("templates/guest.html", "r", encoding="utf-8") as f: return f.read() @app.get("/admin", response_class=HTMLResponse) async def admin_interface(credentials: HTTPBasicCredentials = Depends(verify_admin)): """Админ-панель для управления статусами (защищена Basic Auth)""" with open("templates/admin.html", "r", encoding="utf-8") as f: return f.read()