Files
AnchorOS/scripts/check-connection.sh
Marco Gallegos 4707ddbd5a feat(salonos): implementar Fase 1.1 y 1.2 - Infraestructura y Esquema de Base de Datos
Implementación completa de la Fase 1.1 y 1.2 del proyecto SalonOS:

## Cambios en Reglas de Negocio (PRD.md, AGENTS.md, TASKS.md)
- Actualizado reset de invitaciones de mensual a semanal (Lunes 00:00 UTC)
- Jerarquía de roles actualizada: Admin > Manager > Staff > Artist > Customer
- Artistas (antes colaboradoras) ahora tienen rol 'artist'
- Staff/Manager/Admin pueden ver PII de customers
- Artist solo ve nombre y notas de customers (restricción de privacidad)

## Estructura del Proyecto (Next.js 14)
- app/boutique/: Frontend de cliente
- app/hq/: Dashboard administrativo
- app/api/: API routes
- components/: Componentes UI reutilizables (boutique, hq, shared)
- lib/: Lógica de negocio (supabase, db, utils)
- db/: Esquemas, migraciones y seeds
- integrations/: Stripe, Google Calendar, WhatsApp
- scripts/: Scripts de utilidad y automatización
- docs/: Documentación del proyecto

## Esquema de Base de Datos (Supabase PostgreSQL)
8 tablas creadas:
- locations: Ubicaciones con timezone
- resources: Recursos físicos (estaciones, habitaciones, equipos)
- staff: Personal con roles jerárquicos
- services: Catálogo de servicios
- customers: Información de clientes con tier (free/gold)
- invitations: Sistema de invitaciones semanales
- bookings: Sistema de reservas con short_id (6 caracteres)
- audit_logs: Registro de auditoría automática

14 funciones creadas:
- generate_short_id(): Generador de Short ID (6 chars, collision-safe)
- generate_invitation_code(): Generador de códigos de invitación (10 chars)
- reset_weekly_invitations_for_customer(): Reset individual de invitaciones
- reset_all_weekly_invitations(): Reset masivo de invitaciones
- validate_secondary_artist_role(): Validación de secondary_artist
- log_audit(): Trigger de auditoría automática
- get_current_user_role(): Obtener rol del usuario actual
- is_staff_or_higher(): Verificar si es admin/manager/staff
- is_artist(): Verificar si es artist
- is_customer(): Verificar si es customer
- is_admin(): Verificar si es admin
- update_updated_at(): Actualizar timestamps
- generate_booking_short_id(): Generar Short ID automáticamente
- get_week_start(): Obtener inicio de semana

17+ triggers activos:
- Auditores automáticos en tablas críticas
- Timestamps updated_at en todas las tablas
- Validación de secondary_artist (trigger en lugar de constraint)

20+ políticas RLS configuradas:
- Restricción crítica: Artist no ve email/phone de customers
- Jerarquía de roles: Admin > Manager > Staff > Artist > Customer
- Políticas granulares por tipo de operación y rol

6 tipos ENUM:
- user_role: admin, manager, staff, artist, customer
- customer_tier: free, gold
- booking_status: pending, confirmed, cancelled, completed, no_show
- invitation_status: pending, used, expired
- resource_type: station, room, equipment
- audit_action: create, update, delete, reset_invitations, payment, status_change

## Scripts de Utilidad
- check-connection.sh: Verificar conexión a Supabase
- simple-verify.sh: Verificar migraciones instaladas
- simple-seed.sh: Crear datos de prueba
- create-auth-users.js: Crear usuarios de Auth en Supabase
- verify-migration.sql: Script de verificación SQL completo
- seed-data.sql: Script de seed de datos SQL completo

## Documentación
- docs/STEP_BY_STEP_VERIFICATION.md: Guía paso a paso de verificación
- docs/STEP_BY_STEP_AUTH_CONFIG.md: Guía paso a paso de configuración Auth
- docs/POST_MIGRATION_SUCCESS.md: Guía post-migración
- docs/MIGRATION_CORRECTION.md: Detalle de correcciones aplicadas
- docs/QUICK_START_POST_MIGRATION.md: Guía rápida de referencia
- docs/SUPABASE_DASHBOARD_MIGRATION.md: Guía de ejecución en Dashboard
- docs/00_FULL_MIGRATION_FINAL_README.md: Guía de migración final
- SIMPLE_GUIDE.md: Guía simple de inicio
- FASE_1_STATUS.md: Estado de la Fase 1

## Configuración
- package.json: Dependencias y scripts de npm
- tsconfig.json: Configuración TypeScript con paths aliases
- next.config.js: Configuración Next.js
- tailwind.config.ts: Tema personalizado con colores primary, secondary, gold
- postcss.config.js: Configuración PostCSS
- .gitignore: Archivos excluidos de git
- .env.example: Template de variables de entorno

## Correcciones Aplicadas
1. Constraint de subquery en CHECK reemplazado por trigger de validación
   - PostgreSQL no permite subqueries en CHECK constraints
   - validate_secondary_artist_role() ahora es un trigger

2. Variable no declarada en loop
   - customer_record RECORD; añadido en bloque DECLARE

## Principios Implementados
- UTC-first: Todos los timestamps se almacenan en UTC
- Sistema Doble Capa: Validación Staff/Artist + Recurso físico
- Reset semanal: Invitaciones se resetean cada Lunes 00:00 UTC
- Idempotencia: Procesos de reset son idempotentes y auditados
- Privacidad: Artist solo ve nombre y notas de customers
- Auditoría: Todas las acciones críticas se registran automáticamente
- Short ID: 6 caracteres alfanuméricos como referencia humana
- UUID: Identificador primario interno

## Próximos Pasos
- Ejecutar scripts de verificación y seed
- Configurar Auth en Supabase Dashboard
- Implementar Tarea 1.3: Short ID & Invitaciones (backend)
- Implementar Tarea 1.4: CRM Base (endpoints CRUD)
2026-01-15 14:58:28 -06:00

158 lines
4.7 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Script para verificar conexión a Supabase y desbloquear puertos
# Ejecutar con: ./scripts/check-connection.sh
echo "=========================================="
echo "SALONOS - VERIFICACIÓN DE CONEXIÓN"
echo "=========================================="
echo ""
# Cargar variables de entorno
set -a
source .env.local
set +a
if [ -z "$NEXT_PUBLIC_SUPABASE_URL" ] || [ -z "$SUPABASE_SERVICE_ROLE_KEY" ]; then
echo "❌ ERROR: Faltan variables de entorno"
echo "Asegúrate de tener NEXT_PUBLIC_SUPABASE_URL y SUPABASE_SERVICE_ROLE_KEY en .env.local"
exit 1
fi
# Extraer host de la URL
DB_HOST="${NEXT_PUBLIC_SUPABASE_URL#https://}"
echo "📊 Información de conexión:"
echo " Host: $DB_HOST"
echo " Puerto: 5432"
echo ""
# 1. Verificar si psql está instalado
echo "1⃣ Verificando si psql está instalado..."
if command -v psql &> /dev/null; then
PSQL_VERSION=$(psql --version)
echo " ✅ psql instalado: $PSQL_VERSION"
else
echo " ❌ psql NO está instalado"
echo ""
echo " Para instalar psql:"
echo " - macOS: brew install postgresql"
echo " - Ubuntu/Debian: sudo apt-get install postgresql-client"
echo " - Windows: Descargar desde https://www.postgresql.org/download/windows/"
exit 1
fi
echo ""
# 2. Verificar conectividad con ping
echo "2⃣ Verificando conectividad con ping..."
if ping -c 2 -4 $DB_HOST &> /dev/null; then
echo " ✅ Host alcanzable"
else
echo " ❌ Host NO alcanzable"
echo " Verifica tu conexión a internet"
exit 1
fi
echo ""
# 3. Verificar si el puerto 5432 está abierto
echo "3⃣ Verificando si el puerto 5432 está abierto..."
if command -v nc &> /dev/null; then
if nc -z -w5 $DB_HOST 5432 2>/dev/null; then
echo " ✅ Puerto 5432 está abierto"
else
echo " ❌ Puerto 5432 está bloqueado"
echo ""
echo " 📋 SOLUCIÓN:"
echo " El puerto 5432 está bloqueado, posiblemente por:"
echo " 1. Firewall de tu empresa/ISP"
echo " 2. VPN corporativa"
echo " 3. Configuración de red local"
echo ""
echo " Opciones:"
echo " a. Usar Supabase Dashboard (recomendado)"
echo " b. Configurar VPN para permitir el puerto 5432"
echo " c. Usar túnel SSH para bypass del firewall"
echo " d. Contactar a tu administrador de red"
exit 1
fi
else
echo " ⚠️ nc no está disponible, no se puede verificar el puerto"
echo " Continuando con la prueba de conexión..."
fi
echo ""
# 4. Configurar DATABASE_URL
DB_URL="postgresql://postgres:${SUPABASE_SERVICE_ROLE_KEY}@${DB_HOST}:5432/postgres"
# 5. Probar conexión a la base de datos
echo "4⃣ Probar conexión a la base de datos..."
if psql "$DB_URL" -c "SELECT 'Connection successful' as status;" &> /dev/null; then
echo " ✅ Conexión a base de datos exitosa"
else
echo " ❌ Conexión a base de datos fallida"
echo ""
echo " 📋 SOLUCIÓN:"
echo " 1. Verifica que las credenciales sean correctas"
echo " 2. Verifica que el proyecto de Supabase esté activo"
echo " 3. Verifica que el service_role_key sea correcto"
echo " 4. Si el puerto está bloqueado, usa Supabase Dashboard"
exit 1
fi
echo ""
# 6. Verificar tablas
echo "5⃣ Verificando tablas..."
TABLE_COUNT=$(psql "$DB_URL" -t -c "
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name IN ('locations', 'resources', 'staff', 'services', 'customers', 'invitations', 'bookings', 'audit_logs');
")
echo " ✅ Tablas encontradas: $TABLE_COUNT/8"
# 7. Verificar funciones
echo "6⃣ Verificando funciones..."
FUNC_COUNT=$(psql "$DB_URL" -t -c "
SELECT COUNT(*)
FROM information_schema.routines
WHERE routine_schema = 'public';
")
echo " ✅ Funciones encontradas: $FUNC_COUNT"
echo ""
# 8. Resumen
echo "=========================================="
echo "RESUMEN"
echo "=========================================="
echo "Host: $DB_HOST"
echo "Puerto: 5432"
echo "psql: ✅ Instalado"
echo "Conexión: ✅ Exitosa"
echo "Tablas: $TABLE_COUNT/8"
echo "Funciones: $FUNC_COUNT"
echo "=========================================="
if [ "$TABLE_COUNT" -eq 8 ] && [ "$FUNC_COUNT" -ge 14 ]; then
echo ""
echo "🎉 CONEXIÓN VERIFICADA EXITOSAMENTE"
echo ""
echo "Próximos pasos:"
echo "1. Ejecutar: ./scripts/simple-verify.sh"
echo "2. Ejecutar: ./scripts/simple-seed.sh"
echo "3. Ejecutar: node scripts/create-auth-users.js"
echo ""
echo "O usar Supabase Dashboard:"
echo "https://supabase.com/dashboard/project/pvvwbnybkadhreuqijsl/sql"
else
echo ""
echo "⚠️ ALGUNOS ELEMENTOS FALTAN"
echo "Por favor, ejecuta las migraciones nuevamente"
fi