refactor: CategoryField API를 SAM API Rules에 맞게 리팩토링

- FormRequest 패턴 적용 (CategoryFieldStoreRequest, CategoryFieldUpdateRequest)
- Service에서 Validator::make() 제거
- Controller 메시지 i18n 키로 변경 (__('message.category_field.*'))
- is_required 타입을 'Y'/'N' → boolean으로 통일
- Swagger 스키마 is_required boolean 타입으로 업데이트
- Model scopeRequired() boolean 조건으로 변경
This commit is contained in:
2025-11-14 13:45:54 +09:00
parent e848e12412
commit d4e9f2a6e4
7 changed files with 91 additions and 53 deletions

View File

@@ -4,6 +4,8 @@
use App\Helpers\ApiResponse;
use App\Http\Controllers\Controller;
use App\Http\Requests\CategoryField\CategoryFieldStoreRequest;
use App\Http\Requests\CategoryField\CategoryFieldUpdateRequest;
use App\Services\CategoryFieldService;
use Illuminate\Http\Request;
@@ -16,15 +18,15 @@ public function index(int $id, Request $request)
{
return ApiResponse::handle(function () use ($id, $request) {
return $this->service->index($id, $request->all());
}, '카테고리 필드 목록');
}, __('message.category_field.fetched'));
}
// POST /categories/{id}/fields
public function store(int $id, Request $request)
public function store(int $id, CategoryFieldStoreRequest $request)
{
return ApiResponse::handle(function () use ($id, $request) {
return $this->service->store($id, $request->all());
}, '카테고리 필드 생성');
return $this->service->store($id, $request->validated());
}, __('message.category_field.created'));
}
// GET /categories/fields/{field}
@@ -32,15 +34,15 @@ public function show(int $field)
{
return ApiResponse::handle(function () use ($field) {
return $this->service->show($field);
}, '카테고리 필드 조회');
}, __('message.category_field.fetched'));
}
// PATCH /categories/fields/{field}
public function update(int $field, Request $request)
public function update(int $field, CategoryFieldUpdateRequest $request)
{
return ApiResponse::handle(function () use ($field, $request) {
return $this->service->update($field, $request->all());
}, '카테고리 필드 수정');
return $this->service->update($field, $request->validated());
}, __('message.category_field.updated'));
}
// DELETE /categories/fields/{field}
@@ -50,7 +52,7 @@ public function destroy(int $field)
$this->service->destroy($field);
return 'success';
}, '카테고리 필드 삭제');
}, __('message.category_field.deleted'));
}
// POST /categories/{id}/fields/reorder
@@ -60,7 +62,7 @@ public function reorder(int $id, Request $request)
$this->service->reorder($id, $request->input());
return 'success';
}, '카테고리 필드 정렬 저장');
}, __('message.category_field.reordered'));
}
// PUT /categories/{id}/fields/bulk-upsert
@@ -68,6 +70,6 @@ public function bulkUpsert(int $id, Request $request)
{
return ApiResponse::handle(function () use ($id, $request) {
return $this->service->bulkUpsert($id, $request->input('items', []));
}, '카테고리 필드 일괄 업서트');
}, __('message.category_field.bulk_upsert'));
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Http\Requests\CategoryField;
use Illuminate\Foundation\Http\FormRequest;
class CategoryFieldStoreRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'field_key' => 'required|string|max:30|alpha_dash',
'field_name' => 'required|string|max:100',
'field_type' => 'required|string|max:20',
'is_required' => 'nullable|boolean',
'sort_order' => 'nullable|integer|min:0',
'default_value' => 'nullable|string|max:100',
'options' => 'nullable|json',
'description' => 'nullable|string|max:255',
];
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Http\Requests\CategoryField;
use Illuminate\Foundation\Http\FormRequest;
class CategoryFieldUpdateRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'field_key' => 'sometimes|string|max:30|alpha_dash',
'field_name' => 'sometimes|string|max:100',
'field_type' => 'sometimes|string|max:20',
'is_required' => 'sometimes|boolean',
'sort_order' => 'sometimes|integer|min:0',
'default_value' => 'nullable|string|max:100',
'options' => 'nullable|json',
'description' => 'nullable|string|max:255',
];
}
}