File size: 2,851 Bytes
c910874
e4193c8
c910874
 
 
e4193c8
c910874
 
 
 
 
 
 
 
 
 
 
 
 
 
e4193c8
 
c910874
 
 
 
 
e4193c8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c910874
 
e4193c8
 
 
 
c910874
e4193c8
c910874
 
e4193c8
c910874
e4193c8
 
c910874
e4193c8
 
c910874
 
 
 
 
 
 
 
 
e4193c8
 
 
 
 
c910874
 
 
 
 
 
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
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)}"})