workspace-v1/projects/gamilit/database/seeds/prod/auth_management/01-tenants.sql
Adrian Flores Cortes 967ab360bb Initial commit: Workspace v1 with 3-layer architecture
Structure:
- control-plane/: Registries, SIMCO directives, CI/CD templates
- projects/: Gamilit, ERP-Suite, Trading-Platform, Betting-Analytics
- shared/: Libs catalog, knowledge-base

Key features:
- Centralized port, domain, database, and service registries
- 23 SIMCO directives + 6 fundamental principles
- NEXUS agent profiles with delegation rules
- Validation scripts for workspace integrity
- Dockerfiles for all services
- Path aliases for quick reference

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 00:35:19 -06:00

162 lines
5.0 KiB
SQL

-- =====================================================
-- Seed: auth_management.tenants (PROD)
-- Description: Tenant principal de producción
-- Environment: PRODUCTION
-- Dependencies: None
-- Order: 01
-- Created: 2025-11-11
-- Version: 2.0 (reescrito para carga limpia)
-- =====================================================
--
-- CAMBIOS v2.0:
-- - Convertido de STRING a UUID
-- - Agregada columna 'slug' (requerida NOT NULL)
-- - Agregadas 7 columnas faltantes del schema
-- - Cambiado NOW() → gamilit.now_mexico()
-- - Estructura alineada 100% con DDL
--
-- VALIDADO CONTRA:
-- - DDL: ddl/schemas/auth_management/tables/01-tenants.sql
-- - Template: seeds/dev/auth_management/01-tenants.sql
--
-- =====================================================
SET search_path TO auth_management, public;
-- =====================================================
-- INSERT: Tenant Principal de Producción
-- =====================================================
INSERT INTO auth_management.tenants (
id,
name,
slug,
domain,
logo_url,
subscription_tier,
max_users,
max_storage_gb,
is_active,
trial_ends_at,
settings,
metadata,
created_at,
updated_at
) VALUES (
-- UUID real en lugar de STRING
'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'::uuid,
'GAMILIT Platform',
'gamilit-prod', -- NUEVO: slug requerido NOT NULL
'gamilit.com',
'/assets/logo-gamilit.png', -- NUEVO: logo_url
'enterprise', -- NUEVO: subscription_tier
10000, -- NUEVO: max_users
100, -- NUEVO: max_storage_gb
true, -- NUEVO: is_active
NULL, -- NUEVO: trial_ends_at (sin trial en producción)
jsonb_build_object(
'theme', 'detective',
'language', 'es',
'timezone', 'America/Mexico_City',
'features', jsonb_build_object(
'analytics_enabled', true,
'gamification_enabled', true,
'social_features_enabled', true,
'assessments', true,
'progress_tracking', true
),
'limits', jsonb_build_object(
'daily_api_calls', 100000,
'storage_gb', 100,
'max_file_size_mb', 50
),
'contact', jsonb_build_object(
'support_email', 'soporte@gamilit.com',
'admin_email', 'admin@gamilit.com'
),
'branding', jsonb_build_object(
'logo_url', '/assets/logo-gamilit.png',
'primary_color', '#4F46E5',
'secondary_color', '#10B981'
)
),
jsonb_build_object( -- NUEVO: metadata
'description', 'Tenant principal de producción',
'environment', 'production',
'created_by', 'seed_script_v2',
'version', '2.0'
),
gamilit.now_mexico(), -- CORREGIDO: gamilit.now_mexico() en lugar de NOW()
gamilit.now_mexico() -- CORREGIDO: gamilit.now_mexico() en lugar de NOW()
)
ON CONFLICT (id) DO UPDATE SET
name = EXCLUDED.name,
slug = EXCLUDED.slug,
domain = EXCLUDED.domain,
logo_url = EXCLUDED.logo_url,
subscription_tier = EXCLUDED.subscription_tier,
max_users = EXCLUDED.max_users,
max_storage_gb = EXCLUDED.max_storage_gb,
is_active = EXCLUDED.is_active,
trial_ends_at = EXCLUDED.trial_ends_at,
settings = EXCLUDED.settings,
metadata = EXCLUDED.metadata,
updated_at = gamilit.now_mexico();
-- =====================================================
-- Verification Query
-- =====================================================
DO $$
DECLARE
tenant_count INTEGER;
tenant_name TEXT;
tenant_slug TEXT;
BEGIN
SELECT COUNT(*), MAX(name), MAX(slug)
INTO tenant_count, tenant_name, tenant_slug
FROM auth_management.tenants
WHERE id = 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'::uuid;
IF tenant_count = 1 THEN
RAISE NOTICE '✓ Tenant de producción creado correctamente';
RAISE NOTICE ' ID: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11';
RAISE NOTICE ' Name: %', tenant_name;
RAISE NOTICE ' Slug: %', tenant_slug;
ELSE
RAISE WARNING '⚠ Tenant de producción NO fue creado';
END IF;
END $$;
-- =====================================================
-- Validación de Estructura
-- =====================================================
-- Verificar que todas las columnas existan
DO $$
DECLARE
missing_columns TEXT[];
BEGIN
SELECT ARRAY_AGG(column_name) INTO missing_columns
FROM (
SELECT unnest(ARRAY[
'id', 'name', 'slug', 'domain', 'logo_url',
'subscription_tier', 'max_users', 'max_storage_gb',
'is_active', 'trial_ends_at', 'settings', 'metadata',
'created_at', 'updated_at'
]) AS column_name
) expected
WHERE column_name NOT IN (
SELECT column_name
FROM information_schema.columns
WHERE table_schema = 'auth_management'
AND table_name = 'tenants'
);
IF missing_columns IS NOT NULL THEN
RAISE WARNING '⚠ Columnas faltantes en tabla tenants: %', missing_columns;
ELSE
RAISE NOTICE '✓ Todas las columnas del seed están presentes en la tabla';
END IF;
END $$;