-- Schema para sistema de usuarios y permisos -- Ejecutar en PostgreSQL (base de datos CONTROLDESK) -- Tabla de usuarios CREATE TABLE IF NOT EXISTS usuarios ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, nombre_completo VARCHAR(100), activo BOOLEAN DEFAULT true, es_admin BOOLEAN DEFAULT false, fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ultimo_acceso TIMESTAMP, CONSTRAINT chk_username_length CHECK (char_length(username) >= 3) ); -- Tabla de permisos de usuario a bases de datos CREATE TABLE IF NOT EXISTS usuario_base_datos ( id SERIAL PRIMARY KEY, usuario_id INTEGER NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE, base_datos_nombre VARCHAR(255) NOT NULL, -- Nombre de la base de datos (visible_name) puede_ver BOOLEAN DEFAULT true, puede_descargar_backup BOOLEAN DEFAULT false, puede_restaurar BOOLEAN DEFAULT false, fecha_asignacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(usuario_id, base_datos_nombre) ); -- Tabla de sesiones CREATE TABLE IF NOT EXISTS sesiones ( id SERIAL PRIMARY KEY, usuario_id INTEGER NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE, token VARCHAR(255) UNIQUE NOT NULL, ip_address VARCHAR(50), user_agent TEXT, fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP, fecha_expiracion TIMESTAMP NOT NULL, activa BOOLEAN DEFAULT true ); -- Índices para mejor rendimiento CREATE INDEX IF NOT EXISTS idx_usuario_base_datos_usuario ON usuario_base_datos(usuario_id); CREATE INDEX IF NOT EXISTS idx_usuario_base_datos_nombre ON usuario_base_datos(base_datos_nombre); CREATE INDEX IF NOT EXISTS idx_usuarios_activo ON usuarios(activo); CREATE INDEX IF NOT EXISTS idx_sesiones_token ON sesiones(token); CREATE INDEX IF NOT EXISTS idx_sesiones_usuario ON sesiones(usuario_id); -- Insertar usuario admin por defecto -- Password: Admin123! -- Nota: Este hash es temporal, debes cambiarlo después del primer inicio de sesión INSERT INTO usuarios (username, email, password_hash, nombre_completo, es_admin, activo) VALUES ( 'admin', 'admin@aduanasoft.com', '$2b$10$rKvvkYpNwF5J5K5J5J5J5uX5X5X5X5X5X5X5X5X5X5X5X5X5X5X5X', 'Administrador del Sistema', true, true ) ON CONFLICT (username) DO NOTHING; -- Comentarios en tablas COMMENT ON TABLE usuarios IS 'Usuarios del sistema de gestión de bases de datos'; COMMENT ON TABLE usuario_base_datos IS 'Permisos de acceso de usuarios a bases de datos específicas'; COMMENT ON TABLE sesiones IS 'Sesiones activas de usuarios';