| from fastapi import FastAPI, Request |
| from fastapi.responses import HTMLResponse, JSONResponse, FileResponse |
| from fastapi.templating import Jinja2Templates |
| import requests |
| import logging |
| import os |
|
|
| |
| |
| |
| 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)}"}) |
|
|