import funciones from fastapi import FastAPI, Form, HTTPException from fastapi.responses import JSONResponse from typing import Optional from fastapi.middleware.cors import CORSMiddleware #FUTURE: Quizá en el futuro cambiarla de Form a Json con Pydantic. app = FastAPI() # Configuración de CORS origins = [ "http://localhost", "http://localhost:8000", # Si usas algún puerto específico para tu frontend "http://127.0.0.1:5500", # Puerto común de Live Server "https://buy.splashmix.com", # Si despliegas tu frontend, añade su dominio aquí "*" # ¡CUIDADO! '*' permite CUALQUIER origen. Úsalo solo para desarrollo o si sabes lo que haces. # Es más seguro especificar orígenes concretos en producción. ] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, # Permite cookies, cabeceras de autorización, etc. allow_methods=["*"], # Permite todos los métodos (GET, POST, PUT, DELETE, etc.) allow_headers=["*"], # Permite todas las cabeceras ) # Nuevo endpoint para Health Check @app.get("/health", tags=["Health Check"], description="Verifica el estado de salud de la API.", summary="Health Check" ) async def health_check(): """ Este endpoint devuelve una respuesta 200 OK para indicar que la API está funcionando. """ return JSONResponse(content={"status": "ok"}, status_code=200) @app.post("/creaCliente/") async def creaCliente( email: str = Form(...), firebase_user: Optional[str] = Form(None), site: Optional[str] = Form(None), ): """ Busca un cliente existente en Stripe, priorizando el Firebase User ID. Si no existe, lo busca por email. Si tampoco existe, lo crea. Args: email (str): El correo electrónico del cliente. firebase_user (str, opcional): El ID de usuario de Firebase asociado. **Identificador principal.** site (str, opcional): El nombre del sitio de origen. Returns: dict: Un diccionario con el ID del cliente de Stripe (existente o nuevo) si la operación fue exitosa, indicando cómo fue encontrado o si fue creado. O un error si la operación falló. """ try: customer_result = funciones.create_stripe_customer( email=email, firebase_user=firebase_user, site=site ) if customer_result: customer, status = customer_result # Desempaca el objeto customer y el estado message_text = "" if status == "found_by_firebase_user": message_text = "Cliente existente encontrado exitosamente por Firebase User ID." elif status == "found_by_email": message_text = "Cliente existente encontrado exitosamente por email." elif status == "created": message_text = "Nuevo cliente creado exitosamente." else: message_text = "Operación de cliente exitosa." # Fallback response_data = { "message": message_text, "status": status, # Agregamos el estado específico también "customer_id": customer.id, "customer_email": customer.email } if customer.metadata: if 'firebase_user' in customer.metadata: response_data['firebase_user'] = customer.metadata.firebase_user if 'site' in customer.metadata: response_data['site'] = customer.metadata.site return response_data else: raise HTTPException(status_code=500, detail="No se pudo procesar la operación del cliente en Stripe. Verifica los logs del servidor.") except HTTPException as e: raise e except Exception as e: raise HTTPException(status_code=500, detail=f"Ocurrió un error inesperado al procesar la solicitud: {str(e)}") @app.post("/creaLinkSesion/") async def creaLinkSesion( price_id: str = Form(...), customer_email: Optional[str] = Form(None), customer_id: Optional[str] = Form(None), firebase_user: Optional[str] = Form(None) # <-- ¡Nuevo parámetro para Firebase User ID! ): """ Crea una Checkout Session, ahora con la opción de buscar/crear cliente usando firebase_user. """ # Llama a la función de Stripe con el nuevo parámetro return funciones.create_checkout_session(price_id, customer_email, customer_id, firebase_user)