# Perfil de acesso: o conjunto de permissões que o ADM monta na tela e atribui a # um usuário. # # Antes, quem-vê-o-quê era o papel fixo em `users.role` e um punhado de `if # admin? || gerente?` espalhado pelas policies: tirar as Configurações de UM # gerente exigia editar código e fazer deploy. # # `permissoes` é jsonb (lista de chaves de Permissao::TODAS) e não tabela filha # de propósito: é um conjunto pequeno, sempre lido junto com o perfil, e nunca # consultado ao contrário ("quem tem tal permissão?" se responde em memória). A # validação de quais chaves existem fica no model — o catálogo é código, muda com # deploy, e o banco não pode travar um perfil salvo com uma chave que saiu. class CreatePerfisAcesso < ActiveRecord::Migration[7.1] def change create_table :perfis_acesso do |t| t.string :nome, null: false t.string :descricao t.jsonb :permissoes, null: false, default: [] # sistema: nasce com o app (Administrador, Gerente, ...). Editável e # desativável, mas não apagável — mesma regra de EventoNotificacao#apagavel? t.boolean :sistema, null: false, default: false t.boolean :ativo, null: false, default: true t.timestamps end # Nome é o que identifica o perfil na tela; duplicar só gera erro humano. add_index :perfis_acesso, 'LOWER(nome)', unique: true, name: 'index_perfis_acesso_nome_unico' end end