Moibe's picture
Session Via Firebase User Ok!
5607f58
raw
history blame
4.53 kB
import funciones
from fastapi import FastAPI, Form, HTTPException
from fastapi.responses import JSONResponse
from typing import Optional
from fastapi.middleware.cors import CORSMiddleware
#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(...),
customer_email: Optional[str] = Form(None),
customer_id: Optional[str] = Form(None),
firebase_user: Optional[str] = Form(None) # <-- 隆Nuevo par谩metro para Firebase User ID!
):
"""
Crea una Checkout Session, ahora con la opci贸n de buscar/crear cliente
usando firebase_user.
"""
# Llama a la funci贸n de Stripe con el nuevo par谩metro
return funciones.create_checkout_session(price_id, customer_email, customer_id, firebase_user)