Faltam restrições NOT NULL e de unicidade no DB

Olá,

Gostaria de reportar algumas validações/restrições que existem nos modelos, mas estão faltando no banco de dados.

Requisitos NOT NULL ausentes

PostDetail - key, value são obrigatórios no modelo, mas são permitidos como nulos no banco de dados.

  1. Obrigatório no modelo (app/models/post_detail.rb):

    validates_presence_of   :key, :value
    

    …Mas nulo no banco de dados

    discourse_development=# \d post_details
                                            Table "public.post_details"
       Column   |            Type             | Collation | Nullable |                 Default
    ------------+-----------------------------+-----------+----------+------------------------------------------
     ...
     key        | character varying           |           |          |
     value      | character varying           |           |          |
    

    Se adicionarmos uma restrição NOT NULL ao banco de dados, ainda será possível que uma string vazia seja inserida, mas acho que ter NOT NULL tornará o sistema um pouco mais seguro.

Restrições de unicidade ausentes

  1. TagGroup - name. Único no modelo (app/models/tag_group.rb)

    validates_uniqueness_of :name, case_sensitive: false
    

    Mas o índice de unicidade está faltando no banco de dados

    discourse_development=# \d tag_groups
    ...
    Indexes:
        "tag_groups_pkey" PRIMARY KEY, btree (id)
    
  2. Da mesma forma, WatchedWord - word. (app/models/watched_word.rb)

    validates :word,   presence: true, uniqueness: true, length: { maximum: 50 }
    

    O banco de dados possui um índice único em (action, word), mas não em (word) sozinho:

    discourse_development=# \d watched_words
    ...
    Indexes:
        "watched_words_pkey" PRIMARY KEY, btree (id)
        "index_watched_words_on_action_and_word" UNIQUE, btree (action, word)
    
  3. Finalmente, WebHookEventType - name. (app/models/web_hook_event_type.rb):

    validates :name, presence: true, uniqueness: true
    

    Restrição de unicidade ausente no banco de dados:

    discourse_development=# \d web_hook_event_types
    ...
    Indexes:
        "web_hook_event_types_pkey" PRIMARY KEY, btree (id)
    

Talvez alguém possa confirmar se essas observações parecem razoáveis. É possível que elas ajudem a prevenir um bug antes que ele aconteça. Além disso, se for o caso, a correção parece ser bastante direta, e ficarei feliz em criar um pull request se isso for útil.

Obrigado.

Restrições de unicidade insensíveis a maiúsculas e minúsculas são um pouco complicadas. Estou inseguro em adicionar a extensão citext para isso, e seríamos forçados a usar name_lower e duplicar a coluna apenas para adicionar o índice.

Sim, devemos corrigir isso.

Também é aceitável adicionar um índice aqui.