# 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
