Moibe's picture
Remove all origins
f57a56e
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
@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}"
)