diff --git a/app/Helpers/ApiResponse.php b/app/Helpers/ApiResponse.php index f9ea595..0b35274 100644 --- a/app/Helpers/ApiResponse.php +++ b/app/Helpers/ApiResponse.php @@ -117,19 +117,49 @@ public static function response($type = '', $query = '', $key = ''): array public static function handle( callable $callback, string $responseTitle = '요청' - ): JsonResponse { + ): JsonResponse + { try { $result = $callback(); + // 이미 JsonResponse면 그대로 반환 if ($result instanceof JsonResponse) { return $result; } - return self::success( - $result['data'] ?? null, $responseTitle." 성공", $result['query'] ?? [] - ); + // [신규] 서비스가 에러 ‘신호 배열’을 반환한 경우 감지 + // 허용 포맷 예: + // ['error' => 'NO_TENANT', 'code' => 400] + // ['code' => 404, 'message' => '데이터 없음'] + if (is_array($result) && ( + array_key_exists('error', $result) || + (array_key_exists('code', $result) && is_numeric($result['code']) && (int)$result['code'] >= 400) + ) + ) { + $code = (int)($result['code'] ?? 400); + $message = (string)($result['message'] ?? ($result['error'] ?? ($responseTitle.' 실패'))); + $details = $result['details'] ?? null; + + // 에러에도 쿼리 로그 포함되도록 error()가 처리하게 맡김 + return self::error($message, $code, ['details' => $details]); + } + + // 표준 박스( ['data'=>..., 'query'=>...] ) 하위호환 + if (is_array($result) && array_key_exists('data', $result)) { + $data = $result['data']; + $debug = $result['query'] ?? []; + } else { + // 그냥 도메인 결과만 반환한 경우 + $data = $result; + $debug = (app()->environment('local') && request()->is('api/*')) + ? self::debugQueryLog() + : []; + } + + return self::success($data, $responseTitle.' 성공', $debug); + } catch (\Throwable $e) { - return self::error($responseTitle." 실패", 500, [ + return self::error($responseTitle.' 실패', 500, [ 'details' => $e->getMessage(), ]); } diff --git a/app/Services/AdminService.php b/app/Services/AdminService.php index d80943c..8e99d15 100644 --- a/app/Services/AdminService.php +++ b/app/Services/AdminService.php @@ -4,14 +4,12 @@ use App\Helpers\ApiResponse; use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Str; use Illuminate\Validation\Rule; use App\Models\Members\User; use App\Models\Members\UserTenant; -use Spatie\Permission\Models\Role; class AdminService @@ -25,7 +23,7 @@ public static function getTenants(array $params = []) { $tenantId = app('tenant_id'); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '성 테넌트가 없습니다.', 'code' => 400]; } $page = isset($params['page']) ? (int)$params['page'] : 1; @@ -69,9 +67,7 @@ public static function getTenants(array $params = []) $q->orderBy($sortBy, $sortDir); - $data = $q->paginate($size, ['*'], 'page', $page); - - return ApiResponse::response('result', $data); + return $data = $q->paginate($size, ['*'], 'page', $page); } /** @@ -83,7 +79,7 @@ public static function store(array $params = []) { $tenantId = app('tenant_id'); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } // 신규 회원 생성 + 역할 부여 지원 @@ -98,7 +94,7 @@ public static function store(array $params = []) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $payload = $v->validated(); @@ -136,9 +132,9 @@ public static function store(array $params = []) } } - return ApiResponse::response('result', [ + return [ 'user' => $user->only(['id','user_id','name','email','phone']), - ]); + ]; }); } @@ -150,20 +146,20 @@ public static function show(int $userNo) { $tenantId = app('tenant_id'); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } if (!$userNo) { - return ApiResponse::error('회원 정보가 없습니다.', 422); + return ['error' => '회원 정보가 없습니다.', 'code' => 422]; } $user = User::whereHas('userTenants')->find($userNo); if (!$user) { - return ApiResponse::error('해당 사용자를 찾을 수 없습니다.', 404); + return ['error' => '해당 사용자를 찾을 수 없습니다.', 'code' => 404]; } - return ApiResponse::response('result', $user); + return $user; } /** @@ -175,22 +171,22 @@ public static function update(array $params = [], int $userNo) { $tenantId = app('tenant_id'); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } if (!$userNo) { - return ApiResponse::error('회원 정보가 없습니다.', 422); + return ['error' => '회원 정보가 없습니다.', 'code' => 422]; } // 1) 유저 존재/테넌트 소속 확인 $user = User::find($userNo); if (!$user) { - return ApiResponse::error('해당 회원을 찾을 수 없습니다.', 404); + return ['error' => '해당 회원을 찾을 수 없습니다.', 'code' => 404]; } $linked = UserTenant::where('tenant_id', $tenantId) ->where('user_id', $userNo) ->exists(); if (!$linked) { - return ApiResponse::error('이 테넌트에 소속된 회원이 아닙니다.', 403); + return ['error' => '이 테넌트에 소속된 회원이 아닙니다.', 'code' => 403]; } // 2) 프로필 + roles만 수정 @@ -205,7 +201,7 @@ public static function update(array $params = [], int $userNo) 'roles.*' => 'string|max:100', ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $payload = $v->validated(); @@ -214,7 +210,7 @@ public static function update(array $params = [], int $userNo) $hasProfileInput = (bool) array_intersect(array_keys($payload), $updatableKeys); $hasRolesInput = array_key_exists('roles', $payload); if (!$hasProfileInput && !$hasRolesInput) { - return ApiResponse::error('수정할 항목이 없습니다.', 422); + return ['error' => '수정할 항목이 없습니다.', 'code' => 422]; } return DB::transaction(function () use ($user, $payload, $tenantId, $updatableKeys) { @@ -252,10 +248,10 @@ public static function update(array $params = [], int $userNo) } } - return ApiResponse::response('result', [ + return [ 'user' => $user->only(['id','user_id','name','email','phone']), 'roles' => method_exists($user, 'getRoleNames') ? $user->getRoleNames() : [], - ]); + ]; }); } @@ -267,10 +263,10 @@ public static function destroy(int $userNo) { $tenantId = app('tenant_id'); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } if (!$userNo) { - return ApiResponse::error('회원 정보가 없습니다.', 422); + return ['error' => '회원 정보가 없습니다.', 'code' => 422]; } $ut = UserTenant::where('user_id',$userNo) @@ -278,14 +274,14 @@ public static function destroy(int $userNo) ->first(); if (!$ut) { - return ApiResponse::error('해당 사용자를 찾을 수 없습니다.', 404); + return ['error' => '해당 사용자를 찾을 수 없습니다.', 'code' => 404]; } $ut->left_at = now(); $ut->save(); $ut->delete(); // SoftDeletes 가정 - return ApiResponse::response('success'); + return 'success'; } /** @@ -295,10 +291,10 @@ public static function restore(int $userNo) { $tenantId = app('tenant_id'); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } if (!$userNo) { - return ApiResponse::error('회원 정보가 없습니다.', 422); + return ['error' => '회원 정보가 없습니다.', 'code' => 422]; } $ut = UserTenant::withTrashed() @@ -307,7 +303,7 @@ public static function restore(int $userNo) ->first(); if (!$ut) { - return ApiResponse::error('해당 사용자를 찾을 수 없습니다.', 404); + return ['error' => '해당 사용자를 찾을 수 없습니다.', 'code' => 404]; } if ($ut->trashed()) { @@ -316,7 +312,7 @@ public static function restore(int $userNo) $ut->save(); } - return ApiResponse::response('success'); + return 'success'; } /** @@ -326,10 +322,10 @@ public static function toggle(int $userNo) { $tenantId = app('tenant_id'); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } if (!$userNo) { - return ApiResponse::error('회원 정보가 없습니다.', 422); + return ['error' => '회원 정보가 없습니다.', 'code' => 422]; } $ut = UserTenant::where('tenant_id', $tenantId) @@ -337,13 +333,13 @@ public static function toggle(int $userNo) ->first(); if (!$ut) { - return ApiResponse::error('해당 사용자를 찾을 수 없습니다.', 404); + return ['error' => '해당 사용자를 찾을 수 없습니다.', 'code' => 404]; } $ut->is_active = $ut->is_active ? 0 : 1; $ut->save(); - return ApiResponse::response('result',['is_active' => $ut->is_active]); + return ['is_active' => $ut->is_active]; } /** @@ -354,7 +350,7 @@ public static function attach(array $params = []) { $tenantId = app('tenant_id'); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $v = Validator::make($params, [ @@ -362,13 +358,13 @@ public static function attach(array $params = []) 'role_name' => 'required|string|max:100', ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $user = User::find($params['user_id']); if (!method_exists($user, 'assignRole')) { // Spatie 미사용 환경 방어 - return ApiResponse::error('역할 시스템이 활성화되어 있지 않습니다.', 501); + return ['error' => '역할 시스템이 활성화되어 있지 않습니다.', 'code' => 501]; } // teams(tenant) 스코프 @@ -382,7 +378,7 @@ public static function attach(array $params = []) app()->instance('permission.team_id', $previousTeam); } - return ApiResponse::response('success'); + return 'success'; } /** @@ -393,7 +389,7 @@ public static function detach(array $params = []) { $tenantId = app('tenant_id'); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $v = Validator::make($params, [ @@ -401,12 +397,12 @@ public static function detach(array $params = []) 'role_name' => 'required|string|max:100', ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $user = User::find($params['user_id']); if (!method_exists($user, 'removeRole')) { - return ApiResponse::error('역할 시스템이 활성화되어 있지 않습니다.', 501); + return ['error' => '역할 시스템이 활성화되어 있지 않습니다.', 'code' => 501]; } $previousTeam = app()->has('permission.team_id') ? app('permission.team_id') : null; @@ -418,7 +414,7 @@ public static function detach(array $params = []) app()->instance('permission.team_id', $previousTeam); } - return ApiResponse::response('success'); + return 'success'; } /** @@ -431,10 +427,10 @@ public static function reset(array $params = [],int $userNo) { $tenantId = app('tenant_id'); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } if (!$userNo) { - return ApiResponse::error('회원 정보가 없습니다.', 422); + return ['error' => '회원 정보가 없습니다.', 'code' => 422]; } $v = Validator::make($params, [ @@ -442,13 +438,13 @@ public static function reset(array $params = [],int $userNo) 'return_password' => 'nullable|in:0,1', // 1이면 응답에 임시 비번 포함(개발용) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $payload = $v->validated(); $user = User::find($userNo); if (!$user) { - return ApiResponse::error('유저를 찾을 수 없습니다.', 404); + return ['error' => '유저를 찾을 수 없습니다.', 'code' => 404]; } $new = $payload['new_password'] ?? Str::random(12); @@ -464,6 +460,6 @@ public static function reset(array $params = [],int $userNo) $resp['temp_password'] = $new; } - return ApiResponse::response('result', $resp); + return $resp; } } diff --git a/app/Services/Authz/RolePermissionService.php b/app/Services/Authz/RolePermissionService.php index 89184cb..50bf251 100644 --- a/app/Services/Authz/RolePermissionService.php +++ b/app/Services/Authz/RolePermissionService.php @@ -82,7 +82,7 @@ public static function list(int $roleId) $role = self::loadRoleOrError($roleId, $tenantId); if (!$role) { - return ApiResponse::error('역할을 찾을 수 없습니다.', 404); + return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404]; } self::setTeam($tenantId); @@ -93,7 +93,7 @@ public static function list(int $roleId) ->orderBy('name') ->get(['id','tenant_id','name','guard_name','created_at','updated_at']); - return ApiResponse::response('result', $perms); + return $perms; } /** 부여 (중복 무시) */ @@ -103,7 +103,7 @@ public static function grant(int $roleId, array $params = []) $role = self::loadRoleOrError($roleId, $tenantId); if (!$role) { - return ApiResponse::error('역할을 찾을 수 없습니다.', 404); + return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404]; } // 유효성: 두 방식 중 하나만 요구하진 않지만, 최소 하나는 있어야 함 @@ -118,23 +118,23 @@ public static function grant(int $roleId, array $params = []) ], ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } if (empty($params['permission_names']) && (empty($params['menus']) || empty($params['actions']))) { - return ApiResponse::error('permission_names 또는 menus+actions 중 하나는 필요합니다.', 422); + return ['error' => 'permission_names 또는 menus+actions 중 하나는 필요합니다.', 'code' => 422]; } self::setTeam($tenantId); $names = self::resolvePermissionNames($tenantId, $params); if (empty($names)) { - return ApiResponse::error('유효한 퍼미션이 없습니다.', 422); + return ['error' => '유효한 퍼미션이 없습니다.', 'code' => 422]; } // Spatie: 이름 배열 부여 OK (teams 컨텍스트 적용됨) $role->givePermissionTo($names); - return ApiResponse::response('success'); + return 'success'; } /** 회수 (없는 건 무시) */ @@ -144,7 +144,7 @@ public static function revoke(int $roleId, array $params = []) $role = self::loadRoleOrError($roleId, $tenantId); if (!$role) { - return ApiResponse::error('역할을 찾을 수 없습니다.', 404); + return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404]; } $v = Validator::make($params, [ @@ -158,22 +158,22 @@ public static function revoke(int $roleId, array $params = []) ], ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } if (empty($params['permission_names']) && (empty($params['menus']) || empty($params['actions']))) { - return ApiResponse::error('permission_names 또는 menus+actions 중 하나는 필요합니다.', 422); + return ['error' => 'permission_names 또는 menus+actions 중 하나는 필요합니다.', 'code' => 422]; } self::setTeam($tenantId); $names = self::resolvePermissionNames($tenantId, $params); if (empty($names)) { - return ApiResponse::error('유효한 퍼미션이 없습니다.', 422); + return ['error' => '유효한 퍼미션이 없습니다.', 'code' => 422]; } $role->revokePermissionTo($names); - return ApiResponse::response('success'); + return 'success'; } /** 동기화(완전 교체) */ @@ -183,7 +183,7 @@ public static function sync(int $roleId, array $params = []) $role = self::loadRoleOrError($roleId, $tenantId); if (!$role) { - return ApiResponse::error('역할을 찾을 수 없습니다.', 404); + return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404]; } $v = Validator::make($params, [ @@ -197,10 +197,10 @@ public static function sync(int $roleId, array $params = []) ], ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } if (empty($params['permission_names']) && (empty($params['menus']) || empty($params['actions']))) { - return ApiResponse::error('permission_names 또는 menus+actions 중 하나는 필요합니다.', 422); + return ['error' => 'permission_names 또는 menus+actions 중 하나는 필요합니다.', 'code' => 422]; } self::setTeam($tenantId); @@ -209,6 +209,6 @@ public static function sync(int $roleId, array $params = []) // 동기화 $role->syncPermissions($names); - return ApiResponse::response('success'); + return 'success'; } } diff --git a/app/Services/Authz/RoleService.php b/app/Services/Authz/RoleService.php index 58d65e5..d3b1547 100644 --- a/app/Services/Authz/RoleService.php +++ b/app/Services/Authz/RoleService.php @@ -35,7 +35,7 @@ public static function index(array $params = []) $list = $query->orderByDesc('id') ->paginate($size, ['*'], 'page', $page); - return ApiResponse::response('result', $list); + return $list; } /** 생성 */ @@ -54,7 +54,7 @@ public static function store(array $params = []) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } // Spatie 팀(테넌트) 컨텍스트 @@ -67,7 +67,7 @@ public static function store(array $params = []) 'description' => $params['description'] ?? null, ]); - return ApiResponse::response('result', $role); + return $role; } /** 단건 */ @@ -80,10 +80,10 @@ public static function show(int $id) ->find($id); if (!$role) { - return ApiResponse::error('역할을 찾을 수 없습니다.', 404); + return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404]; } - return ApiResponse::response('result', $role); + return $role; } /** 수정 */ @@ -96,7 +96,7 @@ public static function update(int $id, array $params = []) ->find($id); if (!$role) { - return ApiResponse::error('역할을 찾을 수 없습니다.', 404); + return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404]; } $v = Validator::make($params, [ @@ -110,12 +110,12 @@ public static function update(int $id, array $params = []) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $role->fill($v->validated())->save(); - return ApiResponse::response('result', $role->fresh()); + return $role->fresh(); } /** 삭제 (하드삭제) */ @@ -128,13 +128,13 @@ public static function destroy(int $id) ->find($id); if (!$role) { - return ApiResponse::error('역할을 찾을 수 없습니다.', 404); + return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404]; } DB::transaction(function () use ($role) { $role->delete(); // Spatie Role 기본: soft delete 없음 }); - return ApiResponse::response('success'); + return 'success'; } } diff --git a/app/Services/Authz/UserRoleService.php b/app/Services/Authz/UserRoleService.php index 5592204..080f01f 100644 --- a/app/Services/Authz/UserRoleService.php +++ b/app/Services/Authz/UserRoleService.php @@ -74,7 +74,7 @@ public static function list(int $userId) $user = self::loadUserOrError($userId); if (!$user) { - return ApiResponse::error('사용자를 찾을 수 없습니다.', 404); + return ['error' => '사용자를 찾을 수 없습니다.', 'code' => 404]; } self::setTeam($tenantId); @@ -86,7 +86,7 @@ public static function list(int $userId) ->select(['roles.id','roles.tenant_id','roles.name','roles.description','roles.guard_name','roles.created_at','roles.updated_at']) ->orderBy('roles.id', 'desc'); - return ApiResponse::response('get', $builder); + return $builder->get(); } /** 부여 (중복 무시) */ @@ -96,7 +96,7 @@ public static function grant(int $userId, array $params = []) $user = self::loadUserOrError($userId); if (!$user) { - return ApiResponse::error('사용자를 찾을 수 없습니다.', 404); + return ['error' => '사용자를 찾을 수 없습니다.', 'code' => 404]; } $v = Validator::make($params, [ @@ -106,21 +106,21 @@ public static function grant(int $userId, array $params = []) 'role_ids.*' => 'integer|min:1', ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } if (empty($params['role_names']) && empty($params['role_ids'])) { - return ApiResponse::error('role_names 또는 role_ids 중 하나는 필요합니다.', 422); + return ['error' => 'role_names 또는 role_ids 중 하나는 필요합니다.', 'code' => 422]; } self::setTeam($tenantId); $names = self::resolveRoleNames($tenantId, $params); if (empty($names)) { - return ApiResponse::error('유효한 역할이 없습니다.', 422); + return ['error' => '유효한 역할이 없습니다.', 'code' => 422]; } $user->assignRole($names); // teams 컨텍스트 적용됨 - return ApiResponse::response('success'); + return 'success'; } /** 회수 (없는 건 무시) */ @@ -130,7 +130,7 @@ public static function revoke(int $userId, array $params = []) $user = self::loadUserOrError($userId); if (!$user) { - return ApiResponse::error('사용자를 찾을 수 없습니다.', 404); + return ['error' => '사용자를 찾을 수 없습니다.', 'code' => 404]; } $v = Validator::make($params, [ @@ -140,21 +140,21 @@ public static function revoke(int $userId, array $params = []) 'role_ids.*' => 'integer|min:1', ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } if (empty($params['role_names']) && empty($params['role_ids'])) { - return ApiResponse::error('role_names 또는 role_ids 중 하나는 필요합니다.', 422); + return ['error' => 'role_names 또는 role_ids 중 하나는 필요합니다.', 'code' => 422]; } self::setTeam($tenantId); $names = self::resolveRoleNames($tenantId, $params); if (empty($names)) { - return ApiResponse::error('유효한 역할이 없습니다.', 422); + return ['error' => '유효한 역할이 없습니다.', 'code' => 422]; } $user->removeRole($names); // 배열 허용 - return ApiResponse::response('success'); + return 'success'; } /** 동기화(완전 교체) */ @@ -164,7 +164,7 @@ public static function sync(int $userId, array $params = []) $user = self::loadUserOrError($userId); if (!$user) { - return ApiResponse::error('사용자를 찾을 수 없습니다.', 404); + return ['error' => '사용자를 찾을 수 없습니다.', 'code' => 404]; } $v = Validator::make($params, [ @@ -174,10 +174,10 @@ public static function sync(int $userId, array $params = []) 'role_ids.*' => 'integer|min:1', ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } if (empty($params['role_names']) && empty($params['role_ids'])) { - return ApiResponse::error('role_names 또는 role_ids 중 하나는 필요합니다.', 422); + return ['error' => 'role_names 또는 role_ids 중 하나는 필요합니다.', 'code' => 422]; } self::setTeam($tenantId); @@ -185,10 +185,10 @@ public static function sync(int $userId, array $params = []) $names = self::resolveRoleNames($tenantId, $params); if (empty($names)) { // 정책상 빈 목록 sync 허용 시: $user->syncRoles([]) 로 전부 제거 가능 - return ApiResponse::error('유효한 역할이 없습니다.', 422); + return ['error' => '유효한 역할이 없습니다.', 'code' => 422]; } $user->syncRoles($names); - return ApiResponse::response('success'); + return 'success'; } } diff --git a/app/Services/BomService.php b/app/Services/BomService.php index ff502f9..0bbf7ab 100644 --- a/app/Services/BomService.php +++ b/app/Services/BomService.php @@ -12,34 +12,34 @@ class BomService public static function getBoms() { $query = new Bom(); - return ApiResponse::response('get', $query); + return $query->get(); } public static function setBom() { $query = DB::table('COM_CODE') ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); - return ApiResponse::response('get', $query); + return $query->get(); } public static function getBom(int $id) { $query = Bom::find($id); - return ApiResponse::response('get', $query); + return $query->get(); } public static function updateBom(int $id) { $query = DB::table('COM_CODE') ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); - return ApiResponse::response('get', $query); + return $query->get(); } public static function destoryBom(int $id) { $query = DB::table('COM_CODE') ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); - return ApiResponse::response('get', $query); + return $query->get(); } } diff --git a/app/Services/DepartmentService.php b/app/Services/DepartmentService.php index 7d2f0ac..2d63dfc 100644 --- a/app/Services/DepartmentService.php +++ b/app/Services/DepartmentService.php @@ -20,7 +20,7 @@ private static function v(array $params, array $rules) { $v = Validator::make($params, $rules); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } return $v->validated(); } @@ -54,7 +54,7 @@ public static function index(array $params) $page = $p['page'] ?? null; // 페이징 객체는 'result'로 반환 - return ApiResponse::response('result', $q->paginate($perPage, ['*'], 'page', $page)); + return $q->paginate($perPage, ['*'], 'page', $page); } /** 생성 */ @@ -72,7 +72,7 @@ public static function store(array $params) if (!empty($p['code'])) { $exists = Department::query()->where('code', $p['code'])->exists(); - if ($exists) return ApiResponse::error('이미 존재하는 부서 코드입니다.', 409); + if ($exists) return ['error' => '이미 존재하는 부서 코드입니다.', 'code' => 409]; } $dept = Department::create([ @@ -85,19 +85,17 @@ public static function store(array $params) 'updated_by' => $p['created_by'] ?? null, ]); - return ApiResponse::response('result', $dept->fresh()); + return $dept->fresh(); } /** 단건 */ public static function show(int $id, array $params) { - if (!$id) return ApiResponse::error('id가 필요합니다.', 400); - - $q = Department::query()->where('id', $id); - $res = ApiResponse::response('first', $q); + if (!$id) return ['error' => 'id가 필요합니다.', 'code' => 400]; + $res = Department::query()->where('id', $id)->first(); if (empty($res['data'])) { - return ApiResponse::error('부서를 찾을 수 없습니다.', 404); + return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404]; } return $res; } @@ -105,7 +103,7 @@ public static function show(int $id, array $params) /** 수정 */ public static function update(int $id, array $params) { - if (!$id) return ApiResponse::error('id가 필요합니다.', 400); + if (!$id) return ['error' => 'id가 필요합니다.', 'code' => 400]; $p = self::v($params, [ 'code' => 'nullable|string|max:50', @@ -118,14 +116,14 @@ public static function update(int $id, array $params) if ($p instanceof JsonResponse) return $p; $dept = Department::query()->find($id); - if (!$dept) return ApiResponse::error('부서를 찾을 수 없습니다.', 404); + if (!$dept) return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404]; if (array_key_exists('code', $p) && !is_null($p['code'])) { $exists = Department::query() ->where('code', $p['code']) ->where('id', '!=', $id) ->exists(); - if ($exists) return ApiResponse::error('이미 존재하는 부서 코드입니다.', 409); + if ($exists) return ['error' => '이미 존재하는 부서 코드입니다.', 'code' => 409]; } $dept->fill([ @@ -137,13 +135,13 @@ public static function update(int $id, array $params) 'updated_by' => $p['updated_by'] ?? $dept->updated_by, ])->save(); - return ApiResponse::response('result', $dept->fresh()); + return $dept->fresh(); } /** 삭제(soft) */ public static function destroy(int $id, array $params) { - if (!$id) return ApiResponse::error('id가 필요합니다.', 400); + if (!$id) return ['error' => 'id가 필요합니다.', 'code' => 400]; $p = self::v($params, [ 'deleted_by' => 'nullable|integer|min:1', @@ -151,7 +149,7 @@ public static function destroy(int $id, array $params) if ($p instanceof JsonResponse) return $p; $dept = Department::query()->find($id); - if (!$dept) return ApiResponse::error('부서를 찾을 수 없습니다.', 404); + if (!$dept) return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404]; if (!empty($p['deleted_by'])) { $dept->deleted_by = $p['deleted_by']; @@ -159,7 +157,7 @@ public static function destroy(int $id, array $params) } $dept->delete(); - return ApiResponse::response('result', ['id' => $id, 'deleted_at' => now()->toDateTimeString()]); + return ['id' => $id, 'deleted_at' => now()->toDateTimeString()]; } /** 부서 사용자 목록 */ @@ -172,7 +170,7 @@ public static function listUsers(int $deptId, array $params) if ($p instanceof JsonResponse) return $p; $dept = Department::query()->find($deptId); - if (!$dept) return ApiResponse::error('부서를 찾을 수 없습니다.', 404); + if (!$dept) return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404]; $builder = $dept->departmentUsers()->with('user') ->orderByDesc('is_primary')->orderBy('id'); @@ -180,7 +178,7 @@ public static function listUsers(int $deptId, array $params) $perPage = $p['per_page'] ?? 20; $page = $p['page'] ?? null; - return ApiResponse::response('result', $builder->paginate($perPage, ['*'], 'page', $page)); + return $builder->paginate($perPage, ['*'], 'page', $page); } /** 사용자 배정 (단건) */ @@ -194,7 +192,7 @@ public static function attachUser(int $deptId, array $params) if ($p instanceof JsonResponse) return $p; $dept = Department::query()->find($deptId); - if (!$dept) return ApiResponse::error('부서를 찾을 수 없습니다.', 404); + if (!$dept) return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404]; $result = DB::transaction(function () use ($dept, $p) { $du = DepartmentUser::withTrashed() @@ -203,7 +201,7 @@ public static function attachUser(int $deptId, array $params) ->first(); if ($du && is_null($du->deleted_at)) { - return ApiResponse::error('이미 배정된 사용자입니다.', 409); + return ['error' => '이미 배정된 사용자입니다.', 'code' => 409]; } if (!empty($p['is_primary']) && (int)$p['is_primary'] === 1) { @@ -233,7 +231,7 @@ public static function attachUser(int $deptId, array $params) // 트랜잭션 내부에서 에러 응답이 나올 수 있으므로 분기 if ($result instanceof JsonResponse) return $result; - return ApiResponse::response('result', $result); + return $result; } /** 사용자 제거(soft) */ @@ -244,14 +242,14 @@ public static function detachUser(int $deptId, int $userId, array $params) ->where('user_id', $userId) ->first(); - if (!$du) return ApiResponse::error('배정된 사용자를 찾을 수 없습니다.', 404); + if (!$du) return ['error' => '배정된 사용자를 찾을 수 없습니다.', 'code' => 404]; $du->delete(); - return ApiResponse::response('result', [ + return [ 'user_id' => $userId, 'deleted_at' => now()->toDateTimeString(), - ]); + ]; } /** 주부서 설정/해제 */ @@ -269,7 +267,7 @@ public static function setPrimary(int $deptId, int $userId, array $params) ->first(); if (!$du) { - return ApiResponse::error('배정된 사용자를 찾을 수 없습니다.', 404); + return ['error' => '배정된 사용자를 찾을 수 없습니다.', 'code' => 404]; } if ((int)$p['is_primary'] === 1) { @@ -286,7 +284,7 @@ public static function setPrimary(int $deptId, int $userId, array $params) if ($result instanceof JsonResponse) return $result; - return ApiResponse::response('result', $result); + return $result; } /** 부서 권한 목록 */ @@ -301,7 +299,7 @@ public static function listPermissions(int $deptId, array $params) if ($p instanceof JsonResponse) return $p; $dept = Department::query()->find($deptId); - if (!$dept) return ApiResponse::error('부서를 찾을 수 없습니다.', 404); + if (!$dept) return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404]; $q = DepartmentPermission::query() ->whereNull('deleted_at') @@ -315,7 +313,7 @@ public static function listPermissions(int $deptId, array $params) $perPage = $p['per_page'] ?? 20; $page = $p['page'] ?? null; - return ApiResponse::response('result', $q->paginate($perPage, ['*'], 'page', $page)); + return $q->paginate($perPage, ['*'], 'page', $page); } /** 권한 부여/차단 upsert */ @@ -329,7 +327,7 @@ public static function upsertPermission(int $deptId, array $params) if ($p instanceof JsonResponse) return $p; $dept = Department::query()->find($deptId); - if (!$dept) return ApiResponse::error('부서를 찾을 수 없습니다.', 404); + if (!$dept) return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404]; $payload = [ 'department_id' => $deptId, @@ -361,14 +359,14 @@ public static function revokePermission(int $deptId, int $permissionId, array $p if (isset($p['menu_id'])) $q->where('menu_id', $p['menu_id']); $rows = $q->get(); - if ($rows->isEmpty()) return ApiResponse::error('대상 권한을 찾을 수 없습니다.', 404); + if ($rows->isEmpty()) return ['error' => '대상 권한을 찾을 수 없습니다.', 'code' => 404]; foreach ($rows as $row) $row->delete(); - return ApiResponse::response('result', [ + return [ 'permission_id' => $permissionId, 'menu_id' => $p['menu_id'] ?? null, 'deleted_count' => $rows->count(), - ]); + ]; } } diff --git a/app/Services/FileService.php b/app/Services/FileService.php index b6dc325..5f44cbf 100644 --- a/app/Services/FileService.php +++ b/app/Services/FileService.php @@ -40,7 +40,7 @@ public static function saveFiles($files, string $table, string $t_id, string $t_ 'REG_USER_NO' => session('Adm.idx') ?? 1, ]); } catch (\Exception $e) { - return ApiResponse::error('파일업로드 실패', 422); + return ['error' => '파일업로드 실패', 'code' => 422]; } } } @@ -92,7 +92,7 @@ public static function uploadFiles($request) 'REG_USER_NO' => session('Adm.idx') ?? 1, ]); } catch (\Exception $e) { - return ApiResponse::error('파일업로드 실패', 422); + return ['error' => '파일업로드 실패', 'code' => 422]; } } @@ -136,7 +136,7 @@ public static function getFiles(array $params): array $query->where('SF.T_ID_TYPE', $tType); } - return ApiResponse::response('getSub', $query, $params['debug'], 'T_ID'); + return $query->get(); } public static function deleteFiles(array $params): string @@ -180,9 +180,9 @@ public static function findFile(array $params): ?array ->select('F_NAME', 'T_ID', 'F_TYPE', DB::raw("IFNULL((SELECT COM_NAME FROM COMPANY_INFO CI WHERE SF.T_ID = CI.COM_NO AND SF.TABLE = 'COMPANY_INFO' LIMIT 1), '') as COM_NAME")); if($F_NO) $query->where('F_NO', $F_NO); - else $query->where('R_NAME', $fileName); + else $query->where('R_NAME', $fileName)->first(); - return ApiResponse::response('first', $query, $params['debug']); + return $query; } } diff --git a/app/Services/MemberService.php b/app/Services/MemberService.php index 913bf47..b30cfd5 100644 --- a/app/Services/MemberService.php +++ b/app/Services/MemberService.php @@ -27,7 +27,7 @@ public static function getMembers($request) })->debug(); $query = $query->paginate($pageSize, ['*'], 'page', $pageNo); - return ApiResponse::response('result', $query); + return $query; } @@ -40,7 +40,7 @@ public static function getMember(int $userNo) $query = User::whereHas('userTenants', function($q) { $q->active(); })->where('id', $userNo); - return ApiResponse::response('first', $query); + return $query->first(); } @@ -59,7 +59,7 @@ public static function getMyInfo() $data['tenant'] = $tenant; } - return ApiResponse::response('result', $data); + return $data; } /** @@ -83,14 +83,14 @@ public static function getMyUpdate($request) $user = User::find($apiUser); if (!$user) { - return ApiResponse::error('User not found.', 404); + return ['error' => 'User not found.', 'code' => 404]; } // 사용자 정보 업데이트 $user->update($validatedData); // 수정 성공 시 success 반환 - return ApiResponse::response('success'); + return 'success'; } /** @@ -109,23 +109,23 @@ public static function setMyPassword($request) // 선택적으로 확인 비밀번호가 온 경우 체크 if ($request->filled('new_password_confirmation') && $request->input('new_password_confirmation') !== $validated['new_password']) { - return ApiResponse::error('비밀번호 확인이 일치하지 않습니다.', 400); + return ['error' => '비밀번호 확인이 일치하지 않습니다.', 'code' => 400]; } // 유저 조회 $user = User::find($apiUserId); if (!$user) { - return ApiResponse::error('유저를 찾을 수 없음', 404); + return ['error' => '유저를 찾을 수 없음', 'code' => 404]; } // 현재 비밀번호 확인 if (!Hash::check($validated['current_password'], $user->password)) { - return ApiResponse::error('현재 비밀번호가 일치하지 않습니다.', 400); + return ['error' => '현재 비밀번호가 일치하지 않습니다.', 'code' => 400]; } // 기존 비밀번호와 동일한지 방지 if (Hash::check($validated['new_password'], $user->password)) { - return ApiResponse::error('새 비밀번호가 기존 비밀번호와 동일합니다.', 400); + return ['error' => '새 비밀번호가 기존 비밀번호와 동일합니다.', 'code' => 400]; } // 비밀번호 변경 (guarded 우회: 직접 대입 + save) @@ -135,7 +135,7 @@ public static function setMyPassword($request) // (선택) 모든 기존 토큰 무효화하려면 아래 주석 해제 // $user->tokens()->delete(); - return ApiResponse::response('success'); + return 'success'; } /** @@ -154,7 +154,7 @@ public static function getMyTenants() 'user_tenants.is_default' ]); - return ApiResponse::response('result', $data); + return $data; } @@ -179,9 +179,9 @@ public static function switchMyTenant(int $tenantId) ->update(['is_default' => 1]); if (!$updated) { - return ApiResponse::error('해당 테넌트를 찾을 수 없습니다.', 404); + return ['error' => '해당 테넌트를 찾을 수 없습니다.', 'code' => 404]; } - return ApiResponse::response('success'); + return 'success'; } } diff --git a/app/Services/MenuService.php b/app/Services/MenuService.php index 28b6423..7af2d80 100644 --- a/app/Services/MenuService.php +++ b/app/Services/MenuService.php @@ -37,7 +37,7 @@ public static function index(array $params) $q->orderBy('parent_id')->orderBy('sort_order'); // Builder 그대로 전달해야 쿼리로그/표준응답 형식 유지 - return ApiResponse::response('get', $q); + return $q->get(); } /** @@ -49,15 +49,12 @@ public static function show(array $params) $tenantId = self::tenantId(); if (!$id) { - return ApiResponse::error('id가 필요합니다.', 400); + return ['error' => 'id가 필요합니다.', 'code' => 400]; } - $q = Menu::withShared($tenantId)->where('id', $id); - - // first 쿼리를 ApiResponse에 위임 (존재X면 null 반환) - $res = ApiResponse::response('first', $q); + $res = Menu::withShared($tenantId)->find($id); if (empty($res['data'])) { - return ApiResponse::error('Menu not found', 404); + return ['error' => 'Menu not found', 'code' => 404]; } return $res; } @@ -83,7 +80,7 @@ public static function store(array $params) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $data = $v->validated(); @@ -103,7 +100,7 @@ public static function store(array $params) $menu->save(); // 생성 결과를 그대로 전달 - return ApiResponse::response('result', $menu->fresh()); + return $menu->fresh(); } /** @@ -116,7 +113,7 @@ public static function update(array $params) $userId = self::actorId(); if (!$id) { - return ApiResponse::error('id가 필요합니다.', 400); + return ['error' => 'id가 필요합니다.', 'code' => 400]; } $v = Validator::make($params, [ @@ -132,13 +129,13 @@ public static function update(array $params) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $data = $v->validated(); $menu = Menu::withShared($tenantId)->where('id', $id)->first(); if (!$menu) { - return ApiResponse::error('Menu not found', 404); + return ['error' => 'Menu not found', 'code' => 404]; } $update = Arr::only($data, [ @@ -147,13 +144,13 @@ public static function update(array $params) $update = array_filter($update, fn($v) => !is_null($v)); if (empty($update)) { - return ApiResponse::error('수정할 데이터가 없습니다.', 400); + return ['error' => '수정할 데이터가 없습니다.', 'code' => 400]; } $update['updated_by'] = $userId; $menu->fill($update)->save(); - return ApiResponse::response('result', $menu->fresh()); + return $menu->fresh(); } /** @@ -166,19 +163,19 @@ public static function destroy(array $params) $userId = self::actorId(); if (!$id) { - return ApiResponse::error('id가 필요합니다.', 400); + return ['error' => 'id가 필요합니다.', 'code' => 400]; } $menu = Menu::withShared($tenantId)->where('id', $id)->first(); if (!$menu) { - return ApiResponse::error('Menu not found', 404); + return ['error' => 'Menu not found', 'code' => 404]; } $menu->deleted_by = $userId; $menu->save(); $menu->delete(); - return ApiResponse::response('success'); + return 'success'; } /** @@ -188,7 +185,7 @@ public static function destroy(array $params) public static function reorder(array $params) { if (!is_array($params) || empty($params)) { - return ApiResponse::error('유효한 정렬 목록이 필요합니다.', 422); + return ['error' => '유효한 정렬 목록이 필요합니다.', 'code' => 422]; } $tenantId = self::tenantId(); @@ -204,7 +201,7 @@ public static function reorder(array $params) } }); - return ApiResponse::response('success'); + return 'success'; } /** @@ -217,7 +214,7 @@ public static function toggle(array $params) $userId = self::actorId(); if (!$id) { - return ApiResponse::error('id가 필요합니다.', 400); + return ['error' => 'id가 필요합니다.', 'code' => 400]; } $payload = array_filter([ @@ -227,17 +224,17 @@ public static function toggle(array $params) ], fn($v) => !is_null($v)); if (empty($payload)) { - return ApiResponse::error('변경할 필드가 없습니다.', 422); + return ['error' => '변경할 필드가 없습니다.', 'code' => 422]; } $menu = Menu::withShared($tenantId)->find($id); if (!$menu) { - return ApiResponse::error('Menu not found', 404); + return ['error' => 'Menu not found', 'code' => 404]; } $payload['updated_by'] = $userId; $menu->fill($payload)->save(); - return ApiResponse::response('result', $menu->fresh()); + return $menu->fresh(); } } diff --git a/app/Services/MeterialService.php b/app/Services/MeterialService.php index 5c12230..b90b73e 100644 --- a/app/Services/MeterialService.php +++ b/app/Services/MeterialService.php @@ -12,33 +12,33 @@ class MeterialService public static function getMeterials() { $query = new Material(); - return ApiResponse::response('get', $query); + return $query->get(); } public static function setMeterial() { $query = DB::table('COM_CODE') ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); - return ApiResponse::response('get', $query); + return $query->get(); } public static function getMeterial(int $id) { $query = Material::find($id); - return ApiResponse::response('get', $query); + return $query->get(); } public static function updateMeterial(int $id) { $query = DB::table('COM_CODE') ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); - return ApiResponse::response('get', $query); + return $query->get(); } public static function destoryMeterial(int $id) { $query = DB::table('COM_CODE') ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); - return ApiResponse::response('get', $query); + return $query->get(); } } diff --git a/app/Services/ModelService.php b/app/Services/ModelService.php index b2ed8c0..91d9f33 100644 --- a/app/Services/ModelService.php +++ b/app/Services/ModelService.php @@ -13,34 +13,34 @@ class ModelService public static function getModels() { $query = new Product(); - return ApiResponse::response('get', $query); + return $query->get(); } public static function setModel() { $query = DB::table('COM_CODE') ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); - return ApiResponse::response('get', $query); + return $query->get(); } public static function getModel(int $id) { $query = Bom::find($id); - return ApiResponse::response('get', $query); + return $query->get(); } public static function updateModel(int $id) { $query = DB::table('COM_CODE') ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); - return ApiResponse::response('get', $query); + return $query->get(); } public static function destoryModel(int $id) { $query = DB::table('COM_CODE') ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); - return ApiResponse::response('get', $query); + return $query->get(); } } diff --git a/app/Services/ProductService.php b/app/Services/ProductService.php index a4971f6..caf471c 100644 --- a/app/Services/ProductService.php +++ b/app/Services/ProductService.php @@ -19,7 +19,7 @@ public static function getCategory($request) // 재귀적으로 트리 구성 $list = self::fetchCategoryTree($parentId, $group); - return ApiResponse::response('result', $list); + return $list; } /** @@ -44,7 +44,7 @@ protected static function fetchCategoryTree($parentId = null, $group = 'category public static function getCategoryFlat($group = 'category') { $query = CommonCode::where('code_group',$group)->whereNull('parent_id'); - return ApiResponse::response('get', $query); + return $query->get(); } diff --git a/app/Services/TenantFieldSettingService.php b/app/Services/TenantFieldSettingService.php index 1c33166..eaab1bf 100644 --- a/app/Services/TenantFieldSettingService.php +++ b/app/Services/TenantFieldSettingService.php @@ -52,7 +52,7 @@ public static function index(array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $defs = SettingFieldDef::query() @@ -79,7 +79,7 @@ public static function index(array $params = []) ($a['sort_order'] <=> $b['sort_order']) ?: strcmp($a['field_key'], $b['field_key']) ); - return ApiResponse::response('result', array_values($rows)); + return array_values($rows); } /** @@ -91,7 +91,7 @@ public static function bulkUpsert(array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $v = Validator::make($params, [ @@ -105,7 +105,7 @@ public static function bulkUpsert(array $params = []) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $payload = $v->validated(); @@ -136,12 +136,12 @@ public static function bulkUpsert(array $params = []) } }); } catch (\RuntimeException $e) { - return ApiResponse::error($e->getMessage(), 422); + return ['error' => $e->getMessage(), 'code' => 422]; } catch (\Throwable $e) { - return ApiResponse::error('저장 중 오류가 발생했습니다.', 500); + return ['error' => '저장 중 오류가 발생했습니다.', 'code' => 500]; } - return ApiResponse::response('result', ['updated' => true]); + return ['updated' => true]; } /** @@ -152,13 +152,13 @@ public static function updateOne(string $fieldKey, array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } // 전역 key 존재 확인 $def = SettingFieldDef::where('field_key', $fieldKey)->first(); if (!$def) { - return ApiResponse::error('field_key not found', 404); + return ['error' => 'field_key not found', 'code' => 404]; } $v = Validator::make($params, [ @@ -170,7 +170,7 @@ public static function updateOne(string $fieldKey, array $params = []) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $data = $v->validated(); @@ -180,7 +180,7 @@ public static function updateOne(string $fieldKey, array $params = []) ->where('id', $data['option_group_id']) ->exists(); if (!$ok) { - return ApiResponse::error('option_group_id is invalid for this tenant', 422); + return ['error' => 'option_group_id is invalid for this tenant', 'code' => 422]; } } @@ -205,9 +205,10 @@ public static function updateOne(string $fieldKey, array $params = []) $effective = self::buildEffectiveRow($def, $s); - return ApiResponse::response('result', $effective); + return $effective; + } catch (\Throwable $e) { - return ApiResponse::error('수정 중 오류가 발생했습니다.', 500); + return ['error' => '수정 중 오류가 발생했습니다.', 'code' => 500]; } } } diff --git a/app/Services/TenantOptionGroupService.php b/app/Services/TenantOptionGroupService.php index dae0f7a..a6191da 100644 --- a/app/Services/TenantOptionGroupService.php +++ b/app/Services/TenantOptionGroupService.php @@ -26,7 +26,7 @@ public static function index(array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $per = (int)($params['per_page'] ?? $params['size'] ?? 20); @@ -44,7 +44,7 @@ public static function index(array $params = []) $data = $q->paginate($per, ['*'], 'page', $page); - return ApiResponse::response('result', $data); + return $data; } /** @@ -54,7 +54,7 @@ public static function store(array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $v = Validator::make($params, [ @@ -68,7 +68,7 @@ public static function store(array $params = []) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $data = $v->validated(); @@ -76,7 +76,7 @@ public static function store(array $params = []) $item = TenantOptionGroup::create($data); - return ApiResponse::response('result', $item->toArray()); + return $item->toArray(); } /** @@ -86,18 +86,18 @@ public static function show(int $id) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } if (!$id) { - return ApiResponse::error('id가 올바르지 않습니다.', 422); + return ['error' => 'id가 올바르지 않습니다.', 'code' => 422]; } $item = TenantOptionGroup::where('tenant_id', $tenantId)->find($id); if (!$item) { - return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); + return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404]; } - return ApiResponse::response('result', $item->toArray()); + return $item->toArray(); } /** @@ -107,15 +107,15 @@ public static function update(int $id, array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } if (!$id) { - return ApiResponse::error('id가 올바르지 않습니다.', 422); + return ['error' => 'id가 올바르지 않습니다.', 'code' => 422]; } $item = TenantOptionGroup::where('tenant_id', $tenantId)->find($id); if (!$item) { - return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); + return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404]; } $v = Validator::make($params, [ @@ -130,17 +130,17 @@ public static function update(int $id, array $params = []) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $data = $v->validated(); if (empty($data)) { - return ApiResponse::error('수정할 항목이 없습니다.', 422); + return ['error' => '수정할 항목이 없습니다.', 'code' => 422]; } $item->fill($data)->save(); - return ApiResponse::response('result', $item->toArray()); + return $item->toArray(); } /** @@ -153,21 +153,21 @@ public static function destroy(int $id) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } if (!$id) { - return ApiResponse::error('id가 올바르지 않습니다.', 422); + return ['error' => 'id가 올바르지 않습니다.', 'code' => 422]; } $item = TenantOptionGroup::where('tenant_id', $tenantId)->find($id); if (!$item) { - return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); + return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404]; } // 1) 옵션 값 존재 여부 $hasValues = TenantOptionValue::where('group_id', $item->id)->exists(); if ($hasValues) { - return ApiResponse::error('해당 그룹에 옵션 값이 존재하여 삭제할 수 없습니다.', 409); + return ['error' => '해당 그룹에 옵션 값이 존재하여 삭제할 수 없습니다.', 'code' => 409]; } // 2) 필드 설정에서 참조 여부 @@ -175,11 +175,11 @@ public static function destroy(int $id) ->where('option_group_id', $item->id) ->exists(); if ($isReferenced) { - return ApiResponse::error('필드 설정에서 참조 중인 그룹은 삭제할 수 없습니다.', 409); + return ['error' => '필드 설정에서 참조 중인 그룹은 삭제할 수 없습니다.', 'code' => 409]; } $item->delete(); - return ApiResponse::response('result', ['deleted' => true]); + return ['deleted' => true]; } } diff --git a/app/Services/TenantOptionValueService.php b/app/Services/TenantOptionValueService.php index 0581318..95982ca 100644 --- a/app/Services/TenantOptionValueService.php +++ b/app/Services/TenantOptionValueService.php @@ -32,12 +32,12 @@ public static function index(int $groupId, array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $group = self::loadGroup($tenantId, $groupId); if (!$group) { - return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); + return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404]; } $q = TenantOptionValue::where('group_id', $group->id) @@ -50,7 +50,7 @@ public static function index(int $groupId, array $params = []) $list = $q->get(); - return ApiResponse::response('result', $list); + return $list; } /** @@ -60,12 +60,12 @@ public static function store(int $groupId, array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $group = self::loadGroup($tenantId, $groupId); if (!$group) { - return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); + return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404]; } $v = Validator::make($params, [ @@ -80,14 +80,14 @@ public static function store(int $groupId, array $params = []) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $data = $v->validated(); $data['group_id'] = $group->id; $item = TenantOptionValue::create($data); - return ApiResponse::response('result', $item->toArray()); + return $item->toArray(); } /** @@ -97,20 +97,20 @@ public static function show(int $groupId, int $id) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $group = self::loadGroup($tenantId, $groupId); if (!$group) { - return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); + return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404]; } $item = TenantOptionValue::where('group_id', $group->id)->find($id); if (!$item) { - return ApiResponse::error('옵션 값을 찾을 수 없습니다.', 404); + return ['error' => '옵션 값을 찾을 수 없습니다.', 'code' => 404]; } - return ApiResponse::response('result', $item->toArray()); + return $item->toArray(); } /** @@ -120,17 +120,17 @@ public static function update(int $groupId, int $id, array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $group = self::loadGroup($tenantId, $groupId); if (!$group) { - return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); + return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404]; } $item = TenantOptionValue::where('group_id', $group->id)->find($id); if (!$item) { - return ApiResponse::error('옵션 값을 찾을 수 없습니다.', 404); + return ['error' => '옵션 값을 찾을 수 없습니다.', 'code' => 404]; } $v = Validator::make($params, [ @@ -146,17 +146,17 @@ public static function update(int $groupId, int $id, array $params = []) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $data = $v->validated(); if (empty($data)) { - return ApiResponse::error('수정할 항목이 없습니다.', 422); + return ['error' => '수정할 항목이 없습니다.', 'code' => 422]; } $item->fill($data)->save(); - return ApiResponse::response('result', $item->toArray()); + return $item->toArray(); } /** @@ -167,23 +167,23 @@ public static function destroy(int $groupId, int $id) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $group = self::loadGroup($tenantId, $groupId); if (!$group) { - return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); + return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404]; } $item = TenantOptionValue::where('group_id', $group->id)->find($id); if (!$item) { - return ApiResponse::error('옵션 값을 찾을 수 없습니다.', 404); + return ['error' => '옵션 값을 찾을 수 없습니다.', 'code' => 404]; } // TODO: 참조 무결성 검사(필요 시 구현) $item->delete(); - return ApiResponse::response('result', ['deleted' => true]); + return ['deleted' => true]; } /** @@ -194,12 +194,12 @@ public static function reorder(int $groupId, array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $group = self::loadGroup($tenantId, $groupId); if (!$group) { - return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); + return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404]; } $v = Validator::make($params, [ @@ -209,7 +209,7 @@ public static function reorder(int $groupId, array $params = []) ]); if ($v->fails()) { - return ApiResponse::error($v->errors()->first(), 422); + return ['error' => $v->errors()->first(), 'code' => 422]; } $rows = $v->validated()['items']; @@ -223,9 +223,9 @@ public static function reorder(int $groupId, array $params = []) } }); } catch (\Throwable $e) { - return ApiResponse::error('정렬 순서 저장 중 오류가 발생했습니다.', 500); + return ['error' => '정렬 순서 저장 중 오류가 발생했습니다.', 'code' => 500]; } - return ApiResponse::response('result', ['reordered' => true]); + return ['reordered' => true]; } } diff --git a/app/Services/TenantService.php b/app/Services/TenantService.php index db023b0..2c0b2da 100644 --- a/app/Services/TenantService.php +++ b/app/Services/TenantService.php @@ -180,7 +180,7 @@ public static function getTenants(array $params = []) $paginator = $query->paginate($pageSize, ['*'], 'page', $pageNo); - return ApiResponse::response('result', $paginator); + return $paginator; } /** @@ -203,7 +203,7 @@ public static function getTenant(array $params = []) ->first(); if (!$userTenant) { - return ApiResponse::error('활성(기본) 테넌트를 찾을 수 없습니다.', 404); + return ['error' => '활성(기본) 테넌트를 찾을 수 없습니다.', 'code' => 404]; } $tenantId = $userTenant->tenant_id; } @@ -213,7 +213,7 @@ public static function getTenant(array $params = []) ->select('id','company_name','code','email','phone','address','business_num','corp_reg_no','ceo_name','homepage','fax','logo','admin_memo','options','created_at','updated_at') ->where('id', $tenantId); - return ApiResponse::response('first', $query); + return $query->first(); } /** @@ -241,7 +241,7 @@ public static function storeTenants(array $params = []) if ($validator->fails()) { - return ApiResponse::error($validator->errors()->first(), 400); + return ['error' => $validator->errors()->first(), 'code' => 400]; } $payload = $validator->validated(); @@ -276,7 +276,7 @@ public static function storeTenants(array $params = []) ]); // 생성된 리소스를 그대로 반환 (목록 카드용 요약 원하면 컬럼 제한) - return ApiResponse::response('result', $tenant); + return $tenant; } /** @@ -303,7 +303,7 @@ public static function updateTenant(array $params = []) ]); if ($validator->fails()) { - return ApiResponse::error($validator->errors()->first(), 400); + return ['error' => $validator->errors()->first(), 'code' => 400]; } $payload = $validator->validated(); @@ -311,17 +311,17 @@ public static function updateTenant(array $params = []) unset($payload['tenant_id']); if (empty($payload)) { - return ApiResponse::error('수정할 데이터가 없습니다.', 400); + return ['error' => '수정할 데이터가 없습니다.', 'code' => 400]; } $tenant = Tenant::find($tenantId); if (!$tenant) { - return ApiResponse::error('테넌트를 찾을 수 없습니다.', 404); + return ['error' => '테넌트를 찾을 수 없습니다.', 'code' => 404]; } $tenant->update($payload); - return ApiResponse::response('result', $tenant->fresh()); + return $tenant->fresh(); } /** @@ -333,17 +333,17 @@ public static function destroyTenant(array $params = []) { $tenantId = $params['tenant_id'] ?? app('tenant_id'); if (!$tenantId) { - return ApiResponse::error('tenant_id가 필요합니다.', 400); + return ['error' => 'tenant_id가 필요합니다.', 'code' => 400]; } $tenant = Tenant::find($tenantId); if (!$tenant) { - return ApiResponse::error('테넌트를 찾을 수 없습니다.', 404); + return ['error' => '테넌트를 찾을 수 없습니다.', 'code' => 404]; } $tenant->delete(); // SoftDeletes 트레이트가 있으면 소프트 삭제 - return ApiResponse::response('success'); + return 'success'; } /** @@ -358,19 +358,19 @@ public static function restoreTenant(array $params = []) // 소프트 삭제 포함 조회 $tenant = Tenant::withTrashed()->find($tenantId); if (!$tenant) { - return ApiResponse::error('테넌트를 찾을 수 없습니다.', 404); + return ['error' => '테넌트를 찾을 수 없습니다.', 'code' => 404]; } if (is_null($tenant->deleted_at)) { // 이미 활성 상태 - return ApiResponse::error('이미 활성화된 테넌트입니다.', 400); + return ['error' => '이미 활성화된 테넌트입니다.', 'code' => 400]; } $tenant->restore(); // 복구 결과를 data에 담고 싶으면 fresh() 후 필요한 필드만 반환 - // return ApiResponse::response('result', $tenant->fresh()); + // return $tenant->fresh(); - return ApiResponse::response('success'); + return 'success'; } } diff --git a/app/Services/TenantUserProfileService.php b/app/Services/TenantUserProfileService.php index 1f010e1..7252af2 100644 --- a/app/Services/TenantUserProfileService.php +++ b/app/Services/TenantUserProfileService.php @@ -42,7 +42,7 @@ public static function index(array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $per = (int)($params['per_page'] ?? $params['size'] ?? 20); @@ -60,7 +60,7 @@ public static function index(array $params = []) $page = isset($params['page']) ? (int)$params['page'] : null; $data = $q->orderByDesc('id')->paginate($per, ['*'], 'page', $page); - return ApiResponse::response('result', $data); + return $data; } /** @@ -70,10 +70,10 @@ public static function show(int $userId) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } if (!$userId) { - return ApiResponse::error('userId가 올바르지 않습니다.', 422); + return ['error' => 'userId가 올바르지 않습니다.', 'code' => 422]; } $item = TenantUserProfile::where('tenant_id', $tenantId) @@ -82,10 +82,10 @@ public static function show(int $userId) ->first(); if (!$item) { - return ApiResponse::error('프로필을 찾을 수 없습니다.', 404); + return ['error' => '프로필을 찾을 수 없습니다.', 'code' => 404]; } - return ApiResponse::response('result', $item->toArray()); + return $item->toArray(); } /** @@ -96,15 +96,15 @@ public static function update(int $userId, array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } if (!$userId) { - return ApiResponse::error('userId가 올바르지 않습니다.', 422); + return ['error' => 'userId가 올바르지 않습니다.', 'code' => 422]; } // (선택) 간단 유효성: 최소 1개 키 존재 if (empty($params) || !is_array($params)) { - return ApiResponse::error('수정할 항목이 없습니다.', 422); + return ['error' => '수정할 항목이 없습니다.', 'code' => 422]; } $fields = self::effectiveFieldMap($tenantId); @@ -141,7 +141,7 @@ public static function update(int $userId, array $params = []) $profile->save(); }); } catch (\Throwable $e) { - return ApiResponse::error('프로필 저장 중 오류가 발생했습니다.', 500); + return ['error' => '프로필 저장 중 오류가 발생했습니다.', 'code' => 500]; } $fresh = TenantUserProfile::where('tenant_id', $tenantId) @@ -149,7 +149,7 @@ public static function update(int $userId, array $params = []) ->with(['user:id,name,email']) ->first(); - return ApiResponse::response('result', $fresh ? $fresh->toArray() : null); + return $fresh ? $fresh->toArray() : null; } /** @@ -159,11 +159,11 @@ public static function me(array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $userId = auth()->id(); if (!$userId) { - return ApiResponse::error('인증 정보가 없습니다.', 401); + return ['error' => '인증 정보가 없습니다.', 'code' => 401]; } $item = TenantUserProfile::where('tenant_id', $tenantId) @@ -172,7 +172,7 @@ public static function me(array $params = []) ->first(); // 없으면 null 반환(스펙에 따라 404로 바꾸려면 위와 동일 처리) - return ApiResponse::response('result', $item ? $item->toArray() : null); + return $item ? $item->toArray() : null; } /** @@ -183,11 +183,11 @@ public static function updateMe(array $params = []) { $tenantId = self::tenantId(); if (!$tenantId) { - return ApiResponse::error('활성 테넌트가 없습니다.', 400); + return ['error' => '활성 테넌트가 없습니다.', 'code' => 400]; } $userId = auth()->id(); if (!$userId) { - return ApiResponse::error('인증 정보가 없습니다.', 401); + return ['error' => '인증 정보가 없습니다.', 'code' => 401]; } return self::update($userId, $params); }