Files
Gnuboard7/modules/_bundled/sirsoft-page/src/routes/api.php
T
chym1217 9d7bccdfb9 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종)
- 로직·동작 변경 없음
2026-07-06 09:37:07 +09:00

140 lines
5.7 KiB
PHP

<?php
use Illuminate\Support\Facades\Route;
use Modules\Sirsoft\Page\Http\Controllers\Admin\PageAttachmentController;
use Modules\Sirsoft\Page\Http\Controllers\Admin\PageController;
use Modules\Sirsoft\Page\Http\Controllers\User\PublicPageAttachmentController;
use Modules\Sirsoft\Page\Http\Controllers\User\PublicPageController;
/*
|--------------------------------------------------------------------------
| Sirsoft Page Module API Routes
|--------------------------------------------------------------------------
|
| 페이지 모듈의 API 라우트입니다.
|
| 주의: ModuleRouteServiceProvider가 자동으로 prefix를 적용합니다.
| - URL prefix: 'api/modules/sirsoft-page'
| - Name prefix: 'api.modules.sirsoft-page.'
| 최종 URL 예시: /api/modules/sirsoft-page/admin/pages
| 최종 Name 예시: api.modules.sirsoft-page.admin.pages.index
|
*/
/*
|--------------------------------------------------------------------------
| Admin Page Routes (페이지 관리)
|--------------------------------------------------------------------------
|
| 관리자만 접근 가능한 페이지 관리 API입니다.
|
*/
Route::prefix('admin/pages')->middleware(['auth:sanctum', 'throttle:600,1'])->name('admin.pages.')->group(function () {
// 슬러그 중복 확인 (/{page} 보다 먼저 등록)
Route::post('/check-slug', [PageController::class, 'checkSlug'])
->middleware('permission:admin,sirsoft-page.pages.create')
->name('check-slug');
// 일괄 발행/미발행 (/{page} 보다 먼저 등록)
Route::patch('/bulk-publish', [PageController::class, 'bulkPublish'])
->middleware('permission:admin,sirsoft-page.pages.update')
->name('bulk-publish');
// 페이지 목록 조회
Route::get('/', [PageController::class, 'index'])
->middleware('permission:admin,sirsoft-page.pages.read')
->name('index');
// 페이지 생성
Route::post('/', [PageController::class, 'store'])
->middleware('permission:admin,sirsoft-page.pages.create')
->name('store');
// 버전 이력 조회 (/{page} 보다 먼저 등록 불가하나, /versions 패턴이므로 정상 동작)
Route::get('/{page}/versions', [PageController::class, 'versions'])
->middleware('permission:admin,sirsoft-page.pages.read')
->name('versions.index');
// 버전 상세 조회
Route::get('/{page}/versions/{versionId}', [PageController::class, 'showVersion'])
->middleware('permission:admin,sirsoft-page.pages.read')
->name('versions.show');
// 버전 복원
Route::post('/{page}/versions/{versionId}/restore', [PageController::class, 'restoreVersion'])
->middleware('permission:admin,sirsoft-page.pages.update')
->name('versions.restore');
// 발행/미발행 토글
Route::patch('/{page}/publish', [PageController::class, 'publish'])
->middleware('permission:admin,sirsoft-page.pages.update')
->name('publish');
// 페이지 상세 조회
Route::get('/{page}', [PageController::class, 'show'])
->middleware('permission:admin,sirsoft-page.pages.read')
->name('show');
// 페이지 수정
Route::put('/{page}', [PageController::class, 'update'])
->middleware('permission:admin,sirsoft-page.pages.update')
->name('update');
// 페이지 삭제
Route::delete('/{page}', [PageController::class, 'destroy'])
->middleware('permission:admin,sirsoft-page.pages.delete')
->name('destroy');
});
/*
|--------------------------------------------------------------------------
| Admin Attachment Routes (첨부파일 관리)
|--------------------------------------------------------------------------
|
| 관리자만 접근 가능한 첨부파일 관리 API입니다.
|
*/
Route::prefix('admin/attachments')->middleware(['auth:sanctum', 'throttle:600,1'])->name('admin.attachments.')->group(function () {
// 첨부파일 업로드
Route::post('/', [PageAttachmentController::class, 'upload'])
->middleware('permission:admin,sirsoft-page.pages.create')
->name('upload');
// 첨부파일 순서 변경
Route::patch('/reorder', [PageAttachmentController::class, 'reorder'])
->middleware('permission:admin,sirsoft-page.pages.update')
->name('reorder');
// 첨부파일 삭제
Route::delete('/{id}', [PageAttachmentController::class, 'destroy'])
->middleware('permission:admin,sirsoft-page.pages.update')
->name('destroy');
});
/*
|--------------------------------------------------------------------------
| Public Page Routes (공개 페이지 조회)
|--------------------------------------------------------------------------
|
| 비로그인 사용자도 접근 가능한 공개 API입니다.
| - 발행된 페이지를 슬러그로 조회합니다.
|
*/
// optional.sanctum: Bearer 토큰이 있으면 인증, 없으면 guest로 통과
Route::prefix('pages')->middleware(['optional.sanctum', 'throttle:600,1'])->name('pages.')->group(function () {
// 첨부 다운로드 (해시 기반, 발행 상태에 따라 컨트롤러에서 접근 제어) - /{slug} 보다 먼저 등록
Route::get('/attachment/{hash}', [PublicPageAttachmentController::class, 'download'])
->where('hash', '[a-zA-Z0-9]{12}')
->name('attachment.download');
// 첨부 이미지 미리보기 (공개 - 토큰 없는 <img> 직접 GET 을 위해 권한 체크 없이 이미지만 제공)
Route::get('/attachment/{hash}/preview', [PublicPageAttachmentController::class, 'preview'])
->where('hash', '[a-zA-Z0-9]{12}')
->name('attachment.preview');
// 발행된 페이지 조회 (슬러그 기반)
Route::get('/{slug}', [PublicPageController::class, 'show'])
->where('slug', '[a-z0-9\-]+')
->name('show');
});