- CommonComponents.php: ApiResponse/ErrorResponse 글로벌 스키마 수정 - property="status" → property="success" (boolean) - property="data" → property="error" (object with code/details) - AuthApi, AdminApi, UserApi: 개별 응답 스키마 수정 - signup(): allOf 구조로 변경 - index(): Laravel LengthAwarePaginator 구조 적용 - updateMe(): Member schema 참조로 변경 - PermissionApi, MaterialApi, DepartmentApi: 로컬 스키마 재정의 제거 - ClientGroupService: 삭제된 데이터 자동 복원 기능 구현 - store(): withTrashed()로 삭제된 데이터 확인 후 restore() - update(): 삭제된 코드 존재 시 에러 반환 - ClientApi: client_group_id 필드 추가 - Client, ClientCreateRequest, ClientUpdateRequest 스키마에 추가 - lang/ko/error.php, lang/en/error.php: 에러 메시지 추가 - duplicate_code, has_clients, code_exists_in_deleted - Swagger 문서 재생성 및 검증 완료
79 lines
3.5 KiB
PHP
79 lines
3.5 KiB
PHP
<?php
|
|
/**
|
|
* 시스템/도메인 에러 메시지 (클라이언트 피드백용 고정 문자열)
|
|
* - DB 데이터 아님
|
|
* - 공통 핸들러/서비스에서 예외 메시지로 사용
|
|
* - 예: throw new NotFoundHttpException(__('error.not_found'));
|
|
*/
|
|
return [
|
|
|
|
// 4xx 공통
|
|
'not_found' => '존재하지 않는 URI 또는 데이터입니다.', // 404 일반
|
|
'tenant_id' => '활성 테넌트가 없습니다.', // 400 (Service::tenantId() 미설정)
|
|
'unauthenticated' => '인증에 실패했습니다.', // 401
|
|
'forbidden' => '요청에 대한 권한이 없습니다.', // 403
|
|
'bad_request' => '잘못된 요청입니다.', // 400 (검증 외 일반 케이스)
|
|
|
|
// 검증/파라미터
|
|
'validation_failed' => '요청 데이터 검증에 실패했습니다.', // 422
|
|
'missing_parameter' => '필수 파라미터가 누락되었습니다.', // 400
|
|
|
|
// 리소스별 (선택: :resource 자리표시자 사용)
|
|
'not_found_resource' => ':resource 정보를 찾을 수 없습니다.', // 예: __('error.not_found_resource', ['resource' => '제품'])
|
|
|
|
// 비즈니스 규칙
|
|
'duplicate' => '중복된 데이터가 존재합니다.',
|
|
'conflict' => '요청이 현재 상태와 충돌합니다.', // 409
|
|
'state_invalid' => '현재 상태에서는 처리할 수 없습니다.', // 409/400
|
|
|
|
// 서버 오류
|
|
'server_error' => '서버 처리 중 오류가 발생했습니다.', // 5xx 일반
|
|
|
|
// 견적 관련 에러
|
|
'estimate' => [
|
|
'cannot_delete_sent_or_approved' => '발송되었거나 승인된 견적은 삭제할 수 없습니다.',
|
|
'invalid_status_transition' => '현재 상태에서는 변경할 수 없습니다.',
|
|
],
|
|
|
|
// BOM 템플릿 관련
|
|
'bom_template' => [
|
|
'not_found' => '적용 가능한 BOM 템플릿을 찾을 수 없습니다.',
|
|
],
|
|
|
|
// 모델셋 관련
|
|
'modelset' => [
|
|
'has_dependencies' => '연관된 제품 또는 하위 카테고리가 있어 삭제할 수 없습니다.',
|
|
],
|
|
|
|
// 설정 관리 관련
|
|
'settings' => [
|
|
'field_not_found' => '해당 필드 설정을 찾을 수 없습니다.',
|
|
'option_group_not_found' => '해당 옵션 그룹을 찾을 수 없습니다.',
|
|
'common_code_duplicate' => '중복된 공통 코드가 존재합니다.',
|
|
'invalid_field_type' => '유효하지 않은 필드 타입입니다.',
|
|
],
|
|
|
|
// 자재 관리 관련
|
|
'materials' => [
|
|
'not_found' => '자재 정보를 찾을 수 없습니다.',
|
|
'duplicate_code' => '중복된 자재 코드입니다.',
|
|
'in_use_cannot_delete' => '사용 중인 자재는 삭제할 수 없습니다.',
|
|
],
|
|
|
|
// 파일 관리 관련
|
|
'file' => [
|
|
'not_found' => '파일을 찾을 수 없습니다.',
|
|
'upload_failed' => '파일 업로드에 실패했습니다.',
|
|
'invalid_file_type' => '허용되지 않는 파일 형식입니다.',
|
|
'file_too_large' => '파일 크기가 너무 큽니다.',
|
|
],
|
|
|
|
// 가격 관리 관련
|
|
'price_not_found' => ':item_type ID :item_id 항목의 :date 기준 매출단가를 찾을 수 없습니다.',
|
|
|
|
// 고객 그룹 관련
|
|
'duplicate_code' => '중복된 그룹 코드입니다.',
|
|
'has_clients' => '해당 고객 그룹에 속한 고객이 있어 삭제할 수 없습니다.',
|
|
'code_exists_in_deleted' => '삭제된 데이터에 동일한 코드가 존재합니다. 먼저 해당 코드를 완전히 삭제하거나 다른 코드를 사용하세요.',
|
|
];
|