diff --git a/output.xml b/output.xml index e3c56c2..a028448 100644 --- a/output.xml +++ b/output.xml @@ -1,7 +1,7 @@ - + diff --git a/src/alpine_bits_python/api.py b/src/alpine_bits_python/api.py index a6b4590..7051914 100644 --- a/src/alpine_bits_python/api.py +++ b/src/alpine_bits_python/api.py @@ -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,56 +211,71 @@ 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) - db_customer = DBCustomer( - given_name=first_name, - surname=last_name, - contact_id=contact_id, - name_prefix=name_prefix, - email_address=email, - phone=phone_number, - email_newsletter=email_newsletter, - address_line=address_line, - city_name=city_name, - postal_code=postal_code, - country_code=country_code, - gender=gender, - birth_date=birth_date, - language=language, - address_catalog=False, - name_title=None, - ) - db.add(db_customer) - await db.commit() - await db.refresh(db_customer) + # Save all relevant data to DB (including new fields) + db_customer = DBCustomer( + given_name=first_name, + surname=last_name, + contact_id=contact_id, + name_prefix=name_prefix, + email_address=email, + phone=phone_number, + email_newsletter=email_newsletter, + address_line=address_line, + city_name=city_name, + postal_code=postal_code, + country_code=country_code, + gender=gender, + birth_date=birth_date, + language=language, + address_catalog=False, + name_title=None, + ) + db.add(db_customer) + await db.commit() + await db.refresh(db_customer) - db_reservation = DBReservation( - customer_id=db_customer.id, - form_id=data.get("formId"), - start_date=date.fromisoformat(start_date) if start_date else None, - end_date=date.fromisoformat(end_date) if end_date else None, - num_adults=num_adults, - num_children=num_children, - children_ages=','.join(str(a) for a in children_ages), - offer=offer, - utm_comment=utm_comment, - created_at=datetime.now(timezone.utc), - utm_source=data.get("field:utm_source"), - utm_medium=data.get("field:utm_medium"), - utm_campaign=data.get("field:utm_campaign"), - utm_term=data.get("field:utm_term"), - utm_content=data.get("field:utm_content"), - user_comment=data.get("field:long_answer_3524", ""), - fbclid=data.get("field:fbclid"), - gclid=data.get("field:gclid"), - hotel_code="123", - hotel_name="Frangart Inn", - ) - db.add(db_reservation) - await db.commit() - await db.refresh(db_reservation) + db_reservation = DBReservation( + customer_id=db_customer.id, + form_id=data.get("formId"), + start_date=date.fromisoformat(start_date) if start_date else None, + end_date=date.fromisoformat(end_date) if end_date else None, + num_adults=num_adults, + num_children=num_children, + children_ages=','.join(str(a) for a in children_ages), + offer=offer, + utm_comment=utm_comment, + created_at=datetime.now(timezone.utc), + utm_source=data.get("field:utm_source"), + utm_medium=data.get("field:utm_medium"), + utm_campaign=data.get("field:utm_campaign"), + utm_term=data.get("field:utm_term"), + utm_content=data.get("field:utm_content"), + user_comment=data.get("field:long_answer_3524", ""), + fbclid=data.get("field:fbclid"), + gclid=data.get("field:gclid"), + hotel_code="123", + hotel_name="Frangart Inn", + ) + db.add(db_reservation) + await db.commit() + await db.refresh(db_reservation) @@ -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(