feat: 입찰(Bidding) 관리 기능 구현

- Bidding 모델, 서비스, 컨트롤러, FormRequest 추가
- 마이그레이션 및 시더 추가
- Swagger API 문서 추가
- 견적에서 입찰 전환 시 중복 체크 로직 추가
- per_page 파라미터 100 초과 시 자동 클램핑 처리
- error.bidding.already_registered 에러 메시지 추가
This commit is contained in:
2026-01-19 20:23:30 +09:00
parent 7282c1ee07
commit 7dd683ace8
12 changed files with 1436 additions and 0 deletions

View File

@@ -0,0 +1,81 @@
<?php
namespace App\Http\Controllers\Api\v1;
use App\Helpers\ApiResponse;
use App\Http\Controllers\Controller;
use App\Http\Requests\Bidding\BiddingFilterRequest;
use App\Http\Requests\Bidding\BiddingStatusRequest;
use App\Http\Requests\Bidding\BiddingStoreRequest;
use App\Http\Requests\Bidding\BiddingUpdateRequest;
use App\Http\Requests\Bidding\BulkDeleteRequest;
use App\Services\Bidding\BiddingService;
class BiddingController extends Controller
{
public function __construct(private BiddingService $service) {}
/**
* 입찰 목록 조회
*/
public function index(BiddingFilterRequest $request)
{
return ApiResponse::handle(fn () => $this->service->index($request->validated()));
}
/**
* 입찰 통계 조회
*/
public function stats()
{
return ApiResponse::handle(fn () => $this->service->stats());
}
/**
* 입찰 생성 (견적에서 전환 포함)
*/
public function store(BiddingStoreRequest $request)
{
return ApiResponse::handle(fn () => $this->service->store($request->validated()), 'message.created');
}
/**
* 입찰 단건 조회
*/
public function show(int $id)
{
return ApiResponse::handle(fn () => $this->service->show($id));
}
/**
* 입찰 수정
*/
public function update(BiddingUpdateRequest $request, int $id)
{
return ApiResponse::handle(fn () => $this->service->update($id, $request->validated()), 'message.updated');
}
/**
* 입찰 삭제
*/
public function destroy(int $id)
{
return ApiResponse::handle(fn () => $this->service->destroy($id), 'message.deleted');
}
/**
* 입찰 일괄 삭제
*/
public function bulkDestroy(BulkDeleteRequest $request)
{
return ApiResponse::handle(fn () => $this->service->bulkDestroy($request->validated()['ids']), 'message.deleted');
}
/**
* 입찰 상태 변경
*/
public function updateStatus(BiddingStatusRequest $request, int $id)
{
return ApiResponse::handle(fn () => $this->service->updateStatus($id, $request->validated()['status']), 'message.updated');
}
}