-- Initialize PostgreSQL Database for Aggios -- Enable UUID extension CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- Tenants table CREATE TABLE IF NOT EXISTS tenants ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(255) NOT NULL, domain VARCHAR(255) UNIQUE NOT NULL, subdomain VARCHAR(63) UNIQUE NOT NULL, cnpj VARCHAR(18), razao_social VARCHAR(255), email VARCHAR(255), phone VARCHAR(20), website VARCHAR(255), address TEXT, city VARCHAR(100), state VARCHAR(2), zip VARCHAR(10), description TEXT, industry VARCHAR(100), is_active BOOLEAN DEFAULT true, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Users table CREATE TABLE IF NOT EXISTS users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID REFERENCES tenants(id) ON DELETE CASCADE, email VARCHAR(255) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, first_name VARCHAR(128), last_name VARCHAR(128), role VARCHAR(50) DEFAULT 'CLIENTE' CHECK (role IN ('SUPERADMIN', 'ADMIN_AGENCIA', 'CLIENTE')), is_active BOOLEAN DEFAULT true, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Refresh tokens table CREATE TABLE IF NOT EXISTS refresh_tokens ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, token_hash VARCHAR(255) NOT NULL, expires_at TIMESTAMP WITH TIME ZONE NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create indexes CREATE INDEX IF NOT EXISTS idx_users_tenant_id ON users(tenant_id); CREATE INDEX IF NOT EXISTS idx_users_email ON users(email); CREATE INDEX IF NOT EXISTS idx_refresh_tokens_user_id ON refresh_tokens(user_id); CREATE INDEX IF NOT EXISTS idx_refresh_tokens_expires_at ON refresh_tokens(expires_at); CREATE INDEX IF NOT EXISTS idx_tenants_subdomain ON tenants(subdomain); CREATE INDEX IF NOT EXISTS idx_tenants_domain ON tenants(domain); -- Companies table CREATE TABLE IF NOT EXISTS companies ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE, cnpj VARCHAR(18) NOT NULL, razao_social VARCHAR(255) NOT NULL, nome_fantasia VARCHAR(255), email VARCHAR(255), telefone VARCHAR(20), status VARCHAR(50) DEFAULT 'active', created_by_user_id UUID REFERENCES users(id), created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, UNIQUE(tenant_id, cnpj) ); -- Create indexes CREATE INDEX IF NOT EXISTS idx_companies_tenant_id ON companies(tenant_id); CREATE INDEX IF NOT EXISTS idx_companies_cnpj ON companies(cnpj); -- Insert SUPERADMIN user (vocĂȘ - admin master da AGGIOS) INSERT INTO users (email, password_hash, first_name, role, is_active) VALUES ('admin@aggios.app', '$2a$10$YourHashedPasswordHere', 'Admin Master', 'SUPERADMIN', true) ON CONFLICT (email) DO NOTHING; -- Insert sample tenant for testing INSERT INTO tenants (name, domain, subdomain, is_active) VALUES ('AgĂȘncia Teste', 'agencia-teste.aggios.app', 'agencia-teste', true) ON CONFLICT DO NOTHING;