본문으로 건너뛰기

Thread

Thread/reply payload 검증 + 정� 결정 (Q&A 포럼/게시판/FAQ 등 범용)

상태

항목
Layercore
TierL1
Statusreleased
Version1.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\LessonThreadApp\Plugins\Thread, slug lesson-threadthread, layer domaincore. 코드 자체는 그대로 (이미 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.0
  • annotation: >=0.9.0 (AuthorRole enum 재사용)

라이선스

MIT

의존성

데모


🛒 Plugin Store에서 보기: store.codebase.how/plugins/thread