비추천된 api.modifyClass("model:composer", ...)를 대체하기 위해 마이그레이션을 진행 중입니다.
현재 Composer#save 오버라이드에서는 저장 동작을 조건부로 변경하고 있으며, 그 외에는 super.save(opts)를 호출해야 합니다.
새로운 addModelMethod / addModelCallback API를 확인했지만, 기존 메서드를 오버라이드하면서 원래 구현에 대한 접근성을 유지하기 위해 addModelMethod를 사용하는 코어 내 예시를 찾지 못했습니다.
이처럼 기존 모델 메서드를 오버라이드하는 용도로 addModelMethod가 설계된 것인가요? 그렇다면 플러그인에서 원래의 save() 구현으로 위임하려면 어떻게 해야 하나요?
아니면 이 Composer 사용 사례에는 다른 확장 지점(extension point)을 사용해야 하나요?
저장 메서드를 오버라이드해서 무엇을 하려는지에 따라 달라질 것 같습니다.
특정 조건에 따라 저장을 방지하려는 경우, composer-service-cannot-submit-post 값 변환기 를 사용할 수 있습니다.
게시물이 생성된 후에 무언가를 수행하려는 경우, api.onAppEvent("post:created")가 있습니다.
필드를 추가하려는 경우 api.serializeOnCreate가 있습니다.
이 중 찾으시는 용도에 맞는 것이 있을까요?
감사합니다! 이미 composer-service-cannot-submit-post를 사용하고 있습니다 — 서비스 레벨의 체크를 처리해 줍니다. 하지만 컴포저 모델의 save()에서도 cantSubmitPost를 확인하며, 여기에는 missingReplyCharacters > 0이 포함되어 있어 본문이 비어 있는 경우에도 여전히 차단됩니다.
onAppEvent("post:created")는 게시물이 생성되지 않기 때문에 너무 늦은 시점이고, serializeOnCreate는 요청에 필드만 추가할 뿐 본문 길이 검증에는 도움이 되지 않습니다.
따라서 남은 문제는 첫 번째 게시물에 대해 missingReplyCharacters / cantSubmitPost를 우회하는 것입니다. 이를 위한 지원되는 확장 지점이 있을까요?
참고로 현재 초기화 프로그램은 다음과 같습니다:
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer((api) => {
api.registerValueTransformer(
"composer-minimum-post-length",
({ value, context: { composer } }) => {
if (
composer.siteSettings.discourse_optional_topic_body_enabled &&
composer.topicFirstPost
) {
return 0;
}
return value;
}
);
});
@david , 이 문제에 대해 가장 좋은 접근 방식에 대해 의견이 있으시면 말씀해 주시면 감사하겠습니다.
david
(David Taylor)
8월 18, 2026, 2:31오후
5
가장 좋은 방법은 Discourse 코어에 새로운 훅을 추가하여, 지원되는 방식으로 필요한 기능을 구현할 수 있도록 하는 것입니다. 다음과 같은 방식으로 어떨까요:
main ← composer-minimum-post-length-transformer
merged 01:26PM - 20 Aug 26 UTC
그렇게 되면 여러분의 플러그인은 다음과 같이 동작하게 됩니다.
api.registerValueTransformer(
"composer-minimum-post-length",
({ value, context: { composer } }) => {
if (
siteSettings.discourse_optional_topic_body_enabled &&
composer.topicFirstPost
) {
return 0;
}
return value; // Keep core logic
}
);
이 방식이 여러분의 사용 사례에 적합한지 알려주시면, PR을 초안에서 해제하고 리뷰 및 병합을 진행하겠습니다.
감사합니다, David! composer-minimum-post-length 트랜스포머를 테스트해 봤는데 정상적으로 작동합니다 — 본문이 비어 있는 주제도 성공적으로 생성됩니다.
한 가지 발견한 점이 있습니다: composer-editor의 validation에 하드코딩된 replyLength < 1 체크가 minimumPostLength를 사용하지 않기 때문에, 에디터에는 여전히 **“게시물은 비워둘 수 없습니다”**라는 메시지가 표시됩니다.
이 체크도 트랜스포머를 반영하거나, minimumPostLength가 0일 때 건너뛰도록 할 수 있을까요?
이제 완벽하게 작동합니다. 이 기능을 추가해 주셔서 정말 감사합니다, @david !