File size: 4,202 Bytes
2695e7b
64e0349
2695e7b
ddb4143
73e18ed
5b38336
 
 
73e18ed
 
 
 
 
 
25f6e7d
73e18ed
 
 
 
 
 
 
 
 
 
 
bddc6a2
 
 
 
 
 
 
 
 
 
 
 
64e0349
 
 
03e7a68
 
64e0349
 
03e7a68
 
64e0349
 
 
03e7a68
 
64e0349
 
03e7a68
 
 
64e0349
 
03e7a68
 
64e0349
03e7a68
 
64e0349
 
03e7a68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64e0349
03e7a68
64e0349
 
 
 
 
 
 
11cdb7c
 
 
 
 
 
64e0349
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
import funciones
from fastapi import FastAPI, Form, HTTPException
from fastapi.responses import JSONResponse
from typing import Optional
from fastapi.middleware.cors import CORSMiddleware

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 por email.
    Si no existe, lo crea con el email, Firebase User ID y site.

    Args:
        email (str): El correo electrónico del cliente.
        firebase_user (str, opcional): El ID de usuario de Firebase asociado.
        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 si fue encontrado o creado.
              O un error si la operación falló.
    """
    try:
        # Llama a la función 'create_stripe_customer' y desempaca la tupla
        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":
                message_text = "Cliente existente encontrado exitosamente."
            elif status == "created":
                message_text = "Nuevo cliente creado exitosamente."
            else:
                message_text = "Operación de cliente exitosa." # Fallback por si acaso

            response_data = {
                "message": message_text,
                "status": status, # Agregamos el estado explícitamente 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(...), # Sigue siendo requerido, enviado como Form si la petición es multipart/form-data
    customer_email: Optional[str] = Form(None), # Ahora opcional, valor por defecto None
    customer_id: Optional[str] = Form(None)     # Ahora opcional, valor por defecto None
):
    return funciones.create_checkout_session(price_id, customer_email, customer_id)