Reemplazo recomendado para modifyClass("model:composer") al sobrescribir save()

Estoy migrando desde la obsoleta api.modifyClass("model:composer", ...).

Mi anulación actual de Composer#save cambia condicionalmente el comportamiento del guardado, pero en otros casos necesita llamar a super.save(opts).

Veo las nuevas APIs addModelMethod / addModelCallback, pero no puedo encontrar un ejemplo en el núcleo que utilice addModelMethod para anular un método existente manteniendo el acceso a la implementación original.

¿Está addModelMethod diseñado para anular métodos de modelo existentes de esta manera? Si es así, ¿cómo debería un plugin delegar a la implementación original de save()?

¿O hay otro punto de extensión que deba utilizarse para este caso de uso de Composer?

Supongo que dependerá de lo que quieras hacer al anular el método save…

Si buscas evitar una guardado basado en alguna condición, podrías usar nuestro transformador de valor composer-service-cannot-submit-post value transformer

Si estás haciendo algo una vez que se crea la publicación, está api.onAppEvent("post:created")

Si estás añadiendo un campo, está api.serializeOnCreate

¿Alguno de esos se ajusta a lo que buscas?

¡Gracias! Ya estoy usando composer-service-cannot-submit-post, que maneja la comprobación a nivel de servicio. Pero el save() del modelo del compositor también comprueba cantSubmitPost, que incluye missingReplyCharacters > 0, por lo que un cuerpo vacío sigue bloqueado ahí.

onAppEvent("post:created") es demasiado tarde porque la publicación nunca se crea, y serializeOnCreate solo añade campos a la solicitud, por lo que no ayuda con la validación de la longitud del cuerpo.

Entonces, el problema restante es saltarse missingReplyCharacters / cantSubmitPost para la primera publicación. ¿Existe un punto de extensión soportado para esto?

Aquí está el inicializador actual para referencia:

@david, te agradecería cualquier aporte que pudieras hacer sobre el mejor enfoque a seguir aquí.

Lo mejor sería añadir un nuevo hook al núcleo de Discourse que te permita lograr lo que necesitas de una forma soportada. ¿Qué te parece algo así:

De esta manera, tu plugin haría lo siguiente:

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

    return value; // Mantener la lógica del núcleo
  }
);

Dime si esto funciona para tu caso de uso y sacaré el PR del estado de borrador para que pueda ser revisado y fusionado.

¡Gracias, David! Probé el transformador composer-minimum-post-length y funciona: los temas con cuerpos vacíos se crean correctamente.

Una cosa que noté: el editor sigue mostrando “Post can’t be empty” porque la validation en composer-editor tiene una comprobación de replyLength < 1 codificada en duras que no utiliza minimumPostLength.

¿Podría esa comprobación también respetar el transformador, o omitirse cuando minimumPostLength es 0?

Suena bien, lo he añadido al PR :+1:

Ahora funciona perfectamente. ¡Muchas gracias por añadir esto, @david! :raising_hands: