번들 확장 20개 전부에 AGENTS.md · README.md · docs/ 를 채우고, 코어가 들고 있던 확장 소유 문서 두 갈래를 그 확장으로 옮긴다. 번들 템플릿의 컴포넌트· 핸들러·레이아웃 상세와 확장이 구독하는 활동 로그 훅 목록이 그 대상이며, 코어에는 총계와 링크만 남아 확장이 기능을 늘릴 때 코어 문서를 고쳐야 하던 역방향 의존이 사라진다. 전수 완비를 확인하고 강제를 조인다 — 문서 동반 룰을 대상 목록 없는 error 로 승격하고, 검사 스크립트가 문서 미보유를 실패로 올리며, 미채움 마커 baseline 을 0 으로 기록한다. 한쪽만 조이면 "새 확장이 문서 없이 들어와도 초록" 인 상태가 남는데 그 결과는 이상 0건과 구분되지 않는다. 집필 과정에서 드러난 생성기 결함 셋을 함께 고친다. 스케줄 주기 열이 계약 키를 읽지 않아 모든 확장에서 '-' 였고, 네임스페이스를 붙인 핸들러 등록 키가 수집에서 통째로 빠졌으며, README 골격이 폐기된 히어로 배지를 계속 찍어내고 있었다. 셋 다 산출물이 아니라 원천이 틀린 것이라, 가드의 모집단에 생성기 출력 자체를 넣어 다음 확장이 같은 상태로 태어나는 경로를 막는다.
6.8 KiB
마케팅 동의 — 설정·권한·라우트
설정 스키마·권한·메뉴·라우트·의존 관계 · 진입점: AGENTS.md
설정 스키마
| 키 | 타입 | 기본값 | 설명 |
|---|---|---|---|
marketing_consent_enabled |
boolean |
true |
마케팅 동의 사용 |
marketing_consent_terms_slug |
string |
marketing-terms |
마케팅 동의 약관 페이지 Slug |
channels |
json |
[] |
채널 목록 |
third_party_consent_enabled |
boolean |
true |
제3자 제공 동의 사용 |
third_party_consent_terms_slug |
string |
- | 제3자 제공 동의 약관 페이지 Slug |
info_disclosure_enabled |
boolean |
true |
정보 공개 동의 사용 |
info_disclosure_terms_slug |
string |
- | 정보 공개 동의 약관 페이지 Slug |
기본값 파일: config/settings/defaults.json · 설정 화면 레이아웃: resources/layouts/admin/plugin_settings.json
7개 항목이 두 무리입니다.
- 법정 동의 3종 —
marketing_consent_*·third_party_consent_*·info_disclosure_*. 각각 사용 여부(boolean)와 약관 페이지 slug(string) 쌍입니다. 이 셋은 성격이 정해져 있어 코드에 이름이 박혀 있습니다. channels— 운영자가 늘리는 수신 채널 목록(JSON). 이것이 이 플러그인의 핵심 설정이며, 여기에 항목을 더하면 가입 폼·마이페이지·회원 화면에 즉시 나타납니다.
channels 만 frontend_schema 에서 expose: false 이고 타입이 string 입니다 — 실제 값은
JSON 문자열이며, 화면이 그대로 그릴 수 있는 형태가 아니라 서비스가 해석해 내려줍니다. 저장
형태 정규화는 core.plugin_settings.filter_save_data 훅에서 이루어집니다.
약관 slug 셋은 페이지 모듈의 문서를 가리킵니다(manifest 의존 sirsoft-page >=1.0.0).
문서가 없으면 링크가 열리지 않을 뿐 동의 자체는 동작하므로, 도입 시 약관을 먼저 작성하는
순서를 안내합니다.
채널을 사용중지로 바꾸면 새 노출에서는 빠지지만 기존 동의 기록은 남습니다 —
getRegisteredChannels()(활성만)와 getAllChannels()(전체)가 나뉘어 있는 이유입니다. 다시
켰을 때 그 회원이 재동의할 필요가 없도록 하기 위한 것입니다.
권한
선언된 권한이 없습니다.
선언하지 않습니다. 이 플러그인의 데이터는 회원 자신의 것이라 회원 권한 체계에 얹히고, 운영자 조작은 코어 회원 권한이 이미 관장합니다.
관리자 채널 저장 라우트만 코어 권한(permission:admin,core.plugins.update)을 직접 지정합니다 —
"플러그인 설정을 고칠 수 있는 사람" 이라는 기존 권한에 얹는 방식입니다.
자기 권한을 새로 만들지 않은 것은 의도입니다. 권한을 늘리면 운영자가 역할마다 그 권한을 배정해야 하는데, "마케팅 동의만 따로 관리하는 담당자" 라는 역할 구분이 실제로 필요해지기 전까지는 그 부담이 이득보다 큽니다.
메뉴
등록하는 메뉴가 없습니다.
등록하지 않습니다. 이 플러그인은 자기 관리 화면을 갖지 않고, 동의 상태는 회원 관리 화면 안에서 조각으로 보입니다.
설정은 코어의 플러그인 목록에서 이 플러그인의 설정으로 들어가는 공통 경로를 씁니다 — 코어가
resources/layouts/admin/plugin_settings.json 을 찾아 그리므로 자체 메뉴가 필요 없습니다.
동의 현황을 회원과 분리해 따로 보는 화면(예: 채널별 동의자 목록)이 필요해지면 그때 메뉴가 생길 자리입니다.
라우트
| 종류 | 파일 | URL prefix |
|---|---|---|
api |
src/routes/api.php |
/api/plugins/sirsoft-marketing/... |
확장 라우트는 활성 상태인 확장의 것만 등록됩니다. 라우트 정의를 바꾸면 라우트 캐시 재생성이 필요합니다.
2개뿐입니다.
| 경로 | 용도 |
|---|---|
GET /settings |
프론트가 동의 항목 구성(활성 채널·약관 slug·사용 여부)을 조회 |
PUT admin/channels |
운영자가 채널 목록을 저장 (permission:admin,core.plugins.update) |
동의 값 자체를 읽고 쓰는 엔드포인트가 없습니다. 그 일은 코어 회원 API 를 타고 이루어지며,
이 플러그인은 core.user.filter_update_data / filter_resource_data 훅으로 그 흐름에
끼어듭니다. 그래서 이 플러그인을 비활성화하면 회원 API 응답에서 동의 필드가 함께 사라집니다.
라우트를 바꾼 뒤에는 라우트 캐시를 다시 굽습니다. 확장 라우트는 활성 상태인 확장의 것만 등록되고, 캐시에 없는 라우트는 예외도 경고도 없이 404 가 됩니다.
의존 관계
이 확장이 의존하는 확장
| 확장 | 유형 | 버전 제약 | 번들 |
|---|---|---|---|
sirsoft-page |
모듈 | >=1.0.0 |
✅ |
이 확장에 의존하는 확장 (이 확장을 비활성화하면 함께 영향을 받습니다)
없음.
sirsoft-page 모듈에 의존합니다(>=1.0.0). 동의 항목의 약관 문서가 페이지 모듈의
콘텐츠이기 때문입니다.
manifest 의존으로 올린 것은 약관 링크가 이 플러그인의 기능 일부가 아니라 법적 요건이기 때문입니다 — 회원이 동의 내용을 확인할 수 없으면 그 동의는 유효하지 않습니다. 훅 구독처럼 "없으면 그 기능만 비는" 관계가 아니라, 없으면 이 플러그인의 존재 이유가 성립하지 않습니다.
이 플러그인에 의존하는 확장은 없습니다. 다만 발행 훅
(user.subscribed/unsubscribed/consent_changed)을 구독해 수신 목록을 관리하는 확장이
생기면, 그 확장은 이 훅 이름에 묶입니다 — 훅 이름·페이로드를 바꿀 때는 구독 확장을 전수
확인하고 최소 버전 상향을 검토합니다.