feat: [bending] 절곡품 기초관리 API 구현
- BendingItemController: CRUD + filters 엔드포인트 (pagination 메타 보존) - BendingItemService: items 테이블 item_category=BENDING 필터 기반 - BendingItemResource: options → 최상위 필드 노출 + 계산값(width_sum, bend_count) - FormRequest: Index/Store/Update 유효성 검증 (unique:items,code 포함) - BendingFillOptions: BD-* prefix/분류 속성 자동 보강 커맨드 - BendingImportLegacy: chandj 레거시 전개도(bendingData) 임포트 커맨드 (125/170건 매칭) - ensureContext: Bearer 토큰 없이 X-TENANT-ID 헤더로 컨텍스트 설정
This commit is contained in:
95
app/Http/Controllers/Api/V1/BendingItemController.php
Normal file
95
app/Http/Controllers/Api/V1/BendingItemController.php
Normal file
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\V1;
|
||||
|
||||
use App\Helpers\ApiResponse;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Api\V1\BendingItemIndexRequest;
|
||||
use App\Http\Requests\Api\V1\BendingItemStoreRequest;
|
||||
use App\Http\Requests\Api\V1\BendingItemUpdateRequest;
|
||||
use App\Http\Resources\Api\V1\BendingItemResource;
|
||||
use App\Services\BendingItemService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class BendingItemController extends Controller
|
||||
{
|
||||
public function __construct(private BendingItemService $service) {}
|
||||
|
||||
/**
|
||||
* Bearer 토큰 없이 X-TENANT-ID 헤더로 컨텍스트 설정
|
||||
*/
|
||||
private function ensureContext(Request $request): void
|
||||
{
|
||||
if (! app()->bound('tenant_id') || ! app('tenant_id')) {
|
||||
$tenantId = (int) ($request->header('X-TENANT-ID') ?: 287);
|
||||
app()->instance('tenant_id', $tenantId);
|
||||
}
|
||||
if (! app()->bound('api_user') || ! app('api_user')) {
|
||||
// mng에서 Bearer 토큰 없이 호출 시 시스템 사용자(1)로 설정
|
||||
app()->instance('api_user', 1);
|
||||
}
|
||||
}
|
||||
|
||||
public function index(BendingItemIndexRequest $request): JsonResponse
|
||||
{
|
||||
$this->ensureContext($request);
|
||||
|
||||
return ApiResponse::handle(function () use ($request) {
|
||||
$paginator = $this->service->list($request->validated());
|
||||
$paginator->getCollection()->transform(fn ($item) => (new BendingItemResource($item))->resolve());
|
||||
|
||||
return $paginator;
|
||||
}, __('message.fetched'));
|
||||
}
|
||||
|
||||
public function filters(Request $request): JsonResponse
|
||||
{
|
||||
$this->ensureContext($request);
|
||||
|
||||
return ApiResponse::handle(
|
||||
fn () => $this->service->filters(),
|
||||
__('message.fetched')
|
||||
);
|
||||
}
|
||||
|
||||
public function show(Request $request, int $id): JsonResponse
|
||||
{
|
||||
$this->ensureContext($request);
|
||||
|
||||
return ApiResponse::handle(
|
||||
fn () => new BendingItemResource($this->service->find($id)),
|
||||
__('message.fetched')
|
||||
);
|
||||
}
|
||||
|
||||
public function store(BendingItemStoreRequest $request): JsonResponse
|
||||
{
|
||||
$this->ensureContext($request);
|
||||
|
||||
return ApiResponse::handle(
|
||||
fn () => new BendingItemResource($this->service->create($request->validated())),
|
||||
__('message.created')
|
||||
);
|
||||
}
|
||||
|
||||
public function update(BendingItemUpdateRequest $request, int $id): JsonResponse
|
||||
{
|
||||
$this->ensureContext($request);
|
||||
|
||||
return ApiResponse::handle(
|
||||
fn () => new BendingItemResource($this->service->update($id, $request->validated())),
|
||||
__('message.updated')
|
||||
);
|
||||
}
|
||||
|
||||
public function destroy(Request $request, int $id): JsonResponse
|
||||
{
|
||||
$this->ensureContext($request);
|
||||
|
||||
return ApiResponse::handle(
|
||||
fn () => $this->service->delete($id),
|
||||
__('message.deleted')
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user