Files
Gnuboard7/plugins/_bundled/sirsoft-message_bizppurio/resources/js/index.ts
T
HeuJung 6a8a537f10 feat(message_bizppurio): 임시 삭제된 비즈뿌리오 플러그인 복구 및 현행 규정 정합화
32afe9530 에서 게시판 반응 기능과 함께 임시 제거됐던 비즈뿌리오 메시징
플러그인 본체(137 파일)와 일본어 번들 언어팩(9 파일)을 삭제 직전 상태
(32afe9530~1)로 복구한다. 템플릿 신청·승인 개편의 기반 작업.

복구 범위
- plugins/_bundled/sirsoft-message_bizppurio 전체 + 번들 ja 언어팩
- 공유 파일의 비즈뿌리오 참조 복원: build-language-pack-ja.cjs 팩 정의,
 api-doc-unfilled-baseline.json(32건), docs/backend/api/README.md 표 행,
 audit coverage 노트·vite-sourcemap-env-gate 룰 주석, via 테스트 주석,
 ·AGENTS.md 확장 API 표(자동 재생성), 라우팅 패리티 스냅샷(+1)

삭제 이후 강화된 규정 2건 정합화
- TokenCheckController: 예외 원문을 메시지 키 자리에 전달하던 422 응답을
 키(token_check.failed) + errors.bizppurio_message 페이로드로 분리
 (GenericCatchStatusCodeContractTest 계약). 관리자 토스트는 errors 페이로드로
 상세 사유를 계속 표시하도록 레이아웃 동기 수정, lang ko/en/ja 키 추가
- AlimtalkTemplateController::index: base Request 주입 금지 룰에 따라
 AlimtalkTemplateListRequest FormRequest 신설 (형태 검증만 — kapi 위임 유지)

미복원(의도)
- 게시판·이커머스 CHANGELOG 의 알림톡 연결 문구 2줄은 연결 방식이 로
 재설계되므로 되살리지 않고, 완료 시점에 새 동작 기준으로 차기 버전에 기재

검증: TokenCheck 7 + AlimtalkController 10 + GenericCatch 계약 3 (PHPUnit),
플러그인 레이아웃 Vitest 137건, BindingShape 라우팅 패리티 8건 green.
audit 는 복구 전부터 baseline 처리된 API 문서 미채움 32건만 잔존.
2026-08-22 22:39:36 +09:00

95 lines
3.0 KiB
TypeScript

/**
* sirsoft-message_bizppurio 플러그인 엔트리포인트.
*
* 플러그인 활성화 시 자동 로드되어 handlerMap 의 커스텀 핸들러를 ActionDispatcher 에
* 등록한다. 핸들러명은 `sirsoft-message_bizppurio.{name}` 네임스페이스를 갖는다.
* (현재 등록 핸들러 없음 — 필요 시 handlers/index.ts 에 추가.)
*/
import { handlerMap } from './handlers';
const PLUGIN_IDENTIFIER = 'sirsoft-message_bizppurio';
const logger = ((window as any).G7Core?.createLogger?.(`Plugin:${PLUGIN_IDENTIFIER}`)) ?? {
log: (...args: unknown[]) => console.log(`[Plugin:${PLUGIN_IDENTIFIER}]`, ...args),
warn: (...args: unknown[]) => console.warn(`[Plugin:${PLUGIN_IDENTIFIER}]`, ...args),
error: (...args: unknown[]) => console.error(`[Plugin:${PLUGIN_IDENTIFIER}]`, ...args),
};
/**
* handlerMap 의 모든 핸들러를 ActionDispatcher 에 등록합니다.
*
* @param dispatcher 코어 ActionDispatcher 인스턴스
*/
function register(dispatcher: any): void {
Object.entries(handlerMap).forEach(([name, handler]) => {
dispatcher.registerHandler(`${PLUGIN_IDENTIFIER}.${name}`, handler, {
category: 'plugin',
source: PLUGIN_IDENTIFIER,
});
});
logger.log(
`${Object.keys(handlerMap).length} handler(s) registered:`,
Object.keys(handlerMap).map(name => `${PLUGIN_IDENTIFIER}.${name}`),
);
}
/**
* ActionDispatcher 준비 후 핸들러를 등록합니다.
*
* 최초 로드 시 ActionDispatcher 가 아직 없을 수 있으므로 짧게 재시도한다.
*
* @param retry ActionDispatcher 부재 시 재시도 여부
*/
function registerHandlers(retry: boolean): void {
const dispatcher = (window as any).G7Core?.getActionDispatcher?.();
if (dispatcher) {
register(dispatcher);
return;
}
if (!retry) {
logger.warn('ActionDispatcher 를 찾지 못해 핸들러를 등록하지 못했습니다.');
return;
}
let count = 0;
const max = 50; // 최대 5초 (50 * 100ms)
const tick = () => {
const found = (window as any).G7Core?.getActionDispatcher?.();
if (found) {
register(found);
return;
}
if (++count <= max) {
setTimeout(tick, 100);
} else {
logger.error('ActionDispatcher 를 찾지 못해 핸들러 등록에 실패했습니다.');
}
};
tick();
}
/**
* 플러그인 초기화 — DOM 준비 후 핸들러 등록.
*/
export function initPlugin(): void {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => registerHandlers(true));
} else {
const hasDispatcher = !!(window as any).G7Core?.getActionDispatcher?.();
registerHandlers(!hasDispatcher);
}
}
initPlugin();
if (typeof window !== 'undefined') {
(window as any).__SirsoftMessageBizppurio = {
identifier: PLUGIN_IDENTIFIER,
handlers: Object.keys(handlerMap),
initPlugin,
};
}