83 lines
3.4 KiB
Python
83 lines
3.4 KiB
Python
"""
|
|
Base de datos Supabase PostgreSQL — conexión y utilidades.
|
|
"""
|
|
import os
|
|
from supabase import create_client, Client
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
SUPABASE_URL = os.getenv("SUPABASE_URL", "https://qckndtzudciejpnwqfzt.supabase.co")
|
|
SUPABASE_KEY = os.getenv("SUPABASE_ANON_KEY", "sb_publishable_FQR0WXK6joM043Qve9gz3A_pJfAH...")
|
|
|
|
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
|
|
|
|
|
|
def get_db() -> Client:
|
|
"""Retorna cliente Supabase."""
|
|
return supabase
|
|
|
|
|
|
async def init_db() -> None:
|
|
"""
|
|
Inicializa BD. En Supabase, tablas ya existen en el schema_supabase.sql.
|
|
Esta función valida conexión y seed data si es necesario.
|
|
"""
|
|
try:
|
|
# Valida conexión leyendo rutas
|
|
result = supabase.table("rutas").select("id").eq("id", "RUTA-01").execute()
|
|
if not result.data:
|
|
# Seed data si no existe
|
|
_seed_datos_demo()
|
|
print("✓ BD Supabase inicializada")
|
|
except Exception as e:
|
|
print(f"✗ Error inicialización BD: {e}")
|
|
raise
|
|
|
|
|
|
def _seed_datos_demo() -> None:
|
|
"""Inserta datos demo si no existen."""
|
|
try:
|
|
# Rutas
|
|
supabase.table("rutas").insert({
|
|
"id": "RUTA-01",
|
|
"nombre": "Ruta 01 — Sector Centro",
|
|
"turno": "mañana"
|
|
}).execute()
|
|
|
|
# Puntos ruta
|
|
puntos = [
|
|
{"ruta_id": "RUTA-01", "orden": 1, "nombre": "Estación Central", "lat": 20.5238, "lng": -100.8143, "tiempo_estimado_min": 0},
|
|
{"ruta_id": "RUTA-01", "orden": 2, "nombre": "Col. Independencia", "lat": 20.5255, "lng": -100.8090, "tiempo_estimado_min": 8},
|
|
{"ruta_id": "RUTA-01", "orden": 3, "nombre": "Blvd. A. López Mateos", "lat": 20.5271, "lng": -100.8021, "tiempo_estimado_min": 18},
|
|
{"ruta_id": "RUTA-01", "orden": 4, "nombre": "Col. Jardines del Bosque", "lat": 20.5290, "lng": -100.7965, "tiempo_estimado_min": 28},
|
|
{"ruta_id": "RUTA-01", "orden": 5, "nombre": "Mercado Hidalgo", "lat": 20.5310, "lng": -100.7910, "tiempo_estimado_min": 38},
|
|
]
|
|
for punto in puntos:
|
|
supabase.table("puntos_ruta").insert(punto).execute()
|
|
|
|
# Truck status
|
|
supabase.table("truck_status").insert({
|
|
"route_id": "RUTA-01",
|
|
"current_position_id": 1,
|
|
"status": "EN_RUTA"
|
|
}).execute()
|
|
|
|
# Notification templates
|
|
templates = [
|
|
{"trigger_event": "ruta_iniciada", "title": "Ruta iniciada", "body": "El camión ha comenzado su ruta. Prepárate."},
|
|
{"trigger_event": "aproximandose", "title": "¡Camión cerca!", "body": "El camión llega en ~{eta} minutos. Saca tu basura."},
|
|
{"trigger_event": "falla_mecanica", "title": "Aviso de servicio", "body": "El camión reportó una falla. Te notificaremos cuando se reanude."},
|
|
{"trigger_event": "ruta_tarde", "title": "Cambio de horario", "body": "El camión de la mañana pasará en el turno de la tarde."},
|
|
{"trigger_event": "completado", "title": "Ruta completada", "body": "El camión completó su paso por tu zona. ¡Hasta mañana!"},
|
|
]
|
|
for template in templates:
|
|
try:
|
|
supabase.table("notification_templates").insert(template).execute()
|
|
except:
|
|
pass # Ignorar duplicados
|
|
|
|
print("✓ Datos demo insertados")
|
|
except Exception as e:
|
|
print(f"✗ Error seed data: {e}")
|