From c694c6546770f7d9e1ffe5debd5c76a06646232c Mon Sep 17 00:00:00 2001 From: kent Date: Sat, 27 Dec 2025 18:27:19 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[mock-migration]=20Phase=20J-4=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EA=B4=80=EB=A6=AC=20API=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BoardController: show 메서드 ID 기반 조회로 변경 - BoardStoreRequest: extra_settings.target/target_id/target_name 검증 추가 - BoardUpdateRequest: extra_settings.target/target_id/target_name 검증 추가 - routes/api.php: 게시판 상세 라우트 {code} → {id} 변경 테넌트 게시판 정책: - 테넌트는 자신의 게시판만 CRUD 가능 - 시스템 게시판은 mng에서만 관리 - board_code는 시스템/테넌트 간 중복 허용 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- app/Http/Controllers/Api/V1/BoardController.php | 10 +++++----- app/Http/Requests/Boards/BoardStoreRequest.php | 14 +++++++++++++- app/Http/Requests/Boards/BoardUpdateRequest.php | 9 ++++++++- routes/api.php | 2 +- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Api/V1/BoardController.php b/app/Http/Controllers/Api/V1/BoardController.php index 0496a75..64d3d41 100644 --- a/app/Http/Controllers/Api/V1/BoardController.php +++ b/app/Http/Controllers/Api/V1/BoardController.php @@ -35,18 +35,18 @@ public function index() } /** - * 게시판 상세 조회 (코드 기반) + * 게시판 상세 조회 (ID 기반) */ - public function show(string $code) + public function show(int $id) { - return ApiResponse::handle(function () use ($code) { - $board = $this->boardService->getBoardByCode($code); + return ApiResponse::handle(function () use ($id) { + $board = $this->boardService->getBoardDetail($id); if (! $board) { abort(404, __('error.board.not_found')); } - return $board->load('customFields'); + return $board; }, __('message.fetched')); } diff --git a/app/Http/Requests/Boards/BoardStoreRequest.php b/app/Http/Requests/Boards/BoardStoreRequest.php index 767c8be..09e4325 100644 --- a/app/Http/Requests/Boards/BoardStoreRequest.php +++ b/app/Http/Requests/Boards/BoardStoreRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests\Boards; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rule; class BoardStoreRequest extends FormRequest { @@ -13,8 +14,16 @@ public function authorize(): bool public function rules(): array { + $tenantId = auth()->user()?->current_tenant_id; + return [ - 'board_code' => 'required|string|max:50|unique:boards,board_code', + 'board_code' => [ + 'required', + 'string', + 'max:50', + // 테넌트 게시판 내에서만 중복 체크 (시스템 게시판과는 중복 허용) + Rule::unique('boards', 'board_code')->where('tenant_id', $tenantId), + ], 'board_type' => 'nullable|string|max:50', 'name' => 'required|string|max:100', 'description' => 'nullable|string|max:500', @@ -23,6 +32,9 @@ public function rules(): array 'max_file_count' => 'sometimes|integer|min:0|max:20', 'max_file_size' => 'sometimes|integer|min:0|max:102400', 'extra_settings' => 'nullable|array', + 'extra_settings.target' => 'nullable|string|in:all,department', + 'extra_settings.target_id' => 'nullable|integer', + 'extra_settings.target_name' => 'nullable|string|max:100', 'extra_settings.permissions' => 'nullable|array', 'extra_settings.permissions.read' => 'nullable|array', 'extra_settings.permissions.write' => 'nullable|array', diff --git a/app/Http/Requests/Boards/BoardUpdateRequest.php b/app/Http/Requests/Boards/BoardUpdateRequest.php index 8da291f..213e2c3 100644 --- a/app/Http/Requests/Boards/BoardUpdateRequest.php +++ b/app/Http/Requests/Boards/BoardUpdateRequest.php @@ -15,13 +15,17 @@ public function authorize(): bool public function rules(): array { $boardId = $this->route('id'); + $tenantId = auth()->user()?->current_tenant_id; return [ 'board_code' => [ 'sometimes', 'string', 'max:50', - Rule::unique('boards', 'board_code')->ignore($boardId), + // 테넌트 게시판 내에서만 중복 체크 (시스템 게시판과는 중복 허용) + Rule::unique('boards', 'board_code') + ->ignore($boardId) + ->where('tenant_id', $tenantId), ], 'board_type' => 'nullable|string|max:50', 'name' => 'sometimes|string|max:100', @@ -31,6 +35,9 @@ public function rules(): array 'max_file_count' => 'sometimes|integer|min:0|max:20', 'max_file_size' => 'sometimes|integer|min:0|max:102400', 'extra_settings' => 'nullable|array', + 'extra_settings.target' => 'nullable|string|in:all,department', + 'extra_settings.target_id' => 'nullable|integer', + 'extra_settings.target_name' => 'nullable|string|max:100', 'extra_settings.permissions' => 'nullable|array', 'extra_settings.permissions.read' => 'nullable|array', 'extra_settings.permissions.write' => 'nullable|array', diff --git a/routes/api.php b/routes/api.php index dd1d1ac..0f7a726 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1201,7 +1201,7 @@ Route::get('/', [BoardController::class, 'index'])->name('v1.boards.index'); // 접근 가능한 게시판 목록 Route::get('/tenant', [BoardController::class, 'tenantBoards'])->name('v1.boards.tenant'); // 테넌트 게시판만 Route::post('/', [BoardController::class, 'store'])->name('v1.boards.store'); // 테넌트 게시판 생성 - Route::get('/{code}', [BoardController::class, 'show'])->name('v1.boards.show'); // 게시판 상세 (코드 기반) + Route::get('/{id}', [BoardController::class, 'show'])->whereNumber('id')->name('v1.boards.show'); // 게시판 상세 (ID 기반) Route::put('/{id}', [BoardController::class, 'update'])->whereNumber('id')->name('v1.boards.update'); // 테넌트 게시판 수정 Route::delete('/{id}', [BoardController::class, 'destroy'])->whereNumber('id')->name('v1.boards.destroy'); // 테넌트 게시판 삭제 Route::get('/{code}/fields', [BoardController::class, 'fields'])->name('v1.boards.fields'); // 게시판 필드 목록