Включение пользовательских полей Composer при сохранении черновика

Недавно я начал разбираться с ошибкой в плагине Events: данные о событиях, отображаемые в редакторе, теряются, если пост сохраняется как черновик.

Я попытался исправить проблему и вскоре выяснил, что в Discourse нет API, которое позволяло бы это сделать.

С точки зрения UX это важная функция, имеющая множество потенциальных сценариев использования, выходящих за рамки моей конкретной задачи.

Поэтому я подготовил PR, который решает эту проблему, добавляя новый метод serializeToDraft в модель Composer. Этот метод будет сохранять эти пользовательские поля при сохранении поста как черновика. Кроме того, эти поля будут загружаться в модель редактора при повторном открытии черновика.

@angus помогает мне с этим PR, просматривая код и предлагая важные улучшения.

Хотел бы узнать мнение команды Discourse об этой функции.

Я согласен, что нам нужен чистый механизм для плагинов, чтобы добавлять и получать информацию о черновиках, связанную с публикацией.

Мы с @angus подготовили PR для решения этой проблемы здесь.

Есть несколько моментов, которые я не до конца понимаю: почему serializeToDraft является частью API плагинов, а serializeOnCreate и serializeToTopic — нет? При каких обстоятельствах serializeToDraft полезен без двух других, и наоборот? Не должен ли существовать обёрточный метод, который выполняет сериализацию и для постов/тем, и для черновиков?

Да, согласен. Можешь смело создать PR и для этих задач.

Я столкнулся с ещё одной проблемой: как насчёт метода saveDraft()? Как-то нужно добавить наблюдатель для полей, добавленных через serializeToDraft(), аналогичный этому:

иначе черновик не будет отправлен на конечную точку, если изменились только пользовательские поля черновика.
Таким образом, saveDraft() тоже должен быть частью API, или же эту логику нужно как-то абстрагировать.
Я также обнаружил наблюдатель dataChanged в модели composer. Мне кажется очень странным, что у нас есть два наблюдателя, следящих за одним и тем же. Логика внутри этого наблюдателя, вероятно, тоже должна срабатывать для пользовательских полей черновика. Также интересно, какой из двух наблюдателей сработает первым и каковы будут последствия.