Spaces:
Running
Running
File size: 5,163 Bytes
2695e7b b45248f 2695e7b 73e18ed b45248f 5b38336 f2528b2 5b38336 73e18ed f57a56e 73e18ed bddc6a2 64e0349 03e7a68 64e0349 f2528b2 64e0349 f2528b2 03e7a68 64e0349 03e7a68 f2528b2 03e7a68 64e0349 03e7a68 64e0349 03e7a68 64e0349 03e7a68 f2528b2 03e7a68 f2528b2 03e7a68 f2528b2 03e7a68 64e0349 03e7a68 64e0349 11cdb7c 5607f58 b45248f 5607f58 b45248f 11cdb7c 5607f58 b45248f 5607f58 b45248f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
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}"
) |