departmentService->getDepartments( $request->all(), $request->integer('per_page', 10) ); // HTMX 요청 시 HTML 반환 if ($request->header('HX-Request')) { $html = view('departments.partials.table', compact('departments'))->render(); return response()->json([ 'html' => $html, ]); } // 일반 요청 시 JSON 반환 return response()->json([ 'success' => true, 'data' => $departments->items(), 'meta' => [ 'current_page' => $departments->currentPage(), 'last_page' => $departments->lastPage(), 'per_page' => $departments->perPage(), 'total' => $departments->total(), ], ]); } /** * 부서 생성 */ public function store(StoreDepartmentRequest $request): JsonResponse { $department = $this->departmentService->createDepartment($request->validated()); // HTMX 요청 시 성공 메시지와 리다이렉트 헤더 반환 if ($request->header('HX-Request')) { return response()->json([ 'success' => true, 'message' => '부서가 생성되었습니다.', 'redirect' => route('departments.index'), ]); } return response()->json([ 'success' => true, 'message' => '부서가 생성되었습니다.', 'data' => $department, ], 201); } /** * 특정 부서 조회 */ public function show(Request $request, int $id): JsonResponse { $department = $this->departmentService->getDepartmentById($id); if (! $department) { return response()->json([ 'success' => false, 'message' => '부서를 찾을 수 없습니다.', ], 404); } // HTMX 요청 시 HTML 반환 if ($request->header('HX-Request')) { return response()->json([ 'html' => view('departments.partials.detail', compact('department'))->render(), ]); } return response()->json([ 'success' => true, 'data' => $department, ]); } /** * 부서 수정 */ public function update(UpdateDepartmentRequest $request, int $id): JsonResponse { $result = $this->departmentService->updateDepartment($id, $request->validated()); if (! $result) { return response()->json([ 'success' => false, 'message' => '부서 수정에 실패했습니다.', ], 400); } // HTMX 요청 시 성공 메시지와 리다이렉트 헤더 반환 if ($request->header('HX-Request')) { return response()->json([ 'success' => true, 'message' => '부서가 수정되었습니다.', 'redirect' => route('departments.index'), ]); } return response()->json([ 'success' => true, 'message' => '부서가 수정되었습니다.', ]); } /** * 부서 삭제 (Soft Delete) */ public function destroy(Request $request, int $id): JsonResponse { $result = $this->departmentService->deleteDepartment($id); if (! $result) { return response()->json([ 'success' => false, 'message' => '부서 삭제에 실패했습니다. (하위 부서가 존재할 수 있습니다)', ], 400); } // HTMX 요청 시 테이블 행 제거 트리거 if ($request->header('HX-Request')) { return response()->json([ 'success' => true, 'message' => '부서가 삭제되었습니다.', 'action' => 'remove', ]); } return response()->json([ 'success' => true, 'message' => '부서가 삭제되었습니다.', ]); } /** * 부서 복원 */ public function restore(Request $request, int $id): JsonResponse { $result = $this->departmentService->restoreDepartment($id); if (! $result) { return response()->json([ 'success' => false, 'message' => '부서 복원에 실패했습니다.', ], 400); } if ($request->header('HX-Request')) { return response()->json([ 'success' => true, 'message' => '부서가 복원되었습니다.', ]); } return response()->json([ 'success' => true, 'message' => '부서가 복원되었습니다.', ]); } /** * 부서 영구 삭제 */ public function forceDelete(Request $request, int $id): JsonResponse { $result = $this->departmentService->forceDeleteDepartment($id); if (! $result) { return response()->json([ 'success' => false, 'message' => '부서 영구 삭제에 실패했습니다. (하위 부서가 존재할 수 있습니다)', ], 400); } if ($request->header('HX-Request')) { return response()->json([ 'success' => true, 'message' => '부서가 영구 삭제되었습니다.', ]); } return response()->json([ 'success' => true, 'message' => '부서가 영구 삭제되었습니다.', ]); } }