Spaces:
Sleeping
Sleeping
| import funciones | |
| from typing import Optional, Literal | |
| from fastapi.responses import JSONResponse | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from fastapi import FastAPI, Form, HTTPException, status | |
| #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://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 | |
| 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) | |
| 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)}") | |
| async def creaLinkSesion( | |
| price_id: str = Form(...), | |
| unidades: int = Form(...), # <--- 隆Nuevo par谩metro 'unidades' como int! | |
| mode: Literal["payment", "subscription"] = Form(...), # <--- 隆Nuevo par谩metro 'mode' con validaci贸n! | |
| customer_email: Optional[str] = Form(None), | |
| customer_id: Optional[str] = Form(None), | |
| firebase_user: Optional[str] = Form(None), | |
| gaCliente: Optional[str] = Form(None) | |
| ): | |
| """ | |
| Crea una Checkout Session en Stripe. | |
| Acepta 'unidades' (cantidad) y 'mode' ('payment' o 'subscription'). | |
| """ | |
| try: | |
| # Llama a la funci贸n de Stripe con todos los par谩metros, incluyendo los nuevos | |
| return funciones.create_checkout_session( | |
| price_id, | |
| customer_email, | |
| customer_id, | |
| firebase_user, | |
| unidades, # Pasar el nuevo par谩metro | |
| mode, # Pasar el nuevo par谩metro | |
| gaCliente | |
| ) | |
| except Exception as e: | |
| print(f"Error al crear la sesi贸n de checkout: {e}") | |
| raise HTTPException( | |
| status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, | |
| detail=f"Error interno al intentar crear la sesi贸n de checkout: {e}" | |
| ) |