Substituto recomendado para modifyClass("model:composer") ao sobrescrever save()

Estou migrando para longe da api.modifyClass("model:composer", ...) obsoleta.

A minha substituição atual de Composer#save altera condicionalmente o comportamento de salvamento, mas, caso contrário, precisa chamar super.save(opts).

Vejo as novas APIs addModelMethod / addModelCallback, mas não consigo encontrar um exemplo no núcleo do uso de addModelMethod para substituir um método existente mantendo o acesso à implementação original.

addModelMethod é destinado a substituir métodos de modelo existentes dessa forma? Se for, como um plugin deve delegar para a implementação original de save()?

Ou há outro ponto de extensão que deve ser usado para este caso de uso do Composer?

Acho que depende do que você quer fazer ao sobrescrever o método save

Se você quer impedir o salvamento com base em alguma condição, pode usar nosso transformador de valor composer-service-cannot-submit-post

Se você quer fazer algo depois que a publicação for criada, existe api.onAppEvent("post:created")

Se você está adicionando um campo, existe api.serializeOnCreate

Alguma dessas opções atende ao que você procura?

Obrigado! Já estou usando composer-service-cannot-submit-post — ele cuida da verificação em nível de serviço. Mas o save() do modelo do compositor também verifica cantSubmitPost, que inclui missingReplyCharacters > 0, então um corpo vazio ainda é bloqueado ali.

onAppEvent("post:created") é tarde demais porque a postagem nunca é criada, e serializeOnCreate apenas adiciona campos à solicitação, então não ajuda com a validação do comprimento do corpo.

Então, o problema restante é contornar missingReplyCharacters / cantSubmitPost para a primeira postagem. Existe um ponto de extensão suportado para isso?

Aqui está o inicializador atual para referência:

@david, ficaria grato por qualquer opinião que você possa ter sobre a melhor abordagem aqui.

A melhor solução seria adicionar um novo hook ao núcleo do Discourse que permita alcançar o que você precisa de uma forma suportada. Que tal algo como este:

Dessa forma, seu plugin faria o seguinte:

api.registerValueTransformer(
  "composer-minimum-post-length",
  ({ value, context: { composer } }) => {
    if (
      composer.siteSettings.discourse_optional_topic_body_enabled &&
      composer.topicFirstPost
    ) {
      return 0;
    }

    return value; // Mantém a lógica do núcleo
  }
);

Me avise se isso funciona para o seu caso de uso e eu retiro o PR do rascunho para que ele possa ser revisado e mesclado.

Obrigado, David! Testei o transformador composer-minimum-post-length e ele funciona — tópicos com corpos vazios são criados com sucesso.

Uma coisa que notei: o editor ainda exibe “Post can’t be empty”, porque a validation em composer-editor tem uma verificação replyLength < 1 fixa que não usa minimumPostLength.

Essa verificação também poderia respeitar o transformador, ou ser ignorada quando minimumPostLength é 0?

Boa ideia - adicionei ao PR :+1:

Agora funciona perfeitamente. Muito obrigado por adicionar isso, @david! :raising_hands: