Moibe's picture
Nuevos Parámetros incluídos en createSession
b45248f
raw
history blame
5.17 kB
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://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(...),
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}"
)