fix : 결과 전달시 두번 래핑되는 부분 수정

- 컨트롤러와 서비스에서 각각 래핑 후 결과 전달됨으로 이중 래핑되고 있음
  -> 서비스에서 래핑하는 부분을 컨트롤러로 옮겨서 컨트롤러에서만 한번 래핑하는 걸로 수정
This commit is contained in:
2025-08-19 12:41:17 +09:00
parent aa190bf48d
commit 43e4c507a7
18 changed files with 299 additions and 277 deletions

View File

@@ -117,19 +117,49 @@ public static function response($type = '', $query = '', $key = ''): array
public static function handle( public static function handle(
callable $callback, callable $callback,
string $responseTitle = '요청' string $responseTitle = '요청'
): JsonResponse { ): JsonResponse
{
try { try {
$result = $callback(); $result = $callback();
// 이미 JsonResponse면 그대로 반환
if ($result instanceof JsonResponse) { if ($result instanceof JsonResponse) {
return $result; 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) { } catch (\Throwable $e) {
return self::error($responseTitle." 실패", 500, [ return self::error($responseTitle.' 실패', 500, [
'details' => $e->getMessage(), 'details' => $e->getMessage(),
]); ]);
} }

View File

@@ -4,14 +4,12 @@
use App\Helpers\ApiResponse; use App\Helpers\ApiResponse;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
use App\Models\Members\User; use App\Models\Members\User;
use App\Models\Members\UserTenant; use App\Models\Members\UserTenant;
use Spatie\Permission\Models\Role;
class AdminService class AdminService
@@ -25,7 +23,7 @@ public static function getTenants(array $params = [])
{ {
$tenantId = app('tenant_id'); $tenantId = app('tenant_id');
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('성 테넌트가 없습니다.', 400); return ['error' => '성 테넌트가 없습니다.', 'code' => 400];
} }
$page = isset($params['page']) ? (int)$params['page'] : 1; $page = isset($params['page']) ? (int)$params['page'] : 1;
@@ -69,9 +67,7 @@ public static function getTenants(array $params = [])
$q->orderBy($sortBy, $sortDir); $q->orderBy($sortBy, $sortDir);
$data = $q->paginate($size, ['*'], 'page', $page); return $data = $q->paginate($size, ['*'], 'page', $page);
return ApiResponse::response('result', $data);
} }
/** /**
@@ -83,7 +79,7 @@ public static function store(array $params = [])
{ {
$tenantId = app('tenant_id'); $tenantId = app('tenant_id');
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
// 신규 회원 생성 + 역할 부여 지원 // 신규 회원 생성 + 역할 부여 지원
@@ -98,7 +94,7 @@ public static function store(array $params = [])
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$payload = $v->validated(); $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']), 'user' => $user->only(['id','user_id','name','email','phone']),
]); ];
}); });
} }
@@ -150,20 +146,20 @@ public static function show(int $userNo)
{ {
$tenantId = app('tenant_id'); $tenantId = app('tenant_id');
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
if (!$userNo) { if (!$userNo) {
return ApiResponse::error('회원 정보가 없습니다.', 422); return ['error' => '회원 정보가 없습니다.', 'code' => 422];
} }
$user = User::whereHas('userTenants')->find($userNo); $user = User::whereHas('userTenants')->find($userNo);
if (!$user) { 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'); $tenantId = app('tenant_id');
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
if (!$userNo) { if (!$userNo) {
return ApiResponse::error('회원 정보가 없습니다.', 422); return ['error' => '회원 정보가 없습니다.', 'code' => 422];
} }
// 1) 유저 존재/테넌트 소속 확인 // 1) 유저 존재/테넌트 소속 확인
$user = User::find($userNo); $user = User::find($userNo);
if (!$user) { if (!$user) {
return ApiResponse::error('해당 회원을 찾을 수 없습니다.', 404); return ['error' => '해당 회원을 찾을 수 없습니다.', 'code' => 404];
} }
$linked = UserTenant::where('tenant_id', $tenantId) $linked = UserTenant::where('tenant_id', $tenantId)
->where('user_id', $userNo) ->where('user_id', $userNo)
->exists(); ->exists();
if (!$linked) { if (!$linked) {
return ApiResponse::error('이 테넌트에 소속된 회원이 아닙니다.', 403); return ['error' => '이 테넌트에 소속된 회원이 아닙니다.', 'code' => 403];
} }
// 2) 프로필 + roles만 수정 // 2) 프로필 + roles만 수정
@@ -205,7 +201,7 @@ public static function update(array $params = [], int $userNo)
'roles.*' => 'string|max:100', 'roles.*' => 'string|max:100',
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$payload = $v->validated(); $payload = $v->validated();
@@ -214,7 +210,7 @@ public static function update(array $params = [], int $userNo)
$hasProfileInput = (bool) array_intersect(array_keys($payload), $updatableKeys); $hasProfileInput = (bool) array_intersect(array_keys($payload), $updatableKeys);
$hasRolesInput = array_key_exists('roles', $payload); $hasRolesInput = array_key_exists('roles', $payload);
if (!$hasProfileInput && !$hasRolesInput) { if (!$hasProfileInput && !$hasRolesInput) {
return ApiResponse::error('수정할 항목이 없습니다.', 422); return ['error' => '수정할 항목이 없습니다.', 'code' => 422];
} }
return DB::transaction(function () use ($user, $payload, $tenantId, $updatableKeys) { 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']), 'user' => $user->only(['id','user_id','name','email','phone']),
'roles' => method_exists($user, 'getRoleNames') ? $user->getRoleNames() : [], 'roles' => method_exists($user, 'getRoleNames') ? $user->getRoleNames() : [],
]); ];
}); });
} }
@@ -267,10 +263,10 @@ public static function destroy(int $userNo)
{ {
$tenantId = app('tenant_id'); $tenantId = app('tenant_id');
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
if (!$userNo) { if (!$userNo) {
return ApiResponse::error('회원 정보가 없습니다.', 422); return ['error' => '회원 정보가 없습니다.', 'code' => 422];
} }
$ut = UserTenant::where('user_id',$userNo) $ut = UserTenant::where('user_id',$userNo)
@@ -278,14 +274,14 @@ public static function destroy(int $userNo)
->first(); ->first();
if (!$ut) { if (!$ut) {
return ApiResponse::error('해당 사용자를 찾을 수 없습니다.', 404); return ['error' => '해당 사용자를 찾을 수 없습니다.', 'code' => 404];
} }
$ut->left_at = now(); $ut->left_at = now();
$ut->save(); $ut->save();
$ut->delete(); // SoftDeletes 가정 $ut->delete(); // SoftDeletes 가정
return ApiResponse::response('success'); return 'success';
} }
/** /**
@@ -295,10 +291,10 @@ public static function restore(int $userNo)
{ {
$tenantId = app('tenant_id'); $tenantId = app('tenant_id');
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
if (!$userNo) { if (!$userNo) {
return ApiResponse::error('회원 정보가 없습니다.', 422); return ['error' => '회원 정보가 없습니다.', 'code' => 422];
} }
$ut = UserTenant::withTrashed() $ut = UserTenant::withTrashed()
@@ -307,7 +303,7 @@ public static function restore(int $userNo)
->first(); ->first();
if (!$ut) { if (!$ut) {
return ApiResponse::error('해당 사용자를 찾을 수 없습니다.', 404); return ['error' => '해당 사용자를 찾을 수 없습니다.', 'code' => 404];
} }
if ($ut->trashed()) { if ($ut->trashed()) {
@@ -316,7 +312,7 @@ public static function restore(int $userNo)
$ut->save(); $ut->save();
} }
return ApiResponse::response('success'); return 'success';
} }
/** /**
@@ -326,10 +322,10 @@ public static function toggle(int $userNo)
{ {
$tenantId = app('tenant_id'); $tenantId = app('tenant_id');
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
if (!$userNo) { if (!$userNo) {
return ApiResponse::error('회원 정보가 없습니다.', 422); return ['error' => '회원 정보가 없습니다.', 'code' => 422];
} }
$ut = UserTenant::where('tenant_id', $tenantId) $ut = UserTenant::where('tenant_id', $tenantId)
@@ -337,13 +333,13 @@ public static function toggle(int $userNo)
->first(); ->first();
if (!$ut) { if (!$ut) {
return ApiResponse::error('해당 사용자를 찾을 수 없습니다.', 404); return ['error' => '해당 사용자를 찾을 수 없습니다.', 'code' => 404];
} }
$ut->is_active = $ut->is_active ? 0 : 1; $ut->is_active = $ut->is_active ? 0 : 1;
$ut->save(); $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'); $tenantId = app('tenant_id');
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -362,13 +358,13 @@ public static function attach(array $params = [])
'role_name' => 'required|string|max:100', 'role_name' => 'required|string|max:100',
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$user = User::find($params['user_id']); $user = User::find($params['user_id']);
if (!method_exists($user, 'assignRole')) { if (!method_exists($user, 'assignRole')) {
// Spatie 미사용 환경 방어 // Spatie 미사용 환경 방어
return ApiResponse::error('역할 시스템이 활성화되어 있지 않습니다.', 501); return ['error' => '역할 시스템이 활성화되어 있지 않습니다.', 'code' => 501];
} }
// teams(tenant) 스코프 // teams(tenant) 스코프
@@ -382,7 +378,7 @@ public static function attach(array $params = [])
app()->instance('permission.team_id', $previousTeam); 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'); $tenantId = app('tenant_id');
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -401,12 +397,12 @@ public static function detach(array $params = [])
'role_name' => 'required|string|max:100', 'role_name' => 'required|string|max:100',
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$user = User::find($params['user_id']); $user = User::find($params['user_id']);
if (!method_exists($user, 'removeRole')) { if (!method_exists($user, 'removeRole')) {
return ApiResponse::error('역할 시스템이 활성화되어 있지 않습니다.', 501); return ['error' => '역할 시스템이 활성화되어 있지 않습니다.', 'code' => 501];
} }
$previousTeam = app()->has('permission.team_id') ? app('permission.team_id') : null; $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); 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'); $tenantId = app('tenant_id');
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
if (!$userNo) { if (!$userNo) {
return ApiResponse::error('회원 정보가 없습니다.', 422); return ['error' => '회원 정보가 없습니다.', 'code' => 422];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -442,13 +438,13 @@ public static function reset(array $params = [],int $userNo)
'return_password' => 'nullable|in:0,1', // 1이면 응답에 임시 비번 포함(개발용) 'return_password' => 'nullable|in:0,1', // 1이면 응답에 임시 비번 포함(개발용)
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$payload = $v->validated(); $payload = $v->validated();
$user = User::find($userNo); $user = User::find($userNo);
if (!$user) { if (!$user) {
return ApiResponse::error('유저를 찾을 수 없습니다.', 404); return ['error' => '유저를 찾을 수 없습니다.', 'code' => 404];
} }
$new = $payload['new_password'] ?? Str::random(12); $new = $payload['new_password'] ?? Str::random(12);
@@ -464,6 +460,6 @@ public static function reset(array $params = [],int $userNo)
$resp['temp_password'] = $new; $resp['temp_password'] = $new;
} }
return ApiResponse::response('result', $resp); return $resp;
} }
} }

View File

@@ -82,7 +82,7 @@ public static function list(int $roleId)
$role = self::loadRoleOrError($roleId, $tenantId); $role = self::loadRoleOrError($roleId, $tenantId);
if (!$role) { if (!$role) {
return ApiResponse::error('역할을 찾을 수 없습니다.', 404); return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404];
} }
self::setTeam($tenantId); self::setTeam($tenantId);
@@ -93,7 +93,7 @@ public static function list(int $roleId)
->orderBy('name') ->orderBy('name')
->get(['id','tenant_id','name','guard_name','created_at','updated_at']); ->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); $role = self::loadRoleOrError($roleId, $tenantId);
if (!$role) { 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()) { 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']))) { 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); self::setTeam($tenantId);
$names = self::resolvePermissionNames($tenantId, $params); $names = self::resolvePermissionNames($tenantId, $params);
if (empty($names)) { if (empty($names)) {
return ApiResponse::error('유효한 퍼미션이 없습니다.', 422); return ['error' => '유효한 퍼미션이 없습니다.', 'code' => 422];
} }
// Spatie: 이름 배열 부여 OK (teams 컨텍스트 적용됨) // Spatie: 이름 배열 부여 OK (teams 컨텍스트 적용됨)
$role->givePermissionTo($names); $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); $role = self::loadRoleOrError($roleId, $tenantId);
if (!$role) { if (!$role) {
return ApiResponse::error('역할을 찾을 수 없습니다.', 404); return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -158,22 +158,22 @@ public static function revoke(int $roleId, array $params = [])
], ],
]); ]);
if ($v->fails()) { 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']))) { 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); self::setTeam($tenantId);
$names = self::resolvePermissionNames($tenantId, $params); $names = self::resolvePermissionNames($tenantId, $params);
if (empty($names)) { if (empty($names)) {
return ApiResponse::error('유효한 퍼미션이 없습니다.', 422); return ['error' => '유효한 퍼미션이 없습니다.', 'code' => 422];
} }
$role->revokePermissionTo($names); $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); $role = self::loadRoleOrError($roleId, $tenantId);
if (!$role) { if (!$role) {
return ApiResponse::error('역할을 찾을 수 없습니다.', 404); return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -197,10 +197,10 @@ public static function sync(int $roleId, array $params = [])
], ],
]); ]);
if ($v->fails()) { 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']))) { 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); self::setTeam($tenantId);
@@ -209,6 +209,6 @@ public static function sync(int $roleId, array $params = [])
// 동기화 // 동기화
$role->syncPermissions($names); $role->syncPermissions($names);
return ApiResponse::response('success'); return 'success';
} }
} }

View File

@@ -35,7 +35,7 @@ public static function index(array $params = [])
$list = $query->orderByDesc('id') $list = $query->orderByDesc('id')
->paginate($size, ['*'], 'page', $page); ->paginate($size, ['*'], 'page', $page);
return ApiResponse::response('result', $list); return $list;
} }
/** 생성 */ /** 생성 */
@@ -54,7 +54,7 @@ public static function store(array $params = [])
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
// Spatie 팀(테넌트) 컨텍스트 // Spatie 팀(테넌트) 컨텍스트
@@ -67,7 +67,7 @@ public static function store(array $params = [])
'description' => $params['description'] ?? null, 'description' => $params['description'] ?? null,
]); ]);
return ApiResponse::response('result', $role); return $role;
} }
/** 단건 */ /** 단건 */
@@ -80,10 +80,10 @@ public static function show(int $id)
->find($id); ->find($id);
if (!$role) { 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); ->find($id);
if (!$role) { if (!$role) {
return ApiResponse::error('역할을 찾을 수 없습니다.', 404); return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -110,12 +110,12 @@ public static function update(int $id, array $params = [])
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$role->fill($v->validated())->save(); $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); ->find($id);
if (!$role) { if (!$role) {
return ApiResponse::error('역할을 찾을 수 없습니다.', 404); return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404];
} }
DB::transaction(function () use ($role) { DB::transaction(function () use ($role) {
$role->delete(); // Spatie Role 기본: soft delete 없음 $role->delete(); // Spatie Role 기본: soft delete 없음
}); });
return ApiResponse::response('success'); return 'success';
} }
} }

View File

@@ -74,7 +74,7 @@ public static function list(int $userId)
$user = self::loadUserOrError($userId); $user = self::loadUserOrError($userId);
if (!$user) { if (!$user) {
return ApiResponse::error('사용자를 찾을 수 없습니다.', 404); return ['error' => '사용자를 찾을 수 없습니다.', 'code' => 404];
} }
self::setTeam($tenantId); 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']) ->select(['roles.id','roles.tenant_id','roles.name','roles.description','roles.guard_name','roles.created_at','roles.updated_at'])
->orderBy('roles.id', 'desc'); ->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); $user = self::loadUserOrError($userId);
if (!$user) { if (!$user) {
return ApiResponse::error('사용자를 찾을 수 없습니다.', 404); return ['error' => '사용자를 찾을 수 없습니다.', 'code' => 404];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -106,21 +106,21 @@ public static function grant(int $userId, array $params = [])
'role_ids.*' => 'integer|min:1', 'role_ids.*' => 'integer|min:1',
]); ]);
if ($v->fails()) { 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'])) { 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); self::setTeam($tenantId);
$names = self::resolveRoleNames($tenantId, $params); $names = self::resolveRoleNames($tenantId, $params);
if (empty($names)) { if (empty($names)) {
return ApiResponse::error('유효한 역할이 없습니다.', 422); return ['error' => '유효한 역할이 없습니다.', 'code' => 422];
} }
$user->assignRole($names); // teams 컨텍스트 적용됨 $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); $user = self::loadUserOrError($userId);
if (!$user) { if (!$user) {
return ApiResponse::error('사용자를 찾을 수 없습니다.', 404); return ['error' => '사용자를 찾을 수 없습니다.', 'code' => 404];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -140,21 +140,21 @@ public static function revoke(int $userId, array $params = [])
'role_ids.*' => 'integer|min:1', 'role_ids.*' => 'integer|min:1',
]); ]);
if ($v->fails()) { 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'])) { 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); self::setTeam($tenantId);
$names = self::resolveRoleNames($tenantId, $params); $names = self::resolveRoleNames($tenantId, $params);
if (empty($names)) { if (empty($names)) {
return ApiResponse::error('유효한 역할이 없습니다.', 422); return ['error' => '유효한 역할이 없습니다.', 'code' => 422];
} }
$user->removeRole($names); // 배열 허용 $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); $user = self::loadUserOrError($userId);
if (!$user) { if (!$user) {
return ApiResponse::error('사용자를 찾을 수 없습니다.', 404); return ['error' => '사용자를 찾을 수 없습니다.', 'code' => 404];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -174,10 +174,10 @@ public static function sync(int $userId, array $params = [])
'role_ids.*' => 'integer|min:1', 'role_ids.*' => 'integer|min:1',
]); ]);
if ($v->fails()) { 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'])) { 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); self::setTeam($tenantId);
@@ -185,10 +185,10 @@ public static function sync(int $userId, array $params = [])
$names = self::resolveRoleNames($tenantId, $params); $names = self::resolveRoleNames($tenantId, $params);
if (empty($names)) { if (empty($names)) {
// 정책상 빈 목록 sync 허용 시: $user->syncRoles([]) 로 전부 제거 가능 // 정책상 빈 목록 sync 허용 시: $user->syncRoles([]) 로 전부 제거 가능
return ApiResponse::error('유효한 역할이 없습니다.', 422); return ['error' => '유효한 역할이 없습니다.', 'code' => 422];
} }
$user->syncRoles($names); $user->syncRoles($names);
return ApiResponse::response('success'); return 'success';
} }
} }

View File

@@ -12,34 +12,34 @@ class BomService
public static function getBoms() public static function getBoms()
{ {
$query = new Bom(); $query = new Bom();
return ApiResponse::response('get', $query); return $query->get();
} }
public static function setBom() public static function setBom()
{ {
$query = DB::table('COM_CODE') $query = DB::table('COM_CODE')
->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); ->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) public static function getBom(int $id)
{ {
$query = Bom::find($id); $query = Bom::find($id);
return ApiResponse::response('get', $query); return $query->get();
} }
public static function updateBom(int $id) public static function updateBom(int $id)
{ {
$query = DB::table('COM_CODE') $query = DB::table('COM_CODE')
->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); ->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) public static function destoryBom(int $id)
{ {
$query = DB::table('COM_CODE') $query = DB::table('COM_CODE')
->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']);
return ApiResponse::response('get', $query); return $query->get();
} }
} }

View File

@@ -20,7 +20,7 @@ private static function v(array $params, array $rules)
{ {
$v = Validator::make($params, $rules); $v = Validator::make($params, $rules);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
return $v->validated(); return $v->validated();
} }
@@ -54,7 +54,7 @@ public static function index(array $params)
$page = $p['page'] ?? null; $page = $p['page'] ?? null;
// 페이징 객체는 'result'로 반환 // 페이징 객체는 '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'])) { if (!empty($p['code'])) {
$exists = Department::query()->where('code', $p['code'])->exists(); $exists = Department::query()->where('code', $p['code'])->exists();
if ($exists) return ApiResponse::error('이미 존재하는 부서 코드입니다.', 409); if ($exists) return ['error' => '이미 존재하는 부서 코드입니다.', 'code' => 409];
} }
$dept = Department::create([ $dept = Department::create([
@@ -85,19 +85,17 @@ public static function store(array $params)
'updated_by' => $p['created_by'] ?? null, 'updated_by' => $p['created_by'] ?? null,
]); ]);
return ApiResponse::response('result', $dept->fresh()); return $dept->fresh();
} }
/** 단건 */ /** 단건 */
public static function show(int $id, array $params) public static function show(int $id, array $params)
{ {
if (!$id) return ApiResponse::error('id가 필요합니다.', 400); if (!$id) return ['error' => 'id가 필요합니다.', 'code' => 400];
$q = Department::query()->where('id', $id);
$res = ApiResponse::response('first', $q);
$res = Department::query()->where('id', $id)->first();
if (empty($res['data'])) { if (empty($res['data'])) {
return ApiResponse::error('부서를 찾을 수 없습니다.', 404); return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404];
} }
return $res; return $res;
} }
@@ -105,7 +103,7 @@ public static function show(int $id, array $params)
/** 수정 */ /** 수정 */
public static function update(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, [ $p = self::v($params, [
'code' => 'nullable|string|max:50', 'code' => 'nullable|string|max:50',
@@ -118,14 +116,14 @@ public static function update(int $id, array $params)
if ($p instanceof JsonResponse) return $p; if ($p instanceof JsonResponse) return $p;
$dept = Department::query()->find($id); $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'])) { if (array_key_exists('code', $p) && !is_null($p['code'])) {
$exists = Department::query() $exists = Department::query()
->where('code', $p['code']) ->where('code', $p['code'])
->where('id', '!=', $id) ->where('id', '!=', $id)
->exists(); ->exists();
if ($exists) return ApiResponse::error('이미 존재하는 부서 코드입니다.', 409); if ($exists) return ['error' => '이미 존재하는 부서 코드입니다.', 'code' => 409];
} }
$dept->fill([ $dept->fill([
@@ -137,13 +135,13 @@ public static function update(int $id, array $params)
'updated_by' => $p['updated_by'] ?? $dept->updated_by, 'updated_by' => $p['updated_by'] ?? $dept->updated_by,
])->save(); ])->save();
return ApiResponse::response('result', $dept->fresh()); return $dept->fresh();
} }
/** 삭제(soft) */ /** 삭제(soft) */
public static function destroy(int $id, array $params) 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, [ $p = self::v($params, [
'deleted_by' => 'nullable|integer|min:1', 'deleted_by' => 'nullable|integer|min:1',
@@ -151,7 +149,7 @@ public static function destroy(int $id, array $params)
if ($p instanceof JsonResponse) return $p; if ($p instanceof JsonResponse) return $p;
$dept = Department::query()->find($id); $dept = Department::query()->find($id);
if (!$dept) return ApiResponse::error('부서를 찾을 수 없습니다.', 404); if (!$dept) return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404];
if (!empty($p['deleted_by'])) { if (!empty($p['deleted_by'])) {
$dept->deleted_by = $p['deleted_by']; $dept->deleted_by = $p['deleted_by'];
@@ -159,7 +157,7 @@ public static function destroy(int $id, array $params)
} }
$dept->delete(); $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; if ($p instanceof JsonResponse) return $p;
$dept = Department::query()->find($deptId); $dept = Department::query()->find($deptId);
if (!$dept) return ApiResponse::error('부서를 찾을 수 없습니다.', 404); if (!$dept) return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404];
$builder = $dept->departmentUsers()->with('user') $builder = $dept->departmentUsers()->with('user')
->orderByDesc('is_primary')->orderBy('id'); ->orderByDesc('is_primary')->orderBy('id');
@@ -180,7 +178,7 @@ public static function listUsers(int $deptId, array $params)
$perPage = $p['per_page'] ?? 20; $perPage = $p['per_page'] ?? 20;
$page = $p['page'] ?? null; $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; if ($p instanceof JsonResponse) return $p;
$dept = Department::query()->find($deptId); $dept = Department::query()->find($deptId);
if (!$dept) return ApiResponse::error('부서를 찾을 수 없습니다.', 404); if (!$dept) return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404];
$result = DB::transaction(function () use ($dept, $p) { $result = DB::transaction(function () use ($dept, $p) {
$du = DepartmentUser::withTrashed() $du = DepartmentUser::withTrashed()
@@ -203,7 +201,7 @@ public static function attachUser(int $deptId, array $params)
->first(); ->first();
if ($du && is_null($du->deleted_at)) { 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) { 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; if ($result instanceof JsonResponse) return $result;
return ApiResponse::response('result', $result); return $result;
} }
/** 사용자 제거(soft) */ /** 사용자 제거(soft) */
@@ -244,14 +242,14 @@ public static function detachUser(int $deptId, int $userId, array $params)
->where('user_id', $userId) ->where('user_id', $userId)
->first(); ->first();
if (!$du) return ApiResponse::error('배정된 사용자를 찾을 수 없습니다.', 404); if (!$du) return ['error' => '배정된 사용자를 찾을 수 없습니다.', 'code' => 404];
$du->delete(); $du->delete();
return ApiResponse::response('result', [ return [
'user_id' => $userId, 'user_id' => $userId,
'deleted_at' => now()->toDateTimeString(), 'deleted_at' => now()->toDateTimeString(),
]); ];
} }
/** 주부서 설정/해제 */ /** 주부서 설정/해제 */
@@ -269,7 +267,7 @@ public static function setPrimary(int $deptId, int $userId, array $params)
->first(); ->first();
if (!$du) { if (!$du) {
return ApiResponse::error('배정된 사용자를 찾을 수 없습니다.', 404); return ['error' => '배정된 사용자를 찾을 수 없습니다.', 'code' => 404];
} }
if ((int)$p['is_primary'] === 1) { 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; 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; if ($p instanceof JsonResponse) return $p;
$dept = Department::query()->find($deptId); $dept = Department::query()->find($deptId);
if (!$dept) return ApiResponse::error('부서를 찾을 수 없습니다.', 404); if (!$dept) return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404];
$q = DepartmentPermission::query() $q = DepartmentPermission::query()
->whereNull('deleted_at') ->whereNull('deleted_at')
@@ -315,7 +313,7 @@ public static function listPermissions(int $deptId, array $params)
$perPage = $p['per_page'] ?? 20; $perPage = $p['per_page'] ?? 20;
$page = $p['page'] ?? null; $page = $p['page'] ?? null;
return ApiResponse::response('result', $q->paginate($perPage, ['*'], 'page', $page)); return $q->paginate($perPage, ['*'], 'page', $page);
} }
/** 권한 부여/차단 upsert */ /** 권한 부여/차단 upsert */
@@ -329,7 +327,7 @@ public static function upsertPermission(int $deptId, array $params)
if ($p instanceof JsonResponse) return $p; if ($p instanceof JsonResponse) return $p;
$dept = Department::query()->find($deptId); $dept = Department::query()->find($deptId);
if (!$dept) return ApiResponse::error('부서를 찾을 수 없습니다.', 404); if (!$dept) return ['error' => '부서를 찾을 수 없습니다.', 'code' => 404];
$payload = [ $payload = [
'department_id' => $deptId, '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']); if (isset($p['menu_id'])) $q->where('menu_id', $p['menu_id']);
$rows = $q->get(); $rows = $q->get();
if ($rows->isEmpty()) return ApiResponse::error('대상 권한을 찾을 수 없습니다.', 404); if ($rows->isEmpty()) return ['error' => '대상 권한을 찾을 수 없습니다.', 'code' => 404];
foreach ($rows as $row) $row->delete(); foreach ($rows as $row) $row->delete();
return ApiResponse::response('result', [ return [
'permission_id' => $permissionId, 'permission_id' => $permissionId,
'menu_id' => $p['menu_id'] ?? null, 'menu_id' => $p['menu_id'] ?? null,
'deleted_count' => $rows->count(), 'deleted_count' => $rows->count(),
]); ];
} }
} }

View File

@@ -40,7 +40,7 @@ public static function saveFiles($files, string $table, string $t_id, string $t_
'REG_USER_NO' => session('Adm.idx') ?? 1, 'REG_USER_NO' => session('Adm.idx') ?? 1,
]); ]);
} catch (\Exception $e) { } 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, 'REG_USER_NO' => session('Adm.idx') ?? 1,
]); ]);
} catch (\Exception $e) { } 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); $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 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")); ->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); 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;
} }
} }

View File

@@ -27,7 +27,7 @@ public static function getMembers($request)
})->debug(); })->debug();
$query = $query->paginate($pageSize, ['*'], 'page', $pageNo); $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) { $query = User::whereHas('userTenants', function($q) {
$q->active(); $q->active();
})->where('id', $userNo); })->where('id', $userNo);
return ApiResponse::response('first', $query); return $query->first();
} }
@@ -59,7 +59,7 @@ public static function getMyInfo()
$data['tenant'] = $tenant; $data['tenant'] = $tenant;
} }
return ApiResponse::response('result', $data); return $data;
} }
/** /**
@@ -83,14 +83,14 @@ public static function getMyUpdate($request)
$user = User::find($apiUser); $user = User::find($apiUser);
if (!$user) { if (!$user) {
return ApiResponse::error('User not found.', 404); return ['error' => 'User not found.', 'code' => 404];
} }
// 사용자 정보 업데이트 // 사용자 정보 업데이트
$user->update($validatedData); $user->update($validatedData);
// 수정 성공 시 success 반환 // 수정 성공 시 success 반환
return ApiResponse::response('success'); return 'success';
} }
/** /**
@@ -109,23 +109,23 @@ public static function setMyPassword($request)
// 선택적으로 확인 비밀번호가 온 경우 체크 // 선택적으로 확인 비밀번호가 온 경우 체크
if ($request->filled('new_password_confirmation') && if ($request->filled('new_password_confirmation') &&
$request->input('new_password_confirmation') !== $validated['new_password']) { $request->input('new_password_confirmation') !== $validated['new_password']) {
return ApiResponse::error('비밀번호 확인이 일치하지 않습니다.', 400); return ['error' => '비밀번호 확인이 일치하지 않습니다.', 'code' => 400];
} }
// 유저 조회 // 유저 조회
$user = User::find($apiUserId); $user = User::find($apiUserId);
if (!$user) { if (!$user) {
return ApiResponse::error('유저를 찾을 수 없음', 404); return ['error' => '유저를 찾을 수 없음', 'code' => 404];
} }
// 현재 비밀번호 확인 // 현재 비밀번호 확인
if (!Hash::check($validated['current_password'], $user->password)) { if (!Hash::check($validated['current_password'], $user->password)) {
return ApiResponse::error('현재 비밀번호가 일치하지 않습니다.', 400); return ['error' => '현재 비밀번호가 일치하지 않습니다.', 'code' => 400];
} }
// 기존 비밀번호와 동일한지 방지 // 기존 비밀번호와 동일한지 방지
if (Hash::check($validated['new_password'], $user->password)) { if (Hash::check($validated['new_password'], $user->password)) {
return ApiResponse::error('새 비밀번호가 기존 비밀번호와 동일합니다.', 400); return ['error' => '새 비밀번호가 기존 비밀번호와 동일합니다.', 'code' => 400];
} }
// 비밀번호 변경 (guarded 우회: 직접 대입 + save) // 비밀번호 변경 (guarded 우회: 직접 대입 + save)
@@ -135,7 +135,7 @@ public static function setMyPassword($request)
// (선택) 모든 기존 토큰 무효화하려면 아래 주석 해제 // (선택) 모든 기존 토큰 무효화하려면 아래 주석 해제
// $user->tokens()->delete(); // $user->tokens()->delete();
return ApiResponse::response('success'); return 'success';
} }
/** /**
@@ -154,7 +154,7 @@ public static function getMyTenants()
'user_tenants.is_default' '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]); ->update(['is_default' => 1]);
if (!$updated) { if (!$updated) {
return ApiResponse::error('해당 테넌트를 찾을 수 없습니다.', 404); return ['error' => '해당 테넌트를 찾을 수 없습니다.', 'code' => 404];
} }
return ApiResponse::response('success'); return 'success';
} }
} }

View File

@@ -37,7 +37,7 @@ public static function index(array $params)
$q->orderBy('parent_id')->orderBy('sort_order'); $q->orderBy('parent_id')->orderBy('sort_order');
// Builder 그대로 전달해야 쿼리로그/표준응답 형식 유지 // Builder 그대로 전달해야 쿼리로그/표준응답 형식 유지
return ApiResponse::response('get', $q); return $q->get();
} }
/** /**
@@ -49,15 +49,12 @@ public static function show(array $params)
$tenantId = self::tenantId(); $tenantId = self::tenantId();
if (!$id) { if (!$id) {
return ApiResponse::error('id가 필요합니다.', 400); return ['error' => 'id가 필요합니다.', 'code' => 400];
} }
$q = Menu::withShared($tenantId)->where('id', $id); $res = Menu::withShared($tenantId)->find($id);
// first 쿼리를 ApiResponse에 위임 (존재X면 null 반환)
$res = ApiResponse::response('first', $q);
if (empty($res['data'])) { if (empty($res['data'])) {
return ApiResponse::error('Menu not found', 404); return ['error' => 'Menu not found', 'code' => 404];
} }
return $res; return $res;
} }
@@ -83,7 +80,7 @@ public static function store(array $params)
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$data = $v->validated(); $data = $v->validated();
@@ -103,7 +100,7 @@ public static function store(array $params)
$menu->save(); $menu->save();
// 생성 결과를 그대로 전달 // 생성 결과를 그대로 전달
return ApiResponse::response('result', $menu->fresh()); return $menu->fresh();
} }
/** /**
@@ -116,7 +113,7 @@ public static function update(array $params)
$userId = self::actorId(); $userId = self::actorId();
if (!$id) { if (!$id) {
return ApiResponse::error('id가 필요합니다.', 400); return ['error' => 'id가 필요합니다.', 'code' => 400];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -132,13 +129,13 @@ public static function update(array $params)
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$data = $v->validated(); $data = $v->validated();
$menu = Menu::withShared($tenantId)->where('id', $id)->first(); $menu = Menu::withShared($tenantId)->where('id', $id)->first();
if (!$menu) { if (!$menu) {
return ApiResponse::error('Menu not found', 404); return ['error' => 'Menu not found', 'code' => 404];
} }
$update = Arr::only($data, [ $update = Arr::only($data, [
@@ -147,13 +144,13 @@ public static function update(array $params)
$update = array_filter($update, fn($v) => !is_null($v)); $update = array_filter($update, fn($v) => !is_null($v));
if (empty($update)) { if (empty($update)) {
return ApiResponse::error('수정할 데이터가 없습니다.', 400); return ['error' => '수정할 데이터가 없습니다.', 'code' => 400];
} }
$update['updated_by'] = $userId; $update['updated_by'] = $userId;
$menu->fill($update)->save(); $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(); $userId = self::actorId();
if (!$id) { if (!$id) {
return ApiResponse::error('id가 필요합니다.', 400); return ['error' => 'id가 필요합니다.', 'code' => 400];
} }
$menu = Menu::withShared($tenantId)->where('id', $id)->first(); $menu = Menu::withShared($tenantId)->where('id', $id)->first();
if (!$menu) { if (!$menu) {
return ApiResponse::error('Menu not found', 404); return ['error' => 'Menu not found', 'code' => 404];
} }
$menu->deleted_by = $userId; $menu->deleted_by = $userId;
$menu->save(); $menu->save();
$menu->delete(); $menu->delete();
return ApiResponse::response('success'); return 'success';
} }
/** /**
@@ -188,7 +185,7 @@ public static function destroy(array $params)
public static function reorder(array $params) public static function reorder(array $params)
{ {
if (!is_array($params) || empty($params)) { if (!is_array($params) || empty($params)) {
return ApiResponse::error('유효한 정렬 목록이 필요합니다.', 422); return ['error' => '유효한 정렬 목록이 필요합니다.', 'code' => 422];
} }
$tenantId = self::tenantId(); $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(); $userId = self::actorId();
if (!$id) { if (!$id) {
return ApiResponse::error('id가 필요합니다.', 400); return ['error' => 'id가 필요합니다.', 'code' => 400];
} }
$payload = array_filter([ $payload = array_filter([
@@ -227,17 +224,17 @@ public static function toggle(array $params)
], fn($v) => !is_null($v)); ], fn($v) => !is_null($v));
if (empty($payload)) { if (empty($payload)) {
return ApiResponse::error('변경할 필드가 없습니다.', 422); return ['error' => '변경할 필드가 없습니다.', 'code' => 422];
} }
$menu = Menu::withShared($tenantId)->find($id); $menu = Menu::withShared($tenantId)->find($id);
if (!$menu) { if (!$menu) {
return ApiResponse::error('Menu not found', 404); return ['error' => 'Menu not found', 'code' => 404];
} }
$payload['updated_by'] = $userId; $payload['updated_by'] = $userId;
$menu->fill($payload)->save(); $menu->fill($payload)->save();
return ApiResponse::response('result', $menu->fresh()); return $menu->fresh();
} }
} }

View File

@@ -12,33 +12,33 @@ class MeterialService
public static function getMeterials() public static function getMeterials()
{ {
$query = new Material(); $query = new Material();
return ApiResponse::response('get', $query); return $query->get();
} }
public static function setMeterial() public static function setMeterial()
{ {
$query = DB::table('COM_CODE') $query = DB::table('COM_CODE')
->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); ->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) public static function getMeterial(int $id)
{ {
$query = Material::find($id); $query = Material::find($id);
return ApiResponse::response('get', $query); return $query->get();
} }
public static function updateMeterial(int $id) public static function updateMeterial(int $id)
{ {
$query = DB::table('COM_CODE') $query = DB::table('COM_CODE')
->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); ->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) public static function destoryMeterial(int $id)
{ {
$query = DB::table('COM_CODE') $query = DB::table('COM_CODE')
->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']);
return ApiResponse::response('get', $query); return $query->get();
} }
} }

View File

@@ -13,34 +13,34 @@ class ModelService
public static function getModels() public static function getModels()
{ {
$query = new Product(); $query = new Product();
return ApiResponse::response('get', $query); return $query->get();
} }
public static function setModel() public static function setModel()
{ {
$query = DB::table('COM_CODE') $query = DB::table('COM_CODE')
->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); ->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) public static function getModel(int $id)
{ {
$query = Bom::find($id); $query = Bom::find($id);
return ApiResponse::response('get', $query); return $query->get();
} }
public static function updateModel(int $id) public static function updateModel(int $id)
{ {
$query = DB::table('COM_CODE') $query = DB::table('COM_CODE')
->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); ->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) public static function destoryModel(int $id)
{ {
$query = DB::table('COM_CODE') $query = DB::table('COM_CODE')
->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']); ->select(['CODE_TP_ID', 'CODE_ID', 'CODE_VAL', 'CODE_DESC', 'USE_YN']);
return ApiResponse::response('get', $query); return $query->get();
} }
} }

View File

@@ -19,7 +19,7 @@ public static function getCategory($request)
// 재귀적으로 트리 구성 // 재귀적으로 트리 구성
$list = self::fetchCategoryTree($parentId, $group); $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') public static function getCategoryFlat($group = 'category')
{ {
$query = CommonCode::where('code_group',$group)->whereNull('parent_id'); $query = CommonCode::where('code_group',$group)->whereNull('parent_id');
return ApiResponse::response('get', $query); return $query->get();
} }

View File

@@ -52,7 +52,7 @@ public static function index(array $params = [])
{ {
$tenantId = self::tenantId(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$defs = SettingFieldDef::query() $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']) ($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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -105,7 +105,7 @@ public static function bulkUpsert(array $params = [])
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$payload = $v->validated(); $payload = $v->validated();
@@ -136,12 +136,12 @@ public static function bulkUpsert(array $params = [])
} }
}); });
} catch (\RuntimeException $e) { } catch (\RuntimeException $e) {
return ApiResponse::error($e->getMessage(), 422); return ['error' => $e->getMessage(), 'code' => 422];
} catch (\Throwable $e) { } 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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
// 전역 key 존재 확인 // 전역 key 존재 확인
$def = SettingFieldDef::where('field_key', $fieldKey)->first(); $def = SettingFieldDef::where('field_key', $fieldKey)->first();
if (!$def) { if (!$def) {
return ApiResponse::error('field_key not found', 404); return ['error' => 'field_key not found', 'code' => 404];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -170,7 +170,7 @@ public static function updateOne(string $fieldKey, array $params = [])
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$data = $v->validated(); $data = $v->validated();
@@ -180,7 +180,7 @@ public static function updateOne(string $fieldKey, array $params = [])
->where('id', $data['option_group_id']) ->where('id', $data['option_group_id'])
->exists(); ->exists();
if (!$ok) { 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); $effective = self::buildEffectiveRow($def, $s);
return ApiResponse::response('result', $effective); return $effective;
} catch (\Throwable $e) { } catch (\Throwable $e) {
return ApiResponse::error('수정 중 오류가 발생했습니다.', 500); return ['error' => '수정 중 오류가 발생했습니다.', 'code' => 500];
} }
} }
} }

View File

@@ -26,7 +26,7 @@ public static function index(array $params = [])
{ {
$tenantId = self::tenantId(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$per = (int)($params['per_page'] ?? $params['size'] ?? 20); $per = (int)($params['per_page'] ?? $params['size'] ?? 20);
@@ -44,7 +44,7 @@ public static function index(array $params = [])
$data = $q->paginate($per, ['*'], 'page', $page); $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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -68,7 +68,7 @@ public static function store(array $params = [])
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$data = $v->validated(); $data = $v->validated();
@@ -76,7 +76,7 @@ public static function store(array $params = [])
$item = TenantOptionGroup::create($data); $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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
if (!$id) { if (!$id) {
return ApiResponse::error('id가 올바르지 않습니다.', 422); return ['error' => 'id가 올바르지 않습니다.', 'code' => 422];
} }
$item = TenantOptionGroup::where('tenant_id', $tenantId)->find($id); $item = TenantOptionGroup::where('tenant_id', $tenantId)->find($id);
if (!$item) { 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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
if (!$id) { if (!$id) {
return ApiResponse::error('id가 올바르지 않습니다.', 422); return ['error' => 'id가 올바르지 않습니다.', 'code' => 422];
} }
$item = TenantOptionGroup::where('tenant_id', $tenantId)->find($id); $item = TenantOptionGroup::where('tenant_id', $tenantId)->find($id);
if (!$item) { if (!$item) {
return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -130,17 +130,17 @@ public static function update(int $id, array $params = [])
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$data = $v->validated(); $data = $v->validated();
if (empty($data)) { if (empty($data)) {
return ApiResponse::error('수정할 항목이 없습니다.', 422); return ['error' => '수정할 항목이 없습니다.', 'code' => 422];
} }
$item->fill($data)->save(); $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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
if (!$id) { if (!$id) {
return ApiResponse::error('id가 올바르지 않습니다.', 422); return ['error' => 'id가 올바르지 않습니다.', 'code' => 422];
} }
$item = TenantOptionGroup::where('tenant_id', $tenantId)->find($id); $item = TenantOptionGroup::where('tenant_id', $tenantId)->find($id);
if (!$item) { if (!$item) {
return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404];
} }
// 1) 옵션 값 존재 여부 // 1) 옵션 값 존재 여부
$hasValues = TenantOptionValue::where('group_id', $item->id)->exists(); $hasValues = TenantOptionValue::where('group_id', $item->id)->exists();
if ($hasValues) { if ($hasValues) {
return ApiResponse::error('해당 그룹에 옵션 값이 존재하여 삭제할 수 없습니다.', 409); return ['error' => '해당 그룹에 옵션 값이 존재하여 삭제할 수 없습니다.', 'code' => 409];
} }
// 2) 필드 설정에서 참조 여부 // 2) 필드 설정에서 참조 여부
@@ -175,11 +175,11 @@ public static function destroy(int $id)
->where('option_group_id', $item->id) ->where('option_group_id', $item->id)
->exists(); ->exists();
if ($isReferenced) { if ($isReferenced) {
return ApiResponse::error('필드 설정에서 참조 중인 그룹은 삭제할 수 없습니다.', 409); return ['error' => '필드 설정에서 참조 중인 그룹은 삭제할 수 없습니다.', 'code' => 409];
} }
$item->delete(); $item->delete();
return ApiResponse::response('result', ['deleted' => true]); return ['deleted' => true];
} }
} }

View File

@@ -32,12 +32,12 @@ public static function index(int $groupId, array $params = [])
{ {
$tenantId = self::tenantId(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$group = self::loadGroup($tenantId, $groupId); $group = self::loadGroup($tenantId, $groupId);
if (!$group) { if (!$group) {
return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404];
} }
$q = TenantOptionValue::where('group_id', $group->id) $q = TenantOptionValue::where('group_id', $group->id)
@@ -50,7 +50,7 @@ public static function index(int $groupId, array $params = [])
$list = $q->get(); $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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$group = self::loadGroup($tenantId, $groupId); $group = self::loadGroup($tenantId, $groupId);
if (!$group) { if (!$group) {
return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -80,14 +80,14 @@ public static function store(int $groupId, array $params = [])
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$data = $v->validated(); $data = $v->validated();
$data['group_id'] = $group->id; $data['group_id'] = $group->id;
$item = TenantOptionValue::create($data); $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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$group = self::loadGroup($tenantId, $groupId); $group = self::loadGroup($tenantId, $groupId);
if (!$group) { if (!$group) {
return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404];
} }
$item = TenantOptionValue::where('group_id', $group->id)->find($id); $item = TenantOptionValue::where('group_id', $group->id)->find($id);
if (!$item) { 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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$group = self::loadGroup($tenantId, $groupId); $group = self::loadGroup($tenantId, $groupId);
if (!$group) { if (!$group) {
return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404];
} }
$item = TenantOptionValue::where('group_id', $group->id)->find($id); $item = TenantOptionValue::where('group_id', $group->id)->find($id);
if (!$item) { if (!$item) {
return ApiResponse::error('옵션 값을 찾을 수 없습니다.', 404); return ['error' => '옵션 값을 찾을 수 없습니다.', 'code' => 404];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -146,17 +146,17 @@ public static function update(int $groupId, int $id, array $params = [])
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$data = $v->validated(); $data = $v->validated();
if (empty($data)) { if (empty($data)) {
return ApiResponse::error('수정할 항목이 없습니다.', 422); return ['error' => '수정할 항목이 없습니다.', 'code' => 422];
} }
$item->fill($data)->save(); $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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$group = self::loadGroup($tenantId, $groupId); $group = self::loadGroup($tenantId, $groupId);
if (!$group) { if (!$group) {
return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404];
} }
$item = TenantOptionValue::where('group_id', $group->id)->find($id); $item = TenantOptionValue::where('group_id', $group->id)->find($id);
if (!$item) { if (!$item) {
return ApiResponse::error('옵션 값을 찾을 수 없습니다.', 404); return ['error' => '옵션 값을 찾을 수 없습니다.', 'code' => 404];
} }
// TODO: 참조 무결성 검사(필요 시 구현) // TODO: 참조 무결성 검사(필요 시 구현)
$item->delete(); $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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$group = self::loadGroup($tenantId, $groupId); $group = self::loadGroup($tenantId, $groupId);
if (!$group) { if (!$group) {
return ApiResponse::error('옵션 그룹을 찾을 수 없습니다.', 404); return ['error' => '옵션 그룹을 찾을 수 없습니다.', 'code' => 404];
} }
$v = Validator::make($params, [ $v = Validator::make($params, [
@@ -209,7 +209,7 @@ public static function reorder(int $groupId, array $params = [])
]); ]);
if ($v->fails()) { if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422); return ['error' => $v->errors()->first(), 'code' => 422];
} }
$rows = $v->validated()['items']; $rows = $v->validated()['items'];
@@ -223,9 +223,9 @@ public static function reorder(int $groupId, array $params = [])
} }
}); });
} catch (\Throwable $e) { } catch (\Throwable $e) {
return ApiResponse::error('정렬 순서 저장 중 오류가 발생했습니다.', 500); return ['error' => '정렬 순서 저장 중 오류가 발생했습니다.', 'code' => 500];
} }
return ApiResponse::response('result', ['reordered' => true]); return ['reordered' => true];
} }
} }

View File

@@ -180,7 +180,7 @@ public static function getTenants(array $params = [])
$paginator = $query->paginate($pageSize, ['*'], 'page', $pageNo); $paginator = $query->paginate($pageSize, ['*'], 'page', $pageNo);
return ApiResponse::response('result', $paginator); return $paginator;
} }
/** /**
@@ -203,7 +203,7 @@ public static function getTenant(array $params = [])
->first(); ->first();
if (!$userTenant) { if (!$userTenant) {
return ApiResponse::error('활성(기본) 테넌트를 찾을 수 없습니다.', 404); return ['error' => '활성(기본) 테넌트를 찾을 수 없습니다.', 'code' => 404];
} }
$tenantId = $userTenant->tenant_id; $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') ->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); ->where('id', $tenantId);
return ApiResponse::response('first', $query); return $query->first();
} }
/** /**
@@ -241,7 +241,7 @@ public static function storeTenants(array $params = [])
if ($validator->fails()) { if ($validator->fails()) {
return ApiResponse::error($validator->errors()->first(), 400); return ['error' => $validator->errors()->first(), 'code' => 400];
} }
$payload = $validator->validated(); $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()) { if ($validator->fails()) {
return ApiResponse::error($validator->errors()->first(), 400); return ['error' => $validator->errors()->first(), 'code' => 400];
} }
$payload = $validator->validated(); $payload = $validator->validated();
@@ -311,17 +311,17 @@ public static function updateTenant(array $params = [])
unset($payload['tenant_id']); unset($payload['tenant_id']);
if (empty($payload)) { if (empty($payload)) {
return ApiResponse::error('수정할 데이터가 없습니다.', 400); return ['error' => '수정할 데이터가 없습니다.', 'code' => 400];
} }
$tenant = Tenant::find($tenantId); $tenant = Tenant::find($tenantId);
if (!$tenant) { if (!$tenant) {
return ApiResponse::error('테넌트를 찾을 수 없습니다.', 404); return ['error' => '테넌트를 찾을 수 없습니다.', 'code' => 404];
} }
$tenant->update($payload); $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'); $tenantId = $params['tenant_id'] ?? app('tenant_id');
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('tenant_id가 필요합니다.', 400); return ['error' => 'tenant_id가 필요합니다.', 'code' => 400];
} }
$tenant = Tenant::find($tenantId); $tenant = Tenant::find($tenantId);
if (!$tenant) { if (!$tenant) {
return ApiResponse::error('테넌트를 찾을 수 없습니다.', 404); return ['error' => '테넌트를 찾을 수 없습니다.', 'code' => 404];
} }
$tenant->delete(); // SoftDeletes 트레이트가 있으면 소프트 삭제 $tenant->delete(); // SoftDeletes 트레이트가 있으면 소프트 삭제
return ApiResponse::response('success'); return 'success';
} }
/** /**
@@ -358,19 +358,19 @@ public static function restoreTenant(array $params = [])
// 소프트 삭제 포함 조회 // 소프트 삭제 포함 조회
$tenant = Tenant::withTrashed()->find($tenantId); $tenant = Tenant::withTrashed()->find($tenantId);
if (!$tenant) { if (!$tenant) {
return ApiResponse::error('테넌트를 찾을 수 없습니다.', 404); return ['error' => '테넌트를 찾을 수 없습니다.', 'code' => 404];
} }
if (is_null($tenant->deleted_at)) { if (is_null($tenant->deleted_at)) {
// 이미 활성 상태 // 이미 활성 상태
return ApiResponse::error('이미 활성화된 테넌트입니다.', 400); return ['error' => '이미 활성화된 테넌트입니다.', 'code' => 400];
} }
$tenant->restore(); $tenant->restore();
// 복구 결과를 data에 담고 싶으면 fresh() 후 필요한 필드만 반환 // 복구 결과를 data에 담고 싶으면 fresh() 후 필요한 필드만 반환
// return ApiResponse::response('result', $tenant->fresh()); // return $tenant->fresh();
return ApiResponse::response('success'); return 'success';
} }
} }

View File

@@ -42,7 +42,7 @@ public static function index(array $params = [])
{ {
$tenantId = self::tenantId(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$per = (int)($params['per_page'] ?? $params['size'] ?? 20); $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; $page = isset($params['page']) ? (int)$params['page'] : null;
$data = $q->orderByDesc('id')->paginate($per, ['*'], 'page', $page); $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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
if (!$userId) { if (!$userId) {
return ApiResponse::error('userId가 올바르지 않습니다.', 422); return ['error' => 'userId가 올바르지 않습니다.', 'code' => 422];
} }
$item = TenantUserProfile::where('tenant_id', $tenantId) $item = TenantUserProfile::where('tenant_id', $tenantId)
@@ -82,10 +82,10 @@ public static function show(int $userId)
->first(); ->first();
if (!$item) { 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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
if (!$userId) { if (!$userId) {
return ApiResponse::error('userId가 올바르지 않습니다.', 422); return ['error' => 'userId가 올바르지 않습니다.', 'code' => 422];
} }
// (선택) 간단 유효성: 최소 1개 키 존재 // (선택) 간단 유효성: 최소 1개 키 존재
if (empty($params) || !is_array($params)) { if (empty($params) || !is_array($params)) {
return ApiResponse::error('수정할 항목이 없습니다.', 422); return ['error' => '수정할 항목이 없습니다.', 'code' => 422];
} }
$fields = self::effectiveFieldMap($tenantId); $fields = self::effectiveFieldMap($tenantId);
@@ -141,7 +141,7 @@ public static function update(int $userId, array $params = [])
$profile->save(); $profile->save();
}); });
} catch (\Throwable $e) { } catch (\Throwable $e) {
return ApiResponse::error('프로필 저장 중 오류가 발생했습니다.', 500); return ['error' => '프로필 저장 중 오류가 발생했습니다.', 'code' => 500];
} }
$fresh = TenantUserProfile::where('tenant_id', $tenantId) $fresh = TenantUserProfile::where('tenant_id', $tenantId)
@@ -149,7 +149,7 @@ public static function update(int $userId, array $params = [])
->with(['user:id,name,email']) ->with(['user:id,name,email'])
->first(); ->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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$userId = auth()->id(); $userId = auth()->id();
if (!$userId) { if (!$userId) {
return ApiResponse::error('인증 정보가 없습니다.', 401); return ['error' => '인증 정보가 없습니다.', 'code' => 401];
} }
$item = TenantUserProfile::where('tenant_id', $tenantId) $item = TenantUserProfile::where('tenant_id', $tenantId)
@@ -172,7 +172,7 @@ public static function me(array $params = [])
->first(); ->first();
// 없으면 null 반환(스펙에 따라 404로 바꾸려면 위와 동일 처리) // 없으면 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(); $tenantId = self::tenantId();
if (!$tenantId) { if (!$tenantId) {
return ApiResponse::error('활성 테넌트가 없습니다.', 400); return ['error' => '활성 테넌트가 없습니다.', 'code' => 400];
} }
$userId = auth()->id(); $userId = auth()->id();
if (!$userId) { if (!$userId) {
return ApiResponse::error('인증 정보가 없습니다.', 401); return ['error' => '인증 정보가 없습니다.', 'code' => 401];
} }
return self::update($userId, $params); return self::update($userId, $params);
} }