from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse, JSONResponse, FileResponse from fastapi.templating import Jinja2Templates import requests import logging import os # ------------------------------ # Setup basic logging # ------------------------------ logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" ) logger = logging.getLogger(__name__) app = FastAPI() templates = Jinja2Templates(directory=".") SECURE_API_KEY = os.getenv("SECURE_API_KEY") BASE_API_URL = "https://script.google.com/macros/s/AKfycbwuRcqUlVroX4qGzBKNpC9mVa6ftGlNL2adJmVBxNW5-VFhj67WRTbFYh-QYXxobCC5ew/exec" @app.get("/style.css") async def get_style(): return FileResponse("style.css", media_type="text/css") @app.get("/", response_class=HTMLResponse) async def index(request: Request, ln: str = "", le: str = "", oe: str = ""): """ Pass query parameters to the front-end to pre-fill the form. ln = lead name le = lead email oe = owner / sales rep email """ return templates.TemplateResponse( "index.html", { "request": request, "lead_name": ln, "lead_email": le, "sales_rep_email": oe } ) @app.get("/available") async def available(name: str, email: str, salesRepEmail: str): """ Return available slots for a given salesRepEmail """ try: slot_resp = requests.get(f"{BASE_API_URL}?action=getAvailableSlots&salesRepEmail={salesRepEmail}") slots = slot_resp.json() if isinstance(slots, dict) and "error" in slots: return {"error": slots["error"]} if not slots: return {"slots": [], "repEmail": salesRepEmail} return {"slots": slots, "repEmail": salesRepEmail} except Exception as e: logger.exception("Error fetching slots") return {"error": str(e)} @app.post("/book") async def book_meeting(booking: dict): name = booking.get("name") email = booking.get("email") salesRepEmail = booking.get("salesRepEmail") selectedSlot = booking.get("selectedSlot") try: response = requests.get( f"{BASE_API_URL}?action=createBooking&customerName={name}&customerEmail={email}" f"&salesRepEmail={salesRepEmail}&selectedSlot={selectedSlot}" ) response_data = response.json() if response.content else {} if "error" in response_data: return JSONResponse(status_code=400, content={"message": response_data["error"]}) return JSONResponse(status_code=200, content={"message": "Booking confirmed!", "data": response_data}) except Exception as e: logger.exception("Error while creating booking") return JSONResponse(status_code=500, content={"message": f"Failed to create booking. {str(e)}"})