erp-construccion-database-v2/fix_auth_tables.sql
Adrian Flores Cortes 5f009673aa [REMEDIATION] feat: Database schema updates and recreate script enhancement
Major overhaul of drop-and-recreate-database.sh, DDL schema updates,
seed data cleanup. Add utility scripts for auth table fixes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-05 23:18:19 -06:00

71 lines
2.6 KiB
SQL

-- Fix auth tables for erp_construccion_demo
-- 1. Add missing columns to auth.users
ALTER TABLE auth.users ADD COLUMN IF NOT EXISTS roles VARCHAR[] DEFAULT ARRAY['viewer']::VARCHAR[];
ALTER TABLE auth.users ADD COLUMN IF NOT EXISTS default_tenant_id UUID;
ALTER TABLE auth.users ADD COLUMN IF NOT EXISTS last_login_at TIMESTAMPTZ;
ALTER TABLE auth.users ADD COLUMN IF NOT EXISTS username VARCHAR(100);
-- 2. Add missing columns to auth.tenants
ALTER TABLE auth.tenants ADD COLUMN IF NOT EXISTS code VARCHAR(50) UNIQUE;
ALTER TABLE auth.tenants ADD COLUMN IF NOT EXISTS settings JSONB DEFAULT '{}';
ALTER TABLE auth.tenants ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ;
-- Update tenants code from slug
UPDATE auth.tenants SET code = slug WHERE code IS NULL;
-- 3. Create refresh_tokens table
CREATE TABLE IF NOT EXISTS auth.refresh_tokens (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
token TEXT NOT NULL UNIQUE,
expires_at TIMESTAMPTZ NOT NULL,
revoked_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
user_agent VARCHAR(500),
ip_address VARCHAR(45)
);
CREATE INDEX IF NOT EXISTS idx_refresh_tokens_user ON auth.refresh_tokens(user_id);
CREATE INDEX IF NOT EXISTS idx_refresh_tokens_token ON auth.refresh_tokens(token);
CREATE INDEX IF NOT EXISTS idx_refresh_tokens_expires ON auth.refresh_tokens(expires_at);
-- 4. Create test tenant if not exists
INSERT INTO auth.tenants (id, name, slug, code, is_active, created_at, updated_at)
VALUES (
'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',
'Test Company',
'test-company',
'test-company',
true,
NOW(),
NOW()
) ON CONFLICT (id) DO NOTHING;
-- 5. Create admin user with password 'Admin123!'
INSERT INTO auth.users (
id, tenant_id, email, password_hash, first_name, last_name,
is_active, email_verified, roles, default_tenant_id, created_at, updated_at
)
VALUES (
'b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a22',
'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',
'admin@test.com',
'$2a$10$4M7jT3YmH14xyx3L7uojmuRFyggZcM/qb8A/54B2XXDtYBmVI7/J2',
'Admin',
'User',
true,
true,
ARRAY['admin']::VARCHAR[],
'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11',
NOW(),
NOW()
) ON CONFLICT (id) DO UPDATE SET
password_hash = '$2a$10$4M7jT3YmH14xyx3L7uojmuRFyggZcM/qb8A/54B2XXDtYBmVI7/J2',
roles = ARRAY['admin']::VARCHAR[],
default_tenant_id = 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11';
-- 6. Verify
SELECT 'Tenant created:', id, name FROM auth.tenants WHERE id = 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11';
SELECT 'User created:', id, email, roles FROM auth.users WHERE email = 'admin@test.com';