chore(page): 코드·테스트·라우트 주석 정리 및 CHANGELOG 날짜 정정
코드/테스트 주석에 남아 있던 내부 이슈번호(-14, -15 등)를 규정에 따라 제거하고, 첨부 라우트 주석의 오해 소지 표현을 정정한다. 1.0.1 릴리스 날짜를 2026-07-06 으로 맞춘다. - Listener/커맨드 주석, Feature/Unit/레이아웃/E2E 테스트 주석 - 시나리오 매니페스트 설명 (audit:allow 지시어는 보존) - 첨부 라우트: admin 그룹의 오해성 "단일화" 주석 제거, 공개 pages 그룹 각 라우트에 게시판과 동일한 방식·사유를 간결히 명시 (미리보기=공개 이미지, 다운로드=발행 상태 조건부 접근 제어) - CHANGELOG [1.0.1] 날짜를 2026-07-06 으로 정정 (page 모듈 / basic·admin_basic 템플릿 / 대응 ja 언어팩 3종) - 로직·동작 변경 없음
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
|
||||
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
|
||||
|
||||
## [1.0.1] - 2026-07-01
|
||||
## [1.0.1] - 2026-07-06
|
||||
|
||||
### Added
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
|
||||
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
|
||||
|
||||
## [1.0.1] - 2026-07-01
|
||||
## [1.0.1] - 2026-07-06
|
||||
|
||||
### Changed
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
|
||||
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
|
||||
|
||||
## [1.0.1] - 2026-07-01
|
||||
## [1.0.1] - 2026-07-06
|
||||
|
||||
### Added
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
|
||||
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
|
||||
|
||||
## [1.0.1] - 2026-07-01
|
||||
## [1.0.1] - 2026-07-06
|
||||
|
||||
### Fixed
|
||||
|
||||
|
||||
+4
-4
@@ -292,7 +292,7 @@ describe('admin_page_list.json', () => {
|
||||
expect(findById(adminPageList, 'published_false')).toBeNull();
|
||||
});
|
||||
|
||||
// ─── F2: 모바일 검색 저장/읽기 저장소 정합 (이슈 #424) ───
|
||||
// ─── F2: 모바일 검색 저장/읽기 저장소 정합 ───
|
||||
|
||||
/**
|
||||
* responsive.portable 등 반응형 오버라이드 내부까지 순회하며 id 로 노드를 찾는다.
|
||||
@@ -350,7 +350,7 @@ describe('admin_page_list.json', () => {
|
||||
expect(inputChange?.params?.target).not.toBe('global');
|
||||
});
|
||||
|
||||
// ─── C1·C2·C5: 시맨틱 클래스 정리 (이슈 #424) ───
|
||||
// ─── C1·C2·C5: 시맨틱 클래스 정리 ───
|
||||
|
||||
it('[C1] 검색바 안 필드 셀렉트는 pill(select-composite), 툴바 발행/정렬/개수는 테두리(border+bg-white) — 이커머스 목록 관행', () => {
|
||||
// 관행(이커머스 shipping_policy/order/product 목록): 검색바 내부 필드 셀렉트 = pill,
|
||||
@@ -772,7 +772,7 @@ describe('admin_page_form.json', () => {
|
||||
expect(uploaders[0].props.apiEndpoints.reorder).toContain('route?.id');
|
||||
});
|
||||
|
||||
// ─── UI 검토 M1·M6 회귀 차단 (이슈 #424) ───
|
||||
// ─── UI 검토 M1·M6 회귀 차단 ───
|
||||
|
||||
it('[M1-a] 검증에러 제목 클래스가 공백으로 분리됨 (font-medium + text-danger-soft, 병합 클래스 금지)', () => {
|
||||
// 회귀 배경: "font-mediumtext-danger-soft" 처럼 공백 없이 붙으면 두 클래스 모두 무효
|
||||
@@ -1024,7 +1024,7 @@ describe('admin_page_detail.json', () => {
|
||||
expect(cellStr).toContain('sirsoft-page.admin.page.detail.versions.field_labels');
|
||||
});
|
||||
|
||||
// ─── UI 검토 M2·M3·M4·M5 회귀 차단 (이슈 #424) ───
|
||||
// ─── UI 검토 M2·M3·M4·M5 회귀 차단 ───
|
||||
|
||||
it('[M5] onError 메시지 바인딩이 $error 가 아닌 error 컨텍스트 변수를 사용함 (엔진 onError context 키는 error)', () => {
|
||||
// 회귀 배경: 엔진은 onError 콜백 컨텍스트를 `error` 키로 제공(ActionDispatcher).
|
||||
|
||||
@@ -12,7 +12,7 @@ use Modules\Sirsoft\Page\Models\PageAttachment;
|
||||
/**
|
||||
* Playwright E2E 용 페이지 도메인 시드 커맨드.
|
||||
*
|
||||
* 미발행 페이지 관리자 미리보기(#424-15) E2E 를 위해 고정 슬러그의 미발행/발행 페이지와
|
||||
* 미발행 페이지 관리자 미리보기 E2E 를 위해 고정 슬러그의 미발행/발행 페이지와
|
||||
* 첨부를 발급하여 stdout 에 JSON 으로 반환한다. 재실행 시 동일 슬러그를 물리 삭제 후 재생성해
|
||||
* 멱등성을 보장한다 (페이지·첨부는 hard delete 모델).
|
||||
*
|
||||
|
||||
@@ -35,7 +35,7 @@ class SeoPageCacheListener implements HookListenerInterface
|
||||
'method' => 'onPageChange',
|
||||
'priority' => 20,
|
||||
],
|
||||
// 버전 복원도 콘텐츠(title/content/seo_meta) 변경이므로 수정과 동일하게 무효화 (이슈 #424-14)
|
||||
// 버전 복원도 콘텐츠(title/content/seo_meta) 변경이므로 수정과 동일하게 무효화
|
||||
'sirsoft-page.page.after_restore' => [
|
||||
'method' => 'onPageChange',
|
||||
'priority' => 20,
|
||||
|
||||
@@ -105,9 +105,6 @@ Route::prefix('admin/attachments')->middleware(['auth:sanctum', 'throttle:600,1'
|
||||
->middleware('permission:admin,sirsoft-page.pages.update')
|
||||
->name('reorder');
|
||||
|
||||
// 다운로드/미리보기는 공개 hash 라우트(pages/attachment/*)로 단일화 —
|
||||
// 썸네일 <img>·다운로드는 토큰을 실을 수 없어 인증 라우트에 물리면 401 로 깨진다.
|
||||
|
||||
// 첨부파일 삭제
|
||||
Route::delete('/{id}', [PageAttachmentController::class, 'destroy'])
|
||||
->middleware('permission:admin,sirsoft-page.pages.update')
|
||||
@@ -125,12 +122,12 @@ Route::prefix('admin/attachments')->middleware(['auth:sanctum', 'throttle:600,1'
|
||||
*/
|
||||
// optional.sanctum: Bearer 토큰이 있으면 인증, 없으면 guest로 통과
|
||||
Route::prefix('pages')->middleware(['optional.sanctum', 'throttle:600,1'])->name('pages.')->group(function () {
|
||||
// 공개 첨부파일 다운로드 (해시 기반) - /{slug} 보다 먼저 등록
|
||||
// 첨부 다운로드 (해시 기반, 발행 상태에 따라 컨트롤러에서 접근 제어) - /{slug} 보다 먼저 등록
|
||||
Route::get('/attachment/{hash}', [PublicPageAttachmentController::class, 'download'])
|
||||
->where('hash', '[a-zA-Z0-9]{12}')
|
||||
->name('attachment.download');
|
||||
|
||||
// 공개 첨부파일 이미지 미리보기 (해시 기반, inline)
|
||||
// 첨부 이미지 미리보기 (공개 - 토큰 없는 <img> 직접 GET 을 위해 권한 체크 없이 이미지만 제공)
|
||||
Route::get('/attachment/{hash}/preview', [PublicPageAttachmentController::class, 'preview'])
|
||||
->where('hash', '[a-zA-Z0-9]{12}')
|
||||
->name('attachment.preview');
|
||||
|
||||
@@ -1299,7 +1299,7 @@ class PageControllerTest extends FeatureTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* 버전 복원 시 페이지 상세 SEO 캐시가 무효화되는지 확인 (이슈 #424-14)
|
||||
* 버전 복원 시 페이지 상세 SEO 캐시가 무효화되는지 확인
|
||||
*
|
||||
* 복원은 title/content/seo_meta 를 이전 버전으로 되돌리므로 수정과 동일하게
|
||||
* 검색봇용 SEO 캐시를 갱신해야 한다. 복원 전 상세 URL 캐시를 적재한 뒤 복원하면
|
||||
@@ -1349,7 +1349,7 @@ class PageControllerTest extends FeatureTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* 버전 복원 후 새 버전이 생성되고 기존 버전 이력이 모두 보존되는지 확인 (이슈 #424-14, 검수항목 3·4)
|
||||
* 버전 복원 후 새 버전이 생성되고 기존 버전 이력이 모두 보존되는지 확인 (검수항목 3·4)
|
||||
*
|
||||
* 복원은 다음 버전 번호로 새 스냅샷을 만들며, 복원 대상을 포함한 기존 버전 이력을
|
||||
* 삭제하지 않고 그대로 보존해야 한다.
|
||||
|
||||
@@ -119,7 +119,7 @@ class PublicPageControllerTest extends FeatureTestCase
|
||||
$response->assertStatus(404);
|
||||
}
|
||||
|
||||
// ─── 미발행 페이지 관리자 미리보기 (#424-15) ────────
|
||||
// ─── 미발행 페이지 관리자 미리보기 ────────
|
||||
|
||||
/**
|
||||
* 페이지 조회 권한(pages.read) 관리자는 미발행 페이지를 미리볼 수 있는지 확인
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* 미발행 페이지 관리자 미리보기 (#424-15).
|
||||
* 미발행 페이지 관리자 미리보기.
|
||||
*
|
||||
* @scenario viewer=guest, viewer=member, viewer=other_admin, viewer=page_reader, published=published, published=unpublished
|
||||
* @effects page_reader_admin_previews_unpublished_page_with_200,
|
||||
@@ -39,7 +39,7 @@ const NOT_FOUND_TEXT = /페이지를 찾을 수 없습니다|Page Not Found/;
|
||||
const UNPUBLISHED_TITLE = '미발행 미리보기 대상';
|
||||
const PUBLISHED_TITLE = '발행 대조군';
|
||||
|
||||
test.describe('미발행 페이지 관리자 미리보기 (#424-15)', () => {
|
||||
test.describe('미발행 페이지 관리자 미리보기', () => {
|
||||
test('페이지 조회 권한 관리자는 미발행 페이지를 미리보고 배너가 노출된다', async ({
|
||||
page,
|
||||
pageReadToken,
|
||||
|
||||
@@ -40,7 +40,7 @@ class SeoPageCacheListenerTest extends ModuleTestCase
|
||||
$this->assertArrayHasKey('sirsoft-page.page.after_create', $hooks);
|
||||
$this->assertArrayHasKey('sirsoft-page.page.after_update', $hooks);
|
||||
$this->assertArrayHasKey('sirsoft-page.page.after_delete', $hooks);
|
||||
// 버전 복원도 SEO 캐시 무효화가 필요하다 (이슈 #424-14: 복원 후 봇에 복원 전 버전 잔존 회귀 방지)
|
||||
// 버전 복원도 SEO 캐시 무효화가 필요하다 (복원 후 봇에 복원 전 버전 잔존 회귀 방지)
|
||||
$this->assertArrayHasKey('sirsoft-page.page.after_restore', $hooks);
|
||||
|
||||
$this->assertEquals('onPageChange', $hooks['sirsoft-page.page.after_create']['method']);
|
||||
|
||||
@@ -402,7 +402,7 @@ class PageServiceTest extends ModuleTestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* allowUnpublished=true 이면 미발행 페이지도 반환하는지 확인 (#424-15 미리보기)
|
||||
* allowUnpublished=true 이면 미발행 페이지도 반환하는지 확인 (미리보기)
|
||||
*/
|
||||
public function test_get_published_page_by_slug_returns_draft_when_preview_allowed(): void
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# audit:allow test-scenario-coverage reason: |
|
||||
# 본 매니페스트는 미발행 페이지 관리자 미리보기(#424-15) 단일 결함의 권한 × 발행상태
|
||||
# 본 매니페스트는 미발행 페이지 관리자 미리보기 단일 결함의 권한 × 발행상태
|
||||
# cross product 를 기록한다. viewer(guest/member/other_admin/page_reader) × published
|
||||
# (published/unpublished) 8케이스 중 "미리보기 허용" 은 page_reader × unpublished 단 1조합이며,
|
||||
# 나머지는 기존 동작(발행=200 공개 / 미발행=404) 유지다. 실제 회귀 가드는 test_files 의
|
||||
@@ -11,7 +11,7 @@
|
||||
feature: 미발행 페이지 관리자 미리보기 (권한자만 사용자 화면 노출 + 미리보기 배너 + 첨부 admin URL)
|
||||
|
||||
description: |
|
||||
#424-15: 미발행 페이지는 관리자여도 사용자 화면(/page/{slug})에 접근할 수 없던 결함을 수정한다.
|
||||
미발행 페이지는 관리자여도 사용자 화면(/page/{slug})에 접근할 수 없던 결함을 수정한다.
|
||||
|
||||
게이트 정책:
|
||||
- 비로그인·일반 회원: 미발행 페이지 → 404 유지 (비공개).
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
|
||||
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
|
||||
|
||||
## [1.0.1] - 2026-07-01
|
||||
## [1.0.1] - 2026-07-06
|
||||
|
||||
### Changed
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며,
|
||||
[Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다.
|
||||
|
||||
## [1.0.1] - 2026-07-01
|
||||
## [1.0.1] - 2026-07-06
|
||||
|
||||
### Added
|
||||
|
||||
|
||||
Reference in New Issue
Block a user