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}"
        )