Files
Gnuboard7/modules/_bundled/sirsoft-board/editor-spec.json
T
HeuJung 3cb598ce5f fix(core,extensions): 편집기 스펙 한 줄 요약을 사람 메모 대신 실측에서 생성
직전 커밋 산출물에 「Phase 4/5 에서 추가」 문구가 박힌 것을 가 지적했다.
그 문자열은 이번 브랜치에서 쓴 것이 아니라 editor-spec.json 의 description 에
원래 있던 값이고, 새로 만든 생성기가 그것을 문서 앞머리로 옮겨 실으면서
승격된 것이다.

그 필드는 코드가 아니라 사람이 쓴 메모라 실측과 대조되지 않는다. 전수 조사에서
12건 중 5건이 오염돼 있었고, 그중 둘은 바로 아래 실측 표와 정반대를 말했다 —
「controls 는 나중에 추가」라는데 표는 303개가 있다고 한다. 오류도 경고도 나지
않는다: 문서가 자기 자신을 반박한 채로 읽힐 뿐이다.

한 줄 요약은 남기되 실측에서 만든다. 두 표에 흩어진 값을 한 줄로 압축하므로
읽는 쪽이 잃는 것이 없고, 코드에서 파생되므로 어긋날 자리가 사라진다. 도메인
의미는 바로 아래 사람 서술 칸이 이미 담당한다.

스펙 파일의 오염된 메모 5건도 정리했다. 그 파일을 여는 개발자는 문서와 별개로
그 값을 읽고, 확장과 함께 공개 배포된다. 재발 방지는 규정에 명시하고 검사는
두지 않았다 — 어휘를 정규식으로 고정하면 정당한 서술까지 걸리고 목록 밖 표현은
통과해, 「검사했으나 통과」와 「보지 않음」이 구분되지 않는다.
2026-09-01 12:56:16 +09:00

2390 lines
77 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"moduleId": "sirsoft-board",
"version": "1.0.0",
"description": "게시판 모듈 레이아웃 편집기 스펙 — 관리자·사용자 게시판 화면의 프리뷰 샘플과 페이지 상태. 공용 인프라(roles·availableChannels·identityProviders 등)는 관리자 템플릿 스펙과 코어 기본값이 커버한다.",
"sampleGlobal": {
"comment": "게시판 도메인 _global keyspace.",
"notifications": {
"unread_post_count": 3
}
},
"sampleData": {
"comment": "실제 ID(admin): boards/posts/post/reports/report_detail + 사용자 게시판 페이지 byEndpointPattern(api/modules/sirsoft-board/boards/*). 계획서 추정(board_activity/user_comments 등 미존재) 정정.",
"byDataSourceId": {
"posts": {
"data": {
"board": {
"slug": "free",
"name": "자유게시판",
"description": "<p>회원 자유 소통 공간</p>",
"type": "normal",
"categories": [
"일상",
"질문",
"정보공유",
"후기"
],
"show_category": true,
"show_view_count": true,
"settings": {
"use_file_upload": true,
"use_comment": true,
"use_reply": true,
"use_report": true,
"secret_mode": "enabled",
"show_view_count": true,
"per_page": 20,
"posts_per_page": 20,
"posts_per_page_mobile": 10,
"new_display_hours": 24,
"order_by": "created_at",
"order_direction": "desc"
}
},
"data": [
{
"id": 101,
"number": "공지",
"row_type": "notice",
"slug": "free",
"title": "[필독] 게시판 이용 규칙 안내",
"category": null,
"author": {
"uuid": "00000000-0000-0000-0000-000000000010",
"name": "운영자",
"email": "운영자@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"is_notice": true,
"is_secret": false,
"content_mode": "html",
"is_new": false,
"status": "published",
"status_label": "게시됨",
"view_count": 5821,
"comment_count": 12,
"reply_count": 0,
"attachment_count": 1,
"has_attachment": true,
"thumbnail": null,
"parent_id": null,
"depth": 0,
"is_reply": false,
"created_at": "2026-05-01 09:00:00",
"created_at_formatted": "2026-05-01",
"is_author": false,
"is_guest_post": false,
"deleted_at": null,
"content_preview": "게시판 이용 규칙을 안내드립니다..."
},
{
"id": 142,
"number": 142,
"row_type": "normal",
"slug": "free",
"title": "봄맞이 등산 다녀왔습니다 🏔️",
"category": "일상",
"author": {
"uuid": "00000000-0000-0000-0000-000000000001",
"name": "김민준",
"email": "김민준@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"is_notice": false,
"is_secret": false,
"content_mode": "html",
"is_new": true,
"status": "published",
"status_label": "게시됨",
"view_count": 348,
"comment_count": 7,
"reply_count": 2,
"attachment_count": 3,
"has_attachment": true,
"thumbnail": "/api/modules/sirsoft-board/boards/free/attachment/img-hash-1/preview",
"parent_id": null,
"depth": 0,
"is_reply": false,
"created_at": "2026-06-03 14:22:10",
"created_at_formatted": "2026-06-03",
"is_author": false,
"is_guest_post": false,
"deleted_at": null,
"content_preview": "날씨가 좋아서 북한산에 다녀왔어요..."
},
{
"id": 141,
"number": 141,
"row_type": "normal",
"slug": "free",
"title": "노트북 추천 부탁드립니다 (예산 150만원)",
"category": "질문",
"author": {
"uuid": "00000000-0000-0000-0000-000000000002",
"name": "이서연",
"email": "이서연@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"is_notice": false,
"is_secret": false,
"content_mode": "text",
"is_new": true,
"status": "published",
"status_label": "게시됨",
"view_count": 213,
"comment_count": 15,
"reply_count": 1,
"attachment_count": 0,
"has_attachment": false,
"thumbnail": null,
"parent_id": null,
"depth": 0,
"is_reply": false,
"created_at": "2026-06-03 11:05:42",
"created_at_formatted": "2026-06-03",
"is_author": false,
"is_guest_post": false,
"deleted_at": null,
"content_preview": "주로 문서 작업과 가벼운 영상 편집을 합니다..."
},
{
"id": 143,
"number": "답글",
"row_type": "reply",
"slug": "free",
"title": "RE: 노트북 추천 부탁드립니다",
"category": "질문",
"author": {
"uuid": "00000000-0000-0000-0000-000000000003",
"name": "박도윤",
"email": "박도윤@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"is_notice": false,
"is_secret": false,
"content_mode": "text",
"is_new": true,
"status": "published",
"status_label": "게시됨",
"view_count": 56,
"comment_count": 0,
"reply_count": 0,
"attachment_count": 0,
"has_attachment": false,
"thumbnail": null,
"parent_id": 141,
"depth": 1,
"is_reply": true,
"created_at": "2026-06-03 12:30:00",
"created_at_formatted": "2026-06-03",
"is_author": false,
"is_guest_post": false,
"deleted_at": null,
"content_preview": "저는 그 예산이면 OO모델 추천드려요..."
},
{
"id": 140,
"number": 140,
"row_type": "normal",
"slug": "free",
"title": "비밀글입니다",
"category": "일상",
"author": {
"uuid": "00000000-0000-0000-0000-000000000004",
"name": "최예나",
"email": "최예나@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"is_notice": false,
"is_secret": true,
"content_mode": "text",
"is_new": false,
"status": "published",
"status_label": "게시됨",
"view_count": 8,
"comment_count": 2,
"reply_count": 0,
"attachment_count": 0,
"has_attachment": false,
"thumbnail": null,
"parent_id": null,
"depth": 0,
"is_reply": false,
"created_at": "2026-06-02 18:40:00",
"created_at_formatted": "2026-06-02",
"is_author": false,
"is_guest_post": false,
"deleted_at": null,
"content_preview": "비밀글 내용입니다..."
},
{
"id": 139,
"number": 139,
"row_type": "normal",
"slug": "free",
"title": "광고성 게시글 (관리자 삭제)",
"category": null,
"author": {
"uuid": null,
"name": "비회원",
"email": null,
"avatar": null,
"status": null,
"status_label": null,
"is_guest": true
},
"is_notice": false,
"is_secret": false,
"content_mode": "text",
"is_new": false,
"status": "published",
"status_label": "게시됨",
"view_count": 31,
"comment_count": 0,
"reply_count": 0,
"attachment_count": 0,
"has_attachment": false,
"thumbnail": null,
"parent_id": null,
"depth": 0,
"is_reply": false,
"created_at": "2026-06-01 10:15:00",
"created_at_formatted": "2026-06-01",
"is_author": false,
"is_guest_post": true,
"deleted_at": "2026-06-02 09:00:00",
"content_preview": "삭제된 게시글입니다."
}
],
"pagination": {
"total": 137,
"all_total": 138,
"count": 6,
"per_page": 20,
"current_page": 1,
"last_page": 7,
"from": 1,
"to": 6,
"has_more_pages": true
},
"abilities": {
"can_read": true,
"can_write": true,
"can_read_secret": true,
"can_read_comments": true,
"can_write_comments": true,
"can_upload": true,
"can_download": true,
"can_manage": true,
"can_view_deleted": true
}
}
},
"post": {
"data": {
"id": 142,
"category": "일상",
"title": "봄맞이 등산 다녀왔습니다 🏔️",
"content": "<p>날씨가 좋아서 북한산에 다녀왔어요. 정상에서 본 풍경이 정말 멋졌습니다.</p><p>사진 몇 장 첨부합니다.</p>",
"content_mode": "html",
"author": {
"uuid": "00000000-0000-0000-0000-000000000001",
"name": "김민준",
"email": "김민준@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"is_notice": false,
"is_secret": false,
"is_new": true,
"status": "published",
"status_label": "게시됨",
"trigger_type": null,
"view_count": 348,
"comment_count": 3,
"reply_count": 1,
"attachment_count": 3,
"has_attachment": true,
"thumbnail": "/api/modules/sirsoft-board/boards/free/attachment/img-hash-1/preview",
"parent_id": null,
"depth": 0,
"is_reply": false,
"user_id": "00000000-0000-0000-0000-000000000001",
"ip_address": "203.0.113.42",
"created_at": "2026-06-03 14:22:10",
"created_at_formatted": "2026-06-03",
"updated_at": "2026-06-03 14:22:10",
"deleted_at": null,
"is_author": false,
"is_guest_post": false,
"is_already_reported": false,
"board": {
"slug": "free",
"name": "자유게시판",
"type": "normal",
"use_comment": true,
"use_reply": true,
"use_report": true,
"show_view_count": true,
"max_reply_depth": 5,
"max_comment_depth": 10,
"report_types": [
{
"value": "abuse",
"label": "욕설/비방"
},
{
"value": "spam",
"label": "스팸/광고"
},
{
"value": "sexual",
"label": "음란성"
},
{
"value": "privacy",
"label": "개인정보 노출"
},
{
"value": "other",
"label": "기타"
}
]
},
"navigation": {
"prev": {
"id": 141,
"title": "노트북 추천 부탁드립니다 (예산 150만원)",
"is_notice": false
},
"next": {
"id": 143,
"title": "회사 워크샵 후기",
"is_notice": false
}
},
"parent": null,
"attachments": [
{
"id": 1,
"hash": "img-hash-1",
"original_filename": "북한산_정상.jpg",
"mime_type": "image/jpeg",
"size": 2411520,
"size_formatted": "2.3 MB",
"collection": "attachments",
"order": 0,
"download_url": "/api/modules/sirsoft-board/boards/free/attachment/img-hash-1/download",
"preview_url": "/api/modules/sirsoft-board/boards/free/attachment/img-hash-1/preview",
"is_image": true,
"meta": null
},
{
"id": 3,
"hash": "pdf-hash-3",
"original_filename": "등산코스_정리.pdf",
"mime_type": "application/pdf",
"size": 524288,
"size_formatted": "512 KB",
"collection": "attachments",
"order": 1,
"download_url": "/api/modules/sirsoft-board/boards/free/attachment/pdf-hash-3/download",
"preview_url": null,
"is_image": false,
"meta": null
}
],
"comments": [
{
"id": 501,
"post_id": 142,
"parent_id": null,
"content": "풍경이 정말 멋지네요! 등산로는 어디로 오르셨나요?",
"author": {
"uuid": "00000000-0000-0000-0000-000000000002",
"name": "이서연",
"email": "이서연@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"is_secret": false,
"status": "published",
"status_label": "게시됨",
"depth": 0,
"replies_count": 1,
"created_at": "2026-06-03 15:01:22",
"created_at_formatted": "2026-06-03",
"updated_at": "2026-06-03 15:01:22",
"deleted_at": null,
"ip_address": "203.0.113.51",
"is_author": false,
"is_guest_comment": false,
"is_already_reported": false,
"action_logs": null,
"is_owner": false,
"abilities": {
"can_write": true,
"can_manage": true
}
},
{
"id": 502,
"post_id": 142,
"parent_id": 501,
"content": "우이동 코스로 올랐어요. 초보자도 무난합니다 :)",
"author": {
"uuid": "00000000-0000-0000-0000-000000000001",
"name": "김민준",
"email": "김민준@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"is_secret": false,
"status": "published",
"status_label": "게시됨",
"depth": 1,
"replies_count": 0,
"created_at": "2026-06-03 15:20:10",
"created_at_formatted": "2026-06-03",
"updated_at": "2026-06-03 15:20:10",
"deleted_at": null,
"ip_address": "203.0.113.42",
"is_author": false,
"is_guest_comment": false,
"is_already_reported": false,
"action_logs": null,
"is_owner": false,
"abilities": {
"can_write": true,
"can_manage": true
}
},
{
"id": 503,
"post_id": 142,
"parent_id": null,
"content": "삭제된 댓글입니다.",
"author": {
"uuid": null,
"name": "비회원",
"email": null,
"avatar": null,
"status": null,
"status_label": null,
"is_guest": true
},
"is_secret": false,
"status": "published",
"status_label": "게시됨",
"depth": 0,
"replies_count": 0,
"created_at": "2026-06-03 16:00:00",
"created_at_formatted": "2026-06-03",
"updated_at": "2026-06-03 16:00:00",
"deleted_at": "2026-06-03 16:30:00",
"ip_address": "198.51.100.7",
"is_author": false,
"is_guest_comment": true,
"is_already_reported": false,
"action_logs": null,
"is_owner": false,
"abilities": {
"can_write": true,
"can_manage": true
}
}
],
"replies": [
{
"id": 144,
"category": "일상",
"title": "RE: 봄맞이 등산 다녀왔습니다",
"content": "저도 다음 주에 가보려고요!",
"content_mode": "text",
"author": {
"uuid": "00000000-0000-0000-0000-000000000003",
"name": "박도윤",
"email": "박도윤@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"is_notice": false,
"is_secret": false,
"is_new": true,
"status": "published",
"status_label": "게시됨",
"view_count": 12,
"comment_count": 0,
"reply_count": 0,
"attachment_count": 0,
"has_attachment": false,
"thumbnail": null,
"parent_id": 142,
"depth": 1,
"is_reply": true,
"created_at": "2026-06-03 17:10:00",
"created_at_formatted": "2026-06-03",
"ip_address": "203.0.113.88",
"is_author": false,
"is_guest_post": false,
"deleted_at": null
}
],
"is_owner": false,
"abilities": {
"can_read": true,
"can_write": true,
"can_read_secret": true,
"can_read_comments": true,
"can_write_comments": true,
"can_upload": true,
"can_download": true,
"can_manage": true
}
}
},
"reports": {
"data": {
"data": [
{
"id": 9001,
"board_id": 1,
"board": {
"id": 1,
"name": "자유게시판",
"slug": "free",
"title": "광고성 게시글 (관리자 삭제)",
"current_status": "blinded",
"deleted_at": null
},
"target_type": "post",
"target_type_label": "게시글",
"target_id": 139,
"post_id": 139,
"content": null,
"content_mode": "text",
"content_preview": "지금 바로 클릭하면 무료 쿠폰을 드립니다! 한정 수량...",
"author": {
"uuid": null,
"name": "비회원",
"email": null,
"avatar": null,
"status": null,
"status_label": null,
"is_guest": true
},
"reporter": {
"uuid": "00000000-0000-0000-0000-000000000002",
"name": "이서연",
"email": "이서연@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"reason_type": "spam",
"reason_type_label": "스팸/광고",
"status": "pending",
"status_label": "대기 중",
"status_variant": "primary",
"processor": null,
"processed_at": null,
"metadata": null,
"report_count": 3,
"last_reported_at": "2026-06-03 18:00:00",
"is_reactivated": false,
"target_status": "blinded",
"target_trigger_type": "auto_hide",
"target_status_label": "블라인드 (자동)",
"created_at": "2026-06-03 17:30:00",
"updated_at": "2026-06-03 18:00:00"
},
{
"id": 9002,
"board_id": 1,
"board": {
"id": 1,
"name": "자유게시판",
"slug": "free",
"title": "봄맞이 등산 다녀왔습니다",
"current_status": "published",
"deleted_at": null
},
"target_type": "comment",
"target_type_label": "댓글",
"target_id": 503,
"post_id": 142,
"content": null,
"content_mode": "text",
"content_preview": "여기 욕설이 포함된 댓글입니다...",
"author": {
"uuid": null,
"name": "비회원",
"email": null,
"avatar": null,
"status": null,
"status_label": null,
"is_guest": true
},
"reporter": {
"uuid": "00000000-0000-0000-0000-000000000003",
"name": "박도윤",
"email": "박도윤@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"reason_type": "abuse",
"reason_type_label": "욕설/비방",
"status": "review",
"status_label": "검토 중",
"status_variant": "info",
"processor": {
"uuid": "00000000-0000-0000-0000-000000000010",
"name": "운영자"
},
"processed_at": "2026-06-03 19:00:00",
"metadata": null,
"report_count": 1,
"last_reported_at": "2026-06-03 16:45:00",
"is_reactivated": false,
"target_status": "published",
"target_trigger_type": null,
"target_status_label": "게시됨",
"created_at": "2026-06-03 16:45:00",
"updated_at": "2026-06-03 19:00:00"
},
{
"id": 9003,
"board_id": 1,
"board": {
"id": 1,
"name": "자유게시판",
"slug": "free",
"title": "노트북 추천 부탁드립니다",
"current_status": "published",
"deleted_at": null
},
"target_type": "post",
"target_type_label": "게시글",
"target_id": 141,
"post_id": 141,
"content": null,
"content_mode": "text",
"content_preview": "신고 사유가 불충분하여 반려된 케이스입니다...",
"author": {
"uuid": "00000000-0000-0000-0000-000000000002",
"name": "이서연",
"email": "이서연@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"reporter": {
"uuid": "00000000-0000-0000-0000-000000000004",
"name": "최예나",
"email": "최예나@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"reason_type": "other",
"reason_type_label": "기타",
"status": "rejected",
"status_label": "반려",
"status_variant": "secondary",
"processor": {
"uuid": "00000000-0000-0000-0000-000000000010",
"name": "운영자"
},
"processed_at": "2026-06-02 11:00:00",
"metadata": null,
"report_count": 1,
"last_reported_at": "2026-06-02 10:00:00",
"is_reactivated": false,
"target_status": "published",
"target_trigger_type": null,
"target_status_label": "게시됨",
"created_at": "2026-06-02 10:00:00",
"updated_at": "2026-06-02 11:00:00"
},
{
"id": 9004,
"board_id": 1,
"board": {
"id": 1,
"name": "자유게시판",
"slug": "free",
"title": "부적절한 게시글",
"current_status": "blinded",
"deleted_at": null
},
"target_type": "post",
"target_type_label": "게시글",
"target_id": 138,
"post_id": 138,
"content": null,
"content_mode": "text",
"content_preview": "음란성 콘텐츠로 신고되어 중단 처리된 케이스...",
"author": {
"uuid": null,
"name": "비회원",
"email": null,
"avatar": null,
"status": null,
"status_label": null,
"is_guest": true
},
"reporter": {
"uuid": "00000000-0000-0000-0000-000000000001",
"name": "김민준",
"email": "김민준@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"reason_type": "sexual",
"reason_type_label": "음란성",
"status": "suspended",
"status_label": "중단",
"status_variant": "warning",
"processor": {
"uuid": "00000000-0000-0000-0000-000000000010",
"name": "운영자"
},
"processed_at": "2026-06-01 14:00:00",
"metadata": null,
"report_count": 5,
"last_reported_at": "2026-06-01 13:30:00",
"is_reactivated": true,
"target_status": "blinded",
"target_trigger_type": "admin",
"target_status_label": "블라인드 (수동)",
"created_at": "2026-06-01 13:00:00",
"updated_at": "2026-06-01 14:00:00"
}
],
"statistics": {
"total": 24,
"pending": 8,
"review": 5,
"rejected": 6,
"suspended": 3,
"deleted": 2
},
"pagination": {
"current_page": 1,
"last_page": 2,
"per_page": 20,
"total": 24,
"from": 1,
"to": 4,
"has_more_pages": true
},
"abilities": {
"can_view": true,
"can_manage": true
}
}
},
"report_detail": {
"data": {
"id": 9001,
"board_id": 1,
"board": {
"id": 1,
"name": "자유게시판",
"slug": "free"
},
"target_type": "post",
"target_id": 139,
"post": {
"id": 139,
"title": "광고성 게시글 (관리자 삭제)",
"content": "지금 바로 클릭하면 무료 쿠폰을 드립니다! 한정 수량이니 서두르세요. http://spam.example.com",
"content_mode": "text",
"created_at": "2026-06-01 10:15:00",
"author": {
"uuid": null,
"name": "비회원",
"email": null
}
},
"comment": null,
"target_status": "blinded",
"target_status_label": "블라인드",
"blind_trigger_type": "auto_hide",
"blind_trigger_type_label": "자동 숨김",
"status": "pending",
"available_actions": [
"review",
"rejected",
"suspended",
"deleted"
],
"abilities": {
"can_view": true,
"can_manage": true
},
"reporters": [
{
"id": 7001,
"reporter": {
"uuid": "00000000-0000-0000-0000-000000000002",
"name": "이서연",
"email": "lee@example.com"
},
"reason_type": "spam",
"reason_type_label": "스팸/광고",
"reason_detail": "광고 링크가 포함되어 있습니다.",
"snapshot": {
"board_name": "자유게시판",
"title": "광고성 게시글",
"author_name": "비회원"
},
"reported_at": "2026-06-03 17:30:00"
},
{
"id": 7002,
"reporter": {
"uuid": "00000000-0000-0000-0000-000000000003",
"name": "박도윤",
"email": "park@example.com"
},
"reason_type": "spam",
"reason_type_label": "스팸/광고",
"reason_detail": "도배성 광고글입니다.",
"snapshot": {
"board_name": "자유게시판",
"title": "광고성 게시글",
"author_name": "비회원"
},
"reported_at": "2026-06-03 17:45:00"
},
{
"id": 7003,
"reporter": {
"uuid": "00000000-0000-0000-0000-000000000004",
"name": "최예나",
"email": "choi@example.com"
},
"reason_type": "abuse",
"reason_type_label": "욕설/비방",
"reason_detail": null,
"snapshot": {
"board_name": "자유게시판",
"title": "광고성 게시글",
"author_name": "비회원"
},
"reported_at": "2026-06-03 18:00:00"
}
],
"report_count": 3,
"reason_summary": "스팸/광고 (2건) · 욕설/비방 (1건)",
"first_reported_at": "2026-06-03 17:30:00",
"last_reported_at": "2026-06-03 18:00:00",
"histories": [
{
"id": 1,
"type": "reported",
"action_label": "신고 접수",
"processor_id": null,
"processor_name": null,
"processor_email": "",
"reason": null,
"reporter_count": 1,
"created_at": "2026-06-03 17:30:00"
},
{
"id": 2,
"type": "re_reported",
"action_label": "재신고 접수",
"processor_id": null,
"processor_name": null,
"processor_email": "",
"reason": null,
"reporter_count": 2,
"created_at": "2026-06-03 18:00:00"
},
{
"id": 3,
"type": "auto_hidden",
"action_label": "자동 블라인드",
"processor_id": null,
"processor_name": "시스템",
"processor_email": "",
"reason": "신고 누적 3건으로 자동 숨김 처리",
"reporter_count": 3,
"created_at": "2026-06-03 18:00:05"
}
],
"metadata": null,
"created_at": "2026-06-03 17:30:00",
"updated_at": "2026-06-03 18:00:05"
}
},
"reporters_list": {
"data": {
"data": [
{
"id": 7001,
"reporter": {
"uuid": "00000000-0000-0000-0000-000000000002",
"name": "이서연",
"email": "lee@example.com"
},
"reason_type": "spam",
"reason_type_label": "스팸/광고",
"reason_detail": "광고 링크가 포함되어 있습니다.",
"snapshot": {
"board_name": "자유게시판",
"title": "광고성 게시글",
"author_name": "비회원"
},
"reported_at": "2026-06-03 17:30:00"
},
{
"id": 7002,
"reporter": {
"uuid": "00000000-0000-0000-0000-000000000003",
"name": "박도윤",
"email": "park@example.com"
},
"reason_type": "spam",
"reason_type_label": "스팸/광고",
"reason_detail": "도배성 광고글입니다.",
"snapshot": {
"board_name": "자유게시판",
"title": "광고성 게시글",
"author_name": "비회원"
},
"reported_at": "2026-06-03 17:45:00"
},
{
"id": 7003,
"reporter": {
"uuid": "00000000-0000-0000-0000-000000000004",
"name": "최예나",
"email": "choi@example.com"
},
"reason_type": "abuse",
"reason_type_label": "욕설/비방",
"reason_detail": null,
"snapshot": {
"board_name": "자유게시판",
"title": "광고성 게시글",
"author_name": "비회원"
},
"reported_at": "2026-06-03 18:00:00"
}
],
"pagination": {
"total": 3,
"from": 1,
"to": 3,
"per_page": 10,
"current_page": 1,
"last_page": 1
}
}
},
"boards": {
"data": {
"data": [
{
"id": 1,
"name": "공지사항",
"slug": "notice",
"is_active": true,
"type": "basic",
"description": "공지사항 게시판입니다.",
"per_page": 20,
"per_page_mobile": 15,
"order_by": "created_at",
"order_direction": "DESC",
"categories": [],
"show_view_count": true,
"secret_mode": "disabled",
"use_comment": true,
"use_reply": true,
"max_reply_depth": 5,
"reply_delete_policy": "cascade",
"use_report": false,
"comment_order": "ASC",
"max_comment_depth": 10,
"min_title_length": 2,
"max_title_length": 200,
"min_content_length": 2,
"max_content_length": 10000,
"min_comment_length": 2,
"max_comment_length": 1000,
"blocked_keywords": [],
"use_file_upload": false,
"max_file_size": 10,
"max_file_count": 5,
"allowed_extensions": [
"jpg",
"jpeg",
"png",
"gif",
"webp",
"pdf",
"doc",
"docx",
"xls",
"xlsx",
"ppt",
"pptx",
"hwp",
"txt",
"zip"
],
"new_display_hours": 24,
"board_managers": [
{
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "관리자",
"email": "admin@example.com"
}
],
"board_steps": [],
"board_manager_ids": [
"00000000-0000-4000-8000-000000000001"
],
"board_step_ids": [],
"notify_author": true,
"notify_admin_on_post": true,
"created_at": "2026-05-26 02:41:23",
"updated_at": "2026-05-26 02:41:23",
"permissions": null,
"category_post_counts": null,
"posts_count": 0,
"user_abilities": null,
"abilities": {
"can_create": true,
"can_update": true,
"can_delete": true
}
}
],
"pagination": {
"current_page": 1,
"last_page": 1,
"per_page": 20,
"total": 1,
"from": 1,
"to": 1,
"has_more_pages": false
},
"abilities": {
"can_create": true,
"can_update": true,
"can_delete": true
},
"board_types": [
{
"value": "normal",
"label": "일반게시판"
},
{
"value": "gallery",
"label": "갤러리"
},
{
"value": "qna",
"label": "Q&A"
}
]
}
},
"boards_list": {
"data": {
"data": [
{
"id": 1,
"name": "공지사항",
"slug": "notice",
"is_active": true,
"type": "basic",
"description": "공지사항 게시판입니다.",
"per_page": 20,
"per_page_mobile": 15,
"order_by": "created_at",
"order_direction": "DESC",
"categories": [],
"show_view_count": true,
"secret_mode": "disabled",
"use_comment": true,
"use_reply": true,
"max_reply_depth": 5,
"reply_delete_policy": "cascade",
"use_report": false,
"comment_order": "ASC",
"max_comment_depth": 10,
"min_title_length": 2,
"max_title_length": 200,
"min_content_length": 2,
"max_content_length": 10000,
"min_comment_length": 2,
"max_comment_length": 1000,
"blocked_keywords": [],
"use_file_upload": false,
"max_file_size": 10,
"max_file_count": 5,
"allowed_extensions": [
"jpg",
"jpeg",
"png",
"gif",
"webp",
"pdf",
"doc",
"docx",
"xls",
"xlsx",
"ppt",
"pptx",
"hwp",
"txt",
"zip"
],
"new_display_hours": 24,
"board_managers": [
{
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "관리자",
"email": "admin@example.com"
}
],
"board_steps": [],
"board_manager_ids": [
"00000000-0000-4000-8000-000000000001"
],
"board_step_ids": [],
"notify_author": true,
"notify_admin_on_post": true,
"created_at": "2026-05-26 02:41:23",
"updated_at": "2026-05-26 02:41:23",
"permissions": null,
"category_post_counts": null,
"posts_count": 0,
"user_abilities": null,
"abilities": {
"can_create": true,
"can_update": true,
"can_delete": true
}
}
],
"pagination": {
"current_page": 1,
"last_page": 1,
"per_page": 999,
"total": 1,
"from": 1,
"to": 1,
"has_more_pages": false
},
"abilities": {
"can_create": true,
"can_update": true,
"can_delete": true
}
}
},
"board_types": {
"data": [
{
"value": "general",
"label": "일반 게시판"
},
{
"value": "gallery",
"label": "갤러리"
},
{
"value": "qna",
"label": "질문답변"
}
]
},
"form_data": {
"data": {
"id": 142,
"title": "봄맞이 등산 다녀왔습니다 🏔️",
"content": "<p>날씨가 좋아서 북한산에 다녀왔어요.</p>",
"content_mode": "html",
"category": "일상",
"is_notice": false,
"is_secret": false,
"parent_id": null,
"author": {
"uuid": "00000000-0000-0000-0000-000000000001",
"name": "김민준",
"email": "김민준@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"created_at": "2026-06-03 14:22:10",
"created_at_formatted": "2026-06-03",
"attachments": [
{
"id": 1,
"hash": "img-hash-1",
"original_filename": "북한산_정상.jpg",
"mime_type": "image/jpeg",
"size": 2411520,
"size_formatted": "2.3 MB",
"collection": "attachments",
"order": 0,
"download_url": "/api/modules/sirsoft-board/boards/free/attachment/img-hash-1/download",
"preview_url": "/api/modules/sirsoft-board/boards/free/attachment/img-hash-1/preview",
"is_image": true,
"meta": null
}
],
"parent": null
}
},
"form_meta": {
"data": {
"board": {
"name": "자유게시판",
"type": "normal",
"slug": "free",
"categories": [
"일상",
"질문",
"정보공유",
"후기"
],
"secret_mode": "enabled",
"min_title_length": 2,
"max_title_length": 100,
"min_content_length": 1,
"max_content_length": 50000,
"use_file_upload": true,
"max_file_size": 10,
"max_file_count": 5,
"allowed_extensions": [
"jpg",
"jpeg",
"png",
"gif",
"pdf",
"zip",
"docx"
],
"user_abilities": {
"can_manage": true,
"can_write": true,
"can_upload": true
}
},
"author": {
"uuid": "00000000-0000-0000-0000-000000000010",
"name": "운영자",
"email": "운영자@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"is_guest_post": false,
"requires_password": false,
"created_at": "2026-06-03 14:22:10"
}
},
"settings": {
"data": {
"notification_channels": [
{
"channel": "mail",
"enabled": true
}
],
"notification_templates": [
{
"key": "board.post.created",
"name": "게시글 등록 알림",
"channels": [
"mail"
]
}
],
"identity_purposes": [
{
"key": "board.write",
"name": "글쓰기 본인인증",
"enabled": false
}
],
"identity_policies": [
{
"purpose_key": "board.write",
"provider": "kginicis",
"enforcement": "optional"
}
],
"basic_defaults": {
"default_board_permissions": {
"read": "all",
"write": "member",
"comment": "member"
}
}
}
},
"availableChannels": {
"data": {
"channels": [
{
"id": "mail",
"name": "이메일",
"icon": "fas fa-envelope",
"source": "core",
"source_label": "코어"
},
{
"id": "sms",
"name": "SMS",
"icon": "fas fa-comment-sms",
"source": "core",
"source_label": "코어"
},
{
"id": "push",
"name": "푸시",
"icon": "fas fa-bell",
"source": "core",
"source_label": "코어"
}
]
}
},
"identityProviders": {
"data": [
{
"id": "kginicis",
"label": "KG이니시스"
},
{
"id": "nice",
"label": "나이스"
}
]
},
"boardIdentityPurposes": {
"data": [
{
"id": "board.write",
"label": "글쓰기 본인인증",
"source_identifier": "sirsoft-board",
"description": "게시글 작성 시 본인인증",
"allowed_channels": [
"mobile"
]
},
{
"id": "sensitive_action",
"label": "민감 작업",
"source_identifier": "core",
"description": "민감 작업 시 본인인증",
"allowed_channels": [
"mobile",
"ipin"
]
}
]
},
"boardIdentityPolicies": {
"data": {
"data": [
{
"id": 1,
"key": "board.write",
"scope": "hook",
"target": "board.post.create",
"purpose": "board.write",
"provider_id": "kginicis",
"grace_minutes": 0,
"enabled": true,
"source_type": "admin",
"abilities": {
"can_update": true,
"can_delete": true
}
}
],
"meta": {
"total": 1,
"current_page": 1,
"last_page": 1,
"per_page": 20
},
"abilities": {
"can_create": true
}
}
},
"boardNotificationDefinitions": {
"data": {
"data": [
{
"id": 1,
"type": "board.post.created",
"is_active": true,
"is_default": true,
"variables": [
{
"key": "post_title"
}
],
"templates": [
{
"id": 21,
"channel": "mail",
"is_active": true,
"is_default": true,
"subject": {
"ko": "게시글 등록 알림",
"en": "New post"
},
"body": {
"ko": "<p>새 게시글이 등록되었습니다.</p>",
"en": "<p>A new post has been created.</p>"
},
"recipients": [
{
"type": "trigger_user"
}
]
}
]
}
],
"pagination": {
"total": 1,
"current_page": 1,
"last_page": 1
},
"abilities": {
"can_update": true
}
}
},
"roles": {
"data": {
"data": [
{
"id": 1,
"identifier": "super_admin",
"name": "최고 관리자",
"display_name": "최고 관리자",
"description": "전체 권한",
"is_system": true
},
{
"id": 2,
"identifier": "manager",
"name": "운영자",
"display_name": "운영자",
"description": "운영 권한",
"is_system": false
},
{
"id": 3,
"identifier": "member",
"name": "일반 회원",
"display_name": "일반 회원",
"description": "기본 회원",
"is_system": true
}
]
}
},
"stats": {
"comments": [
"샘플"
],
"data": {
"boards": "샘플",
"comments": [
"샘플"
],
"posts": "샘플",
"users": "샘플"
}
},
"myActivityStats": {
"data": {
"total_comments": 10000,
"total_posts": 10000,
"total_views": 10000
}
},
"myPosts": {
"data": {
"current_page": 3,
"data": [
"샘플"
],
"last_page": 3,
"query": {
"board_slug": "sample-slug",
"search": "샘플"
},
"total": 10000
}
},
"myComments": {
"data": {
"current_page": 3,
"data": [
"샘플"
],
"last_page": 3,
"query": {
"board_slug": "sample-slug",
"search": "샘플"
},
"total": 10000
}
},
"board_list_for_inquiry": {
"data": {
"data": [
{
"id": 1,
"name": "공지사항",
"slug": "notice",
"is_active": true,
"type": "basic",
"description": "공지사항 게시판입니다.",
"per_page": 20,
"per_page_mobile": 15,
"order_by": "created_at",
"order_direction": "DESC",
"categories": [],
"show_view_count": true,
"secret_mode": "disabled",
"use_comment": true,
"use_reply": true,
"max_reply_depth": 5,
"reply_delete_policy": "cascade",
"use_report": false,
"comment_order": "ASC",
"max_comment_depth": 10,
"min_title_length": 2,
"max_title_length": 200,
"min_content_length": 2,
"max_content_length": 10000,
"min_comment_length": 2,
"max_comment_length": 1000,
"blocked_keywords": [],
"use_file_upload": false,
"max_file_size": 10,
"max_file_count": 5,
"allowed_extensions": [
"jpg",
"jpeg",
"png",
"gif",
"webp",
"pdf",
"doc",
"docx",
"xls",
"xlsx",
"ppt",
"pptx",
"hwp",
"txt",
"zip"
],
"new_display_hours": 24,
"board_managers": [
{
"uuid": "00000000-0000-4000-8000-000000000001",
"name": "관리자",
"email": "admin@example.com"
}
],
"board_steps": [],
"board_manager_ids": [
"00000000-0000-4000-8000-000000000001"
],
"board_step_ids": [],
"notify_author": true,
"notify_admin_on_post": true,
"created_at": "2026-05-26 02:41:23",
"updated_at": "2026-05-26 02:41:23",
"permissions": null,
"category_post_counts": null,
"posts_count": 0,
"user_abilities": null,
"abilities": {
"can_create": true,
"can_update": true,
"can_delete": true
}
}
],
"pagination": {
"current_page": 1,
"last_page": 1,
"per_page": 20,
"total": 1,
"from": 1,
"to": 1,
"has_more_pages": false
},
"abilities": {
"can_create": true,
"can_update": true,
"can_delete": true
}
}
},
"notifications": {
"channels": [
{
"key": "email",
"label": "이메일",
"enabled": true
},
{
"key": "push",
"label": "푸시",
"enabled": true
}
],
"data": {
"data": [
{
"id": 1,
"type": "comment",
"title": "샘플 알림",
"message": "샘플 알림 내용입니다.",
"is_read": false,
"created_at": "2026-05-24 09:32:38",
"link": "/"
}
],
"pagination": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more_pages": false
},
"unread_count": 2
}
}
},
"byEndpointPattern": {
"/api/modules/sirsoft-board/boards/*/posts*": {
"data": {
"board": {
"slug": "notice",
"board_name": "공지사항"
},
"data": [
{
"id": 1,
"title": "샘플 게시글 제목 1",
"author_name": "관리자",
"comment_count": 3,
"view_count": 120,
"created_at": "2026-05-28",
"is_secret": false
},
{
"id": 2,
"title": "샘플 게시글 제목 2",
"author_name": "관리자",
"comment_count": 0,
"view_count": 45,
"created_at": "2026-05-27",
"is_secret": false
}
],
"meta": {
"total": 2,
"per_page": 20,
"current_page": 1
}
}
},
"/api/modules/sirsoft-board/boards/popular*": {
"data": [
{
"slug": "notice",
"board_name": "공지사항",
"post_count_today": 2,
"latest_post": {
"title": "샘플 게시글 제목 1",
"created_at": "2026-05-28"
}
},
{
"slug": "free",
"board_name": "자유게시판",
"post_count_today": 8,
"latest_post": {
"title": "샘플 자유 글",
"created_at": "2026-05-29"
}
}
]
},
"/api/modules/sirsoft-board/me/*": {
"data": {
"data": [
{
"type": "post",
"board_slug": "free",
"board_name": "자유게시판",
"post_id": 10,
"title": "내가 쓴 글",
"excerpt": "내 게시글 일부…",
"created_at": "2026-05-26"
}
],
"meta": {
"total": 1,
"per_page": 20,
"current_page": 1
}
}
},
"/api/modules/sirsoft-board/users/*/posts*": {
"data": {
"data": [
{
"id": 10,
"board_slug": "free",
"board_name": "자유게시판",
"title": "프로필 작성글",
"comment_count": 2,
"view_count": 30,
"created_at": "2026-05-26"
}
],
"meta": {
"total": 1,
"per_page": 20,
"current_page": 1
}
}
}
}
},
"states": {
"comment": "게시판 도메인 변종. 게시글 상세 비밀글/삭제 + 게시판 목록 유무.",
"groups": [
{
"scope": {
"kind": "route",
"match": "/board/:slug/:id"
},
"items": [
{
"id": "read_normal",
"label": "$t:editor.state.read_normal",
"default": true
},
{
"id": "read_secret_locked",
"label": "$t:editor.state.read_secret_locked",
"sampleDataOverrides": {
"byDataSourceId": {
"post": {
"data": {
"id": 140,
"category": "일상",
"title": "비밀글입니다",
"content": null,
"content_mode": "html",
"author": {
"uuid": "00000000-0000-0000-0000-000000000004",
"name": "최예나",
"email": "최예나@example.com",
"avatar": null,
"status": "active",
"status_label": "활성",
"is_guest": false
},
"is_notice": false,
"is_secret": true,
"is_new": true,
"status": "published",
"status_label": "게시됨",
"trigger_type": null,
"view_count": 348,
"comment_count": 0,
"reply_count": 0,
"attachment_count": 0,
"has_attachment": false,
"thumbnail": "/api/modules/sirsoft-board/boards/free/attachment/img-hash-1/preview",
"parent_id": null,
"depth": 0,
"is_reply": false,
"user_id": "00000000-0000-0000-0000-000000000001",
"ip_address": "203.0.113.42",
"created_at": "2026-06-03 14:22:10",
"created_at_formatted": "2026-06-03",
"updated_at": "2026-06-03 14:22:10",
"deleted_at": null,
"is_author": false,
"is_guest_post": true,
"is_already_reported": false,
"board": {
"slug": "free",
"name": "자유게시판",
"type": "normal",
"use_comment": true,
"use_reply": true,
"use_report": true,
"show_view_count": true,
"max_reply_depth": 5,
"max_comment_depth": 10,
"report_types": [
{
"value": "abuse",
"label": "욕설/비방"
},
{
"value": "spam",
"label": "스팸/광고"
},
{
"value": "sexual",
"label": "음란성"
},
{
"value": "privacy",
"label": "개인정보 노출"
},
{
"value": "other",
"label": "기타"
}
]
},
"navigation": {
"prev": {
"id": 141,
"title": "노트북 추천 부탁드립니다 (예산 150만원)",
"is_notice": false
},
"next": {
"id": 143,
"title": "회사 워크샵 후기",
"is_notice": false
}
},
"parent": null,
"attachments": [],
"comments": [],
"replies": [],
"is_owner": false,
"abilities": {
"can_read": true,
"can_write": true,
"can_read_secret": false,
"can_read_comments": true,
"can_write_comments": true,
"can_upload": true,
"can_download": true,
"can_manage": false
}
}
}
}
}
},
{
"id": "replies_expanded",
"label": "답글 펼침",
"comment": "대댓글(depth>0) 은 collapsedReplies 기본 접힘이라 캔버스 미렌더. collapsedReplies:{501:false} 로 댓글 502(대댓글) 본체를 표시. 첨부는 `!== false` 라 기본 펼침.",
"initialState": {
"local": {
"collapsedReplies": {
"501": false
}
}
}
}
]
},
{
"scope": {
"kind": "route",
"match": "/board/:slug"
},
"items": [
{
"id": "with_data",
"label": "$t:editor.state.with_data",
"default": true
},
{
"id": "empty_data",
"label": "$t:editor.state.empty_data",
"sampleDataOverrides": {
"byDataSourceId": {
"posts": {
"data": {
"board": {
"slug": "free",
"name": "자유게시판",
"description": "<p>회원 자유 소통 공간</p>",
"type": "normal",
"categories": [
"일상",
"질문",
"정보공유",
"후기"
],
"show_category": true,
"show_view_count": true,
"settings": {
"use_file_upload": true,
"use_comment": true,
"use_reply": true,
"use_report": true,
"secret_mode": "enabled",
"show_view_count": true,
"per_page": 20,
"posts_per_page": 20,
"posts_per_page_mobile": 10,
"new_display_hours": 24,
"order_by": "created_at",
"order_direction": "desc"
}
},
"data": [],
"pagination": {
"total": 0,
"all_total": 0,
"count": 0,
"per_page": 20,
"current_page": 1,
"last_page": 1,
"from": 0,
"to": 0,
"has_more_pages": false
},
"abilities": {
"can_read": true,
"can_write": true,
"can_read_secret": true,
"can_read_comments": true,
"can_write_comments": true,
"can_upload": true,
"can_download": true,
"can_manage": true,
"can_view_deleted": true
}
}
}
}
}
}
]
},
{
"comment": "board/boards (사용자) — 게시판 목록 유무. boardList 데이터소스를 빈 배열로 오버라이드해 빈 상태를 미리본다.",
"scope": {
"kind": "route",
"match": "/boards"
},
"items": [
{
"id": "with_data",
"label": "$t:editor.state.boards_with",
"default": true
},
{
"id": "empty_boards",
"label": "$t:editor.state.boards_empty",
"sampleDataOverrides": {
"byDataSourceId": {
"boardList": {
"data": []
}
}
}
}
]
},
{
"comment": "board/form (사용자) — route.id 유무로 새 글/수정 분기(본문 line 7). 작성은 /board/:slug/write, 수정은 /board/:slug/:id/edit 라우트.",
"scope": {
"kind": "route",
"match": "/board/:slug/write"
},
"items": [
{
"id": "create_mode",
"label": "$t:editor.state.board_create",
"default": true,
"initialState": {
"route": {
"id": null
},
"local": {
"form": {}
}
}
},
{
"id": "edit_existing",
"label": "$t:editor.state.board_edit",
"initialState": {
"route": {
"id": 1
},
"local": {
"form": {
"id": 142,
"title": "봄맞이 등산 다녀왔습니다 🏔️",
"content": "<p>날씨가 좋아서 북한산에 다녀왔어요. 정상에서 본 풍경이 정말 멋졌습니다.</p>",
"content_mode": "html",
"category": "일상",
"is_notice": false,
"is_secret": false,
"parent_id": null
}
}
}
},
{
"id": "validation_failed",
"label": "검증 실패",
"comment": "게시글 작성 폼 검증 실패 — _post_form partial 이 _local.errors.{title,...} 인라인 에러를 if/className 으로 표시(본문 line 17/552).",
"formErrors": {
"_local.errors.title": [
"제목을 입력해 주세요"
]
},
"initialState": {
"local": {
"form": {
"title": "",
"content": "<p>내용은 입력했지만 제목이 비어있습니다.</p>",
"content_mode": "html",
"category": "일상",
"is_notice": false,
"is_secret": false,
"parent_id": null
}
}
}
},
{
"id": "reply_with_quote",
"label": "$t:editor.state.board_reply_with_quote",
"comment": "답글 작성(부모글 인용) 상태 — 부모글 인용 영역은 `(form_data.parent_id || query.parent_id) && form_meta.parent_post.id` + `form_meta.parent_post.content` 게이트 뒤이며, 그 안에 CKEditor(html_content extension_point)가 주입된다. 기본/수정 상태로는 이 영역이 미렌더라 확장 조각이 캔버스에 안 보이므로, 답글 맥락을 시뮬레이션해 인용 영역(+ 주입된 CKEditor)을 노출한다. form_meta/form_data 샘플은 base shape 보존(키 추가만).",
"initialState": {
"route": {
"id": null
},
"query": {
"parent_id": "141"
},
"local": {
"form": {
"parent_id": 141
}
}
},
"sampleDataOverrides": {
"byDataSourceId": {
"form_meta": {
"data": {
"board": {
"type": "normal",
"user_abilities": {
"can_manage": false
}
},
"is_guest_post": false,
"requires_password": false,
"parent_post": {
"id": 141,
"title": "봄맞이 등산 다녀왔습니다 🏔️",
"content": "<p>날씨가 좋아서 북한산에 다녀왔어요. 정상에서 본 풍경이 정말 멋졌습니다.</p>",
"content_mode": "html",
"is_notice": false,
"is_secret": false,
"author": {
"nickname": "민준이"
},
"created_at": "2026-06-01 14:22:00"
}
}
},
"form_data": {
"data": {
"id": null,
"title": "",
"content": "",
"content_mode": "html",
"category": "일상",
"is_notice": false,
"is_secret": false,
"parent_id": 141
}
}
}
}
}
]
},
{
"comment": "admin 게시판 폼 — route.slug 유무로 수정/신규(본문 line 9), _local.activeTab 으로 탭 분기(본문 line 161). 검증 오류는 _local.errors.",
"scope": {
"kind": "route",
"match": "*/admin/boards/:slug/edit"
},
"items": [
{
"id": "edit_mode",
"label": "$t:editor.state.edit_existing",
"default": true
},
{
"id": "create_mode",
"label": "$t:editor.state.create_mode",
"initialState": {
"route": {
"id": null
}
}
},
{
"id": "validation_failed",
"label": "$t:editor.state.validation_failed",
"formErrors": {
"_local.errors.board_name": [
"필수 입력 항목입니다"
]
}
}
]
},
{
"comment": "admin 게시글 폼 — route.id 유무(수정), query.parent_id(답글)로 분기(본문 line 9). 검증 오류는 _local.errors.",
"scope": {
"kind": "route",
"match": "*/admin/board/:slug/:id/edit"
},
"items": [
{
"id": "edit_mode",
"label": "$t:editor.state.edit_existing",
"default": true
},
{
"id": "create_mode",
"label": "$t:editor.state.create_mode",
"initialState": {
"route": {
"id": null
}
}
},
{
"id": "reply_mode",
"label": "$t:editor.state.reply_mode",
"initialState": {
"route": {
"id": null
},
"query": {
"parent_id": "1"
}
}
}
]
},
{
"comment": "admin 게시판 설정 — {{_global.activeBoardSettingsTab || query.tab || 'general'}} 으로 7개 탭 화면을 if 분기한다(각 _tab_*.json partial, 본문 line 488/674~). query.tab + 우선 키 _global.activeBoardSettingsTab 함께 주입.",
"scope": {
"kind": "route",
"match": "*/admin/boards/settings"
},
"items": [
{
"id": "tab_general",
"label": "$t:editor.state.tab.general",
"initialState": {
"query": {
"tab": "general"
},
"global": {
"activeBoardSettingsTab": "general"
}
},
"default": true
},
{
"id": "tab_basic_defaults",
"label": "$t:editor.state.tab.basic_defaults",
"initialState": {
"query": {
"tab": "basic_defaults"
},
"global": {
"activeBoardSettingsTab": "basic_defaults"
}
}
},
{
"id": "tab_report_policy",
"label": "$t:editor.state.tab.report_policy",
"initialState": {
"query": {
"tab": "report_policy"
},
"global": {
"activeBoardSettingsTab": "report_policy"
},
"local": {
"form": {
"report_policy": {
"auto_hide_threshold": 5,
"auto_hide_target": "post",
"daily_report_limit": 10,
"rejection_limit_count": 3,
"rejection_limit_days": 7,
"notify_admin_on_report": true,
"notify_admin_on_report_scope": "report_manager",
"notify_admin_on_report_channels": ["in_app"],
"notify_author_on_report_action": true,
"notify_author_on_report_action_channels": ["in_app"]
}
}
}
}
},
{
"id": "tab_spam_security",
"label": "$t:editor.state.tab.spam_security",
"initialState": {
"query": {
"tab": "spam_security"
},
"global": {
"activeBoardSettingsTab": "spam_security"
}
}
},
{
"id": "tab_seo",
"label": "$t:editor.state.tab.seo",
"initialState": {
"query": {
"tab": "seo"
},
"global": {
"activeBoardSettingsTab": "seo"
}
}
},
{
"id": "tab_notification_definitions",
"label": "$t:editor.state.tab.notification_definitions",
"initialState": {
"query": {
"tab": "notification_definitions"
},
"global": {
"activeBoardSettingsTab": "notification_definitions"
}
}
},
{
"id": "tab_identity_policies",
"label": "$t:editor.state.tab.identity_policies",
"initialState": {
"query": {
"tab": "identity_policies"
},
"global": {
"activeBoardSettingsTab": "identity_policies"
}
}
}
]
},
{
"comment": " /admin 게시글 상세 토글 게이트 본체 노출. 첨부파일 목록(_local.showAttachments)·대댓글(collapsedReplies[root]) 은 편집기 정적 시뮬레이션이라 클릭 불가 → 상태로 ON 패치해 본체를 캔버스에 렌더.",
"scope": {
"kind": "route",
"match": "*/admin/board/:slug/post/:id"
},
"items": [
{
"id": "default",
"label": "$t:editor.state.read_normal",
"default": true,
"initialState": {
"route": {
"id": 142
}
}
},
{
"id": "attachments_replies_open",
"label": "첨부·답글 펼침",
"comment": "첨부파일 목록(image/non-image 분기) + 대댓글(depth>0) 펼침. showAttachments:true + collapsedReplies:{501:false}(댓글 502 의 root=501).",
"initialState": {
"local": {
"showAttachments": true,
"collapsedReplies": {
"501": false
}
},
"route": {
"id": 142
}
}
}
]
}
]
}
}