32 lines
1.4 KiB
Ruby
32 lines
1.4 KiB
Ruby
# 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
|