generic catch 가 4xx 를 돌려주면 인프라 장애가 입력 오류로 위장돼 장애 인지가 늦어지고, 이미 번역된 예외 메시지를 응답의 메시지 키 자리에 넘기면 키 해석에 실패해 원문이 그대로 화면에 나간다. 두 형태를 코어와 전 번들 확장에서 함께 정리하고, 판정기를 한 확장이 아닌 코어 모집단에 두어 확장 밖 동형 결함도 red 가 되게 했다 — 그 사각에 실제로 15건이 있었다. 주소록에서 해외 배송지를 고르면 국내 6필드만 옮겨 담아 해외 주소가 통째로 사라지던 결함도 함께 고쳤다. 저장은 200 으로 성공 처리돼 주문 상세를 다시 열기 전에는 드러나지 않았다.
306 lines
9.7 KiB
PHP
306 lines
9.7 KiB
PHP
<?php
|
|
|
|
namespace Modules\Sirsoft\Ecommerce\Http\Controllers\Admin;
|
|
|
|
use App\Helpers\ResponseHelper;
|
|
use App\Http\Controllers\Api\Base\AdminBaseController;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Modules\Sirsoft\Ecommerce\Http\Requests\Admin\ExtraFeeTemplateBulkCreateRequest;
|
|
use Modules\Sirsoft\Ecommerce\Http\Requests\Admin\ExtraFeeTemplateBulkDeleteRequest;
|
|
use Modules\Sirsoft\Ecommerce\Http\Requests\Admin\ExtraFeeTemplateBulkToggleActiveRequest;
|
|
use Modules\Sirsoft\Ecommerce\Http\Requests\Admin\ExtraFeeTemplateListRequest;
|
|
use Modules\Sirsoft\Ecommerce\Http\Requests\Admin\ExtraFeeTemplateStoreRequest;
|
|
use Modules\Sirsoft\Ecommerce\Http\Requests\Admin\ExtraFeeTemplateUpdateRequest;
|
|
use Modules\Sirsoft\Ecommerce\Http\Resources\ExtraFeeTemplateCollection;
|
|
use Modules\Sirsoft\Ecommerce\Http\Resources\ExtraFeeTemplateResource;
|
|
use Modules\Sirsoft\Ecommerce\Services\ExtraFeeTemplateService;
|
|
|
|
/**
|
|
* 추가배송비 템플릿 관리 컨트롤러
|
|
*/
|
|
class ExtraFeeTemplateController extends AdminBaseController
|
|
{
|
|
public function __construct(
|
|
private ExtraFeeTemplateService $extraFeeTemplateService
|
|
) {}
|
|
|
|
/**
|
|
* 추가배송비 템플릿 목록 조회
|
|
*
|
|
* @param ExtraFeeTemplateListRequest $request
|
|
* @return JsonResponse
|
|
*/
|
|
public function index(ExtraFeeTemplateListRequest $request): JsonResponse
|
|
{
|
|
$templates = $this->extraFeeTemplateService->getList($request->validated());
|
|
$statistics = $this->extraFeeTemplateService->getStatistics();
|
|
|
|
$collection = new ExtraFeeTemplateCollection($templates);
|
|
|
|
return ResponseHelper::moduleSuccess(
|
|
'sirsoft-ecommerce',
|
|
'messages.extra_fee_template.list_retrieved',
|
|
$collection->withStatistics($statistics)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* 추가배송비 템플릿 상세 조회
|
|
*
|
|
* @param int $id
|
|
* @return JsonResponse
|
|
*/
|
|
public function show(int $id): JsonResponse
|
|
{
|
|
$template = $this->extraFeeTemplateService->getDetail($id);
|
|
|
|
if (! $template) {
|
|
return ResponseHelper::notFound(
|
|
'messages.extra_fee_template.not_found',
|
|
[],
|
|
'sirsoft-ecommerce'
|
|
);
|
|
}
|
|
|
|
return ResponseHelper::moduleSuccess(
|
|
'sirsoft-ecommerce',
|
|
'messages.extra_fee_template.retrieved',
|
|
new ExtraFeeTemplateResource($template)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* 추가배송비 템플릿 생성
|
|
*
|
|
* @param ExtraFeeTemplateStoreRequest $request
|
|
* @return JsonResponse
|
|
*/
|
|
public function store(ExtraFeeTemplateStoreRequest $request): JsonResponse
|
|
{
|
|
try {
|
|
$template = $this->extraFeeTemplateService->create($request->validated());
|
|
|
|
return ResponseHelper::moduleSuccess(
|
|
'sirsoft-ecommerce',
|
|
'messages.extra_fee_template.created',
|
|
new ExtraFeeTemplateResource($template),
|
|
201
|
|
);
|
|
} catch (\Exception $e) {
|
|
// 서버 결함/인프라 장애 — 4xx 로 뭉개면 장애가 입력 오류로 위장된다
|
|
return ResponseHelper::moduleError(
|
|
'sirsoft-ecommerce',
|
|
'exceptions.operation_failed',
|
|
500
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 추가배송비 템플릿 수정
|
|
*
|
|
* @param ExtraFeeTemplateUpdateRequest $request
|
|
* @param int $id
|
|
* @return JsonResponse
|
|
*/
|
|
public function update(ExtraFeeTemplateUpdateRequest $request, int $id): JsonResponse
|
|
{
|
|
$template = $this->extraFeeTemplateService->getDetail($id);
|
|
|
|
if (! $template) {
|
|
return ResponseHelper::notFound(
|
|
'messages.extra_fee_template.not_found',
|
|
[],
|
|
'sirsoft-ecommerce'
|
|
);
|
|
}
|
|
|
|
try {
|
|
$updatedTemplate = $this->extraFeeTemplateService->update($template, $request->validated());
|
|
|
|
return ResponseHelper::moduleSuccess(
|
|
'sirsoft-ecommerce',
|
|
'messages.extra_fee_template.updated',
|
|
new ExtraFeeTemplateResource($updatedTemplate)
|
|
);
|
|
} catch (\Exception $e) {
|
|
// 서버 결함/인프라 장애 — 4xx 로 뭉개면 장애가 입력 오류로 위장된다
|
|
return ResponseHelper::moduleError(
|
|
'sirsoft-ecommerce',
|
|
'exceptions.operation_failed',
|
|
500
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 추가배송비 템플릿 삭제
|
|
*
|
|
* @param int $id
|
|
* @return JsonResponse
|
|
*/
|
|
public function destroy(int $id): JsonResponse
|
|
{
|
|
$template = $this->extraFeeTemplateService->getDetail($id);
|
|
|
|
if (! $template) {
|
|
return ResponseHelper::notFound(
|
|
'messages.extra_fee_template.not_found',
|
|
[],
|
|
'sirsoft-ecommerce'
|
|
);
|
|
}
|
|
|
|
try {
|
|
$this->extraFeeTemplateService->delete($template);
|
|
|
|
return ResponseHelper::moduleSuccess(
|
|
'sirsoft-ecommerce',
|
|
'messages.extra_fee_template.deleted'
|
|
);
|
|
} catch (\Exception $e) {
|
|
// 서버 결함/인프라 장애 — 4xx 로 뭉개면 장애가 입력 오류로 위장된다
|
|
return ResponseHelper::moduleError(
|
|
'sirsoft-ecommerce',
|
|
'exceptions.operation_failed',
|
|
500
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 추가배송비 템플릿 사용여부 토글
|
|
*
|
|
* @param int $id
|
|
* @return JsonResponse
|
|
*/
|
|
public function toggleActive(int $id): JsonResponse
|
|
{
|
|
$template = $this->extraFeeTemplateService->getDetail($id);
|
|
|
|
if (! $template) {
|
|
return ResponseHelper::notFound(
|
|
'messages.extra_fee_template.not_found',
|
|
[],
|
|
'sirsoft-ecommerce'
|
|
);
|
|
}
|
|
|
|
try {
|
|
$updatedTemplate = $this->extraFeeTemplateService->toggleActive($template);
|
|
|
|
return ResponseHelper::moduleSuccess(
|
|
'sirsoft-ecommerce',
|
|
'messages.extra_fee_template.toggled',
|
|
new ExtraFeeTemplateResource($updatedTemplate)
|
|
);
|
|
} catch (\Exception $e) {
|
|
// 서버 결함/인프라 장애 — 4xx 로 뭉개면 장애가 입력 오류로 위장된다
|
|
return ResponseHelper::moduleError(
|
|
'sirsoft-ecommerce',
|
|
'exceptions.operation_failed',
|
|
500
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 추가배송비 템플릿 일괄 삭제
|
|
*
|
|
* @param ExtraFeeTemplateBulkDeleteRequest $request
|
|
* @return JsonResponse
|
|
*/
|
|
public function bulkDestroy(ExtraFeeTemplateBulkDeleteRequest $request): JsonResponse
|
|
{
|
|
try {
|
|
$count = $this->extraFeeTemplateService->bulkDelete($request->validated()['ids']);
|
|
|
|
return ResponseHelper::moduleSuccess(
|
|
'sirsoft-ecommerce',
|
|
'messages.extra_fee_template.bulk_deleted',
|
|
['deleted_count' => $count]
|
|
);
|
|
} catch (\Exception $e) {
|
|
// 서버 결함/인프라 장애 — 4xx 로 뭉개면 장애가 입력 오류로 위장된다
|
|
return ResponseHelper::moduleError(
|
|
'sirsoft-ecommerce',
|
|
'exceptions.operation_failed',
|
|
500
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 추가배송비 템플릿 일괄 사용여부 변경
|
|
*
|
|
* @param ExtraFeeTemplateBulkToggleActiveRequest $request
|
|
* @return JsonResponse
|
|
*/
|
|
public function bulkToggleActive(ExtraFeeTemplateBulkToggleActiveRequest $request): JsonResponse
|
|
{
|
|
try {
|
|
$validated = $request->validated();
|
|
$count = $this->extraFeeTemplateService->bulkToggleActive(
|
|
$validated['ids'],
|
|
$validated['is_active']
|
|
);
|
|
|
|
return ResponseHelper::moduleSuccess(
|
|
'sirsoft-ecommerce',
|
|
'messages.extra_fee_template.bulk_toggled',
|
|
['updated_count' => $count]
|
|
);
|
|
} catch (\Exception $e) {
|
|
// 서버 결함/인프라 장애 — 4xx 로 뭉개면 장애가 입력 오류로 위장된다
|
|
return ResponseHelper::moduleError(
|
|
'sirsoft-ecommerce',
|
|
'exceptions.operation_failed',
|
|
500
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 일괄 등록 (CSV/엑셀 업로드용)
|
|
*
|
|
* @param ExtraFeeTemplateBulkCreateRequest $request
|
|
* @return JsonResponse
|
|
*/
|
|
public function bulkStore(ExtraFeeTemplateBulkCreateRequest $request): JsonResponse
|
|
{
|
|
try {
|
|
$count = $this->extraFeeTemplateService->bulkCreate($request->validated()['items']);
|
|
|
|
return ResponseHelper::moduleSuccess(
|
|
'sirsoft-ecommerce',
|
|
'messages.extra_fee_template.bulk_created',
|
|
['created_count' => $count],
|
|
201
|
|
);
|
|
} catch (\Exception $e) {
|
|
// 서버 결함/인프라 장애 — 4xx 로 뭉개면 장애가 입력 오류로 위장된다
|
|
return ResponseHelper::moduleError(
|
|
'sirsoft-ecommerce',
|
|
'exceptions.operation_failed',
|
|
500
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 활성화된 템플릿을 배송정책용 JSON 배열로 반환
|
|
*
|
|
* @return JsonResponse
|
|
*/
|
|
public function activeSettings(): JsonResponse
|
|
{
|
|
$settings = $this->extraFeeTemplateService->getAllAsExtraFeeSettings();
|
|
|
|
return ResponseHelper::moduleSuccess(
|
|
'sirsoft-ecommerce',
|
|
'messages.extra_fee_template.settings_retrieved',
|
|
$settings
|
|
);
|
|
}
|
|
}
|