Moibe's picture
Remove all origins
f57a56e
raw
history blame
5.16 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://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}"
)