Mostly works. Just needs some additional logic to setup the db correctly at the start
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<OTA_ResRetrieveRS xmlns="http://www.opentravel.org/OTA/2003/05" Version="7.000">
|
||||
<ReservationsList>
|
||||
<HotelReservation CreateDateTime="2025-09-29T10:38:06.185987+00:00" ResStatus="Requested" RoomStayReservation="true">
|
||||
<HotelReservation CreateDateTime="2025-09-29T11:03:09.401052+00:00" ResStatus="Requested" RoomStayReservation="true">
|
||||
<UniqueID Type="14" ID="e084006b-ae83-4e4d-b2f5-074118cdb3b1"/>
|
||||
<RoomStays>
|
||||
<RoomStay>
|
||||
|
||||
@@ -4,6 +4,7 @@ from fastapi.security import HTTPBearer, HTTPBasicCredentials, HTTPBasic
|
||||
from .config_loader import load_config
|
||||
from fastapi.responses import HTMLResponse, PlainTextResponse, Response
|
||||
from .models import WixFormSubmission
|
||||
from datetime import datetime, date, timezone
|
||||
from .auth import validate_api_key, validate_wix_signature, generate_api_key
|
||||
from .rate_limit import (
|
||||
limiter,
|
||||
@@ -24,6 +25,8 @@ import xml.etree.ElementTree as ET
|
||||
from .alpinebits_server import AlpineBitsServer, Version
|
||||
import urllib.parse
|
||||
|
||||
from .db import get_async_session, Customer as DBCustomer, Reservation as DBReservation
|
||||
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
@@ -129,7 +132,7 @@ async def health_check(request: Request):
|
||||
|
||||
|
||||
# Extracted business logic for handling Wix form submissions
|
||||
async def process_wix_form_submission(request: Request, data: Dict[str, Any]):
|
||||
async def process_wix_form_submission(request: Request, data: Dict[str, Any], db):
|
||||
"""
|
||||
Shared business logic for handling Wix form submissions (test and production).
|
||||
"""
|
||||
@@ -137,8 +140,8 @@ async def process_wix_form_submission(request: Request, data: Dict[str, Any]):
|
||||
|
||||
|
||||
_LOGGER.info(f"Received Wix form data at {timestamp}")
|
||||
_LOGGER.info(f"Data keys: {list(data.keys())}")
|
||||
_LOGGER.info(f"Full data: {json.dumps(data, indent=2)}")
|
||||
#_LOGGER.info(f"Data keys: {list(data.keys())}")
|
||||
#_LOGGER.info(f"Full data: {json.dumps(data, indent=2)}")
|
||||
log_entry = {
|
||||
"timestamp": timestamp,
|
||||
"client_ip": request.client.host if request.client else "unknown",
|
||||
@@ -162,6 +165,12 @@ async def process_wix_form_submission(request: Request, data: Dict[str, Any]):
|
||||
_LOGGER.info(f"Data logged to: {log_filename}")
|
||||
|
||||
|
||||
|
||||
data = data.get("data") # Handle nested "data" key if present
|
||||
|
||||
|
||||
|
||||
|
||||
# save customer and reservation to DB
|
||||
|
||||
|
||||
@@ -202,6 +211,21 @@ async def process_wix_form_submission(request: Request, data: Dict[str, Any]):
|
||||
|
||||
offer = data.get("field:angebot_auswaehlen")
|
||||
|
||||
# UTM and offer
|
||||
utm_fields = [
|
||||
("utm_Source", "utm_source"),
|
||||
("utm_Medium", "utm_medium"),
|
||||
("utm_Campaign", "utm_campaign"),
|
||||
("utm_Term", "utm_term"),
|
||||
("utm_Content", "utm_content"),
|
||||
]
|
||||
utm_comment_text = []
|
||||
for label, field in utm_fields:
|
||||
val = data.get(f"field:{field}") or data.get(label)
|
||||
if val:
|
||||
utm_comment_text.append(f"{label}: {val}")
|
||||
utm_comment = ",".join(utm_comment_text) if utm_comment_text else None
|
||||
|
||||
# use database session
|
||||
|
||||
# Save all relevant data to DB (including new fields)
|
||||
@@ -269,15 +293,19 @@ async def process_wix_form_submission(request: Request, data: Dict[str, Any]):
|
||||
|
||||
@api_router.post("/webhook/wix-form")
|
||||
@webhook_limiter.limit(WEBHOOK_RATE_LIMIT)
|
||||
async def handle_wix_form(request: Request, data: Dict[str, Any]):
|
||||
async def handle_wix_form(request: Request, data: Dict[str, Any], db_session=Depends(get_async_session)):
|
||||
"""
|
||||
Unified endpoint to handle Wix form submissions (test and production).
|
||||
No authentication required for this endpoint.
|
||||
"""
|
||||
try:
|
||||
return await process_wix_form_submission(request, data)
|
||||
return await process_wix_form_submission(request, data, db_session)
|
||||
except Exception as e:
|
||||
_LOGGER.error(f"Error in handle_wix_form: {str(e)}")
|
||||
# log stacktrace
|
||||
import traceback
|
||||
traceback_str = traceback.format_exc()
|
||||
_LOGGER.error(f"Stack trace for handle_wix_form: {traceback_str}")
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"Error processing Wix form data: {str(e)}"
|
||||
@@ -285,13 +313,13 @@ async def handle_wix_form(request: Request, data: Dict[str, Any]):
|
||||
|
||||
@api_router.post("/webhook/wix-form/test")
|
||||
@limiter.limit(DEFAULT_RATE_LIMIT)
|
||||
async def handle_wix_form_test(request: Request, data: Dict[str, Any]):
|
||||
async def handle_wix_form_test(request: Request, data: Dict[str, Any],db_session=Depends(get_async_session)):
|
||||
"""
|
||||
Test endpoint to verify the API is working with raw JSON data.
|
||||
No authentication required for testing purposes.
|
||||
"""
|
||||
try:
|
||||
return await process_wix_form_submission(request, data)
|
||||
return await process_wix_form_submission(request, data, db_session)
|
||||
except Exception as e:
|
||||
_LOGGER.error(f"Error in handle_wix_form_test: {str(e)}")
|
||||
raise HTTPException(
|
||||
|
||||
Reference in New Issue
Block a user