Spaces:
Running
Running
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) | |
): | |
""" | |
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 | |
) | |
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}" | |
) |