Thread
Thread/reply payload 검증 + 정� 결정 (Q&A 포럼/게시판/FAQ 등 범용)
상태
| 항목 | 값 |
|---|---|
| Layer | core |
| Tier | L1 |
| Status | released |
| Version | 1.0.0 |
| 가격 | Free (free) |
| **카� | |
| �고리** | Community |
개요
개요
Thread 는 multi-saas-kit 의 Layer 1 Core Plugin � 니다. Q&A 포럼 / 게시판 / FAQ / 댓글 chain 등 모든 thread 형 UX 의 페이로드 검증 + 액� � 권한 정� 을 도메인 모델 의존 없이 Pure 로 제공합니다.
분리선 (ADR-039)
ADR-039 사례 2 — 기존 LessonThread plugin 의 academy.how �
�
(lesson-thread, LessonThreadController 출처) 을 일반화. 로직은 100% 범용 thread/reply 패턴이었음.
변경: namespace App\Plugins\LessonThread → App\Plugins\Thread, slug lesson-thread → thread, layer domain → core. 코드 자체는 그대로 (이미 lesson-agnostic).
핵심 컴포넌트
ThreadPayloadValidator (Pure)
- title 1~max(255), trim 후 빈 문자열 reject
- body 1~max(20_000), 멀티바이트 친화
- reply parent_id 가 다른 thread 의 reply 면
parent_invalid - parent 가 이미 child reply 면
reply_depth_exceeded(1단계만 허용, config 조정 가능) - staff 답글이면
is_staff_reply=true자동 마킹 - locked thread 면 reply reject
ThreadActionPolicy (Pure)
Role + Ownership 만으로 결정 (tenant/saas 격리는 호출자 � 임):
| 액�
� | 정�
|
|------|------|
| canCreateThread | role 만 있으면 OK |
| canUpdateThread / canDeleteThread | 본인 OR staff |
| canTogglePin / canToggleLock | 기본 staff only (config 토글) |
| canCreateReply | open thread = 누구나, locked = staff |
| canUpdateReply / canDeleteReply | 본인 OR staff |
| canToggleAccept | staff 항상. accept_staff_only=false 일 때 thread 작성자도 |
사용 예시 (academy.how 어댑터)
use App\Plugins\Annotation\Enums\AuthorRole;
use App\Plugins\Thread\Services\{ThreadPayloadValidator, ThreadActionPolicy};
$validator = ThreadPayloadValidator::fromConfig(config('thread'));
$policy = ThreadActionPolicy::fromConfig(config('thread'));
if (! $policy->canCreateThread($role)) abort(403);
$normalized = $validator->validateThread($request->all(), $role);
LessonThread::create([...$normalized, 'lesson_id' => $lessonId]); // SaaS 측 Eloquent
활용 시나리오
- academy.how: 레슨별 Q&A 포럼 (lesson_id 키)
- 게시판: 일반 게시글 + 댓글 chain (post_id 키)
- FAQ: 질문/답변 1단계 (faq_id 키)
- support: 고객 문의/응답 thread (ticket_id 키)
의존성
core: >=1.1.0annotation: >=0.9.0(AuthorRole enum 재사용)
라이선스
MIT
의존성
데모
- Platform 관리자 패널에서 메타 확인 🔒 로그인 필요
- 사용 예시 (PHP)
🛒 Plugin Store에서 보기: store.codebase.how/plugins/thread