WAIter / supabase_client.py
ItzRoBeerT's picture
init project
f810b2f
raw
history blame
3.88 kB
from supabase import create_client
import os
from dotenv import load_dotenv
from typing import Dict, List, Any, Optional
import json
import logging
from utils.classes import Order
# Configurar logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class SupabaseOrderManager:
def __init__(self, url: Optional[str] = None, key: Optional[str] = None):
"""
Inicializa el gestor de órdenes con Supabase.
Args:
url: URL de Supabase (opcional, por defecto usa variables de entorno)
key: Clave de API de Supabase (opcional, por defecto usa variables de entorno)
"""
# Cargar variables de entorno
load_dotenv()
# Usar parámetros proporcionados o variables de entorno
self.supabase_url = url or os.getenv("SUPABASE_URL")
self.supabase_key = key or os.getenv("SUPABASE_KEY")
if not self.supabase_url or not self.supabase_key:
raise ValueError("SUPABASE_URL y SUPABASE_KEY deben estar definidos como variables de entorno o proporcionados como parámetros")
# Inicializar cliente
self.supabase = create_client(self.supabase_url, self.supabase_key)
logger.info("Cliente Supabase inicializado correctamente")
async def send_order(self, order: Order) -> Dict[str, Any]:
"""
Envía una orden a Supabase.
Args:
order: Objeto Order del sistema del restaurante
Returns:
Diccionario con el resultado de la operación
"""
try:
# Convertir el objeto Order a un diccionario
order_dict = order.to_dict()
# 1. Insertar la orden principal
order_data = {
"order_id": order_dict["order_id"],
"table_number": str(order_dict["table_number"]),
"special_instructions": order_dict["special_instructions"],
"status": "pending"
}
# Realizar la inserción de la orden
order_response = self.supabase.table("orders").insert(order_data).execute()
if not order_response.data:
raise Exception("Error al insertar orden en Supabase")
# Obtener el ID de la orden insertada
db_order_id = order_response.data[0]["id"]
# 2. Insertar los elementos de la orden
items_to_insert = []
for item in order_dict["items"]:
items_to_insert.append({
"order_id": db_order_id,
"name": item["name"],
"quantity": item.get("quantity", 1),
"variations": item.get("variations", "")
})
# Realizar la inserción de los elementos
if items_to_insert:
items_response = self.supabase.table("order_items").insert(items_to_insert).execute()
if not items_response.data:
# Si falla la inserción de items, eliminamos la orden para mantener consistencia
self.supabase.table("orders").delete().eq("id", db_order_id).execute()
raise Exception("Error al insertar elementos de la orden en Supabase")
logger.info(f"Orden {order_dict['order_id']} enviada correctamente a Supabase")
return {
"success": True,
"order_id": order_dict["order_id"],
"database_id": db_order_id
}
except Exception as e:
logger.error(f"Error al enviar orden a Supabase: {str(e)}")
return {
"success": False,
"error": str(e)
}