-- Add user groups feature -- Groups table CREATE TABLE IF NOT EXISTS groups ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(255) NOT NULL UNIQUE, description TEXT, is_system BOOLEAN NOT NULL DEFAULT false, created_at TIMESTAMP NOT NULL DEFAULT NOW(), updated_at TIMESTAMP NOT NULL DEFAULT NOW() ); -- User groups junction table CREATE TABLE IF NOT EXISTS user_groups ( user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, group_id UUID NOT NULL REFERENCES groups(id) ON DELETE CASCADE, assigned_at TIMESTAMP NOT NULL DEFAULT NOW(), assigned_by UUID REFERENCES users(id), PRIMARY KEY (user_id, group_id) ); -- Group roles junction table (groups can have roles) CREATE TABLE IF NOT EXISTS group_roles ( group_id UUID NOT NULL REFERENCES groups(id) ON DELETE CASCADE, role_id UUID NOT NULL REFERENCES roles(id) ON DELETE CASCADE, granted_at TIMESTAMP NOT NULL DEFAULT NOW(), PRIMARY KEY (group_id, role_id) ); -- Indexes CREATE INDEX IF NOT EXISTS idx_groups_name ON groups(name); CREATE INDEX IF NOT EXISTS idx_user_groups_user_id ON user_groups(user_id); CREATE INDEX IF NOT EXISTS idx_user_groups_group_id ON user_groups(group_id); CREATE INDEX IF NOT EXISTS idx_group_roles_group_id ON group_roles(group_id); CREATE INDEX IF NOT EXISTS idx_group_roles_role_id ON group_roles(role_id); -- Insert default system groups INSERT INTO groups (name, description, is_system) VALUES ('wheel', 'System administrators group', true), ('operators', 'System operators group', true), ('backup', 'Backup operators group', true), ('auditors', 'Auditors group', true), ('storage_admins', 'Storage administrators group', true), ('services', 'Service accounts group', true) ON CONFLICT (name) DO NOTHING;