with('deviceModules.module', 'deviceModules.user'); if ($request->filled('serie')) { $devices->where('serie', 'LIKE', '%' . $request->input('serie') . '%'); } if ($request->filled('brand')) { $devices->where('brand', 'LIKE', '%' . $request->input('brand') . '%'); } return ApiResponse::OK->response([ 'devices' => $devices->paginate(config('app.pagination')), ]); } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al obtener la lista de dispositivos.', 'error' => $e->getMessage(), ]); } } public function store(DeviceStoreRequest $request) { try { DB::beginTransaction(); // Crear el dispositivo $device = Device::create([ 'brand' => $request->input('brand'), 'serie' => $request->input('serie'), 'mac_address' => $request->input('mac_address'), 'status' => $request->input('status', true), ]); // Asignar módulo y usuarios usando el modelo DeviceModule $userIds = $request->input('user_id'); foreach ($userIds as $userId) { DeviceModule::create([ 'device_id' => $device->id, 'module_id' => $request->module_id, 'user_id' => $userId, 'status' => true, ]); } DB::commit(); $device->load('modules'); return ApiResponse::CREATED->response([ 'message' => 'Dispositivo creado exitosamente.', 'device' => [ 'id' => $device->id, 'brand' => $device->brand, 'serie' => $device->serie, 'status' => $device->status, ], ]); } catch (\Exception $e) { DB::rollBack(); return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al crear el dispositivo.', 'error' => $e->getMessage(), ]); } } public function show($id) { try { $device = Device::with('deviceModules.module', 'deviceModules.user')->findOrFail($id); return ApiResponse::OK->response([ 'device' => $device, ]); } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al obtener el dispositivo.', 'error' => $e->getMessage(), ]); } } public function update(DeviceUpdateRequest $request, $id) { try { DB::beginTransaction(); $device = Device::findOrFail($id); $device->update($request->only(['brand', 'serie', 'mac_address', 'status'])); DeviceModule::where('device_id', $device->id)->delete(); $userIds = $request->input('user_id'); foreach ($userIds as $userId) { DeviceModule::create([ 'device_id' => $device->id, 'module_id' => $request->module_id, 'user_id' => $userId, 'status' => true, ]); } DB::commit(); $device->load(['deviceModules.module', 'deviceModules.user']); return ApiResponse::OK->response([ 'message' => 'Dispositivo actualizado exitosamente.', 'device' => [ 'id' => $device->id, 'brand' => $device->brand, 'serie' => $device->serie, 'mac_address' => $device->mac_address, 'status' => $device->status, 'module' => $device->deviceModules->first()?->module, 'authorized_users' => $device->deviceModules ->filter(fn($dm) => $dm->user !== null) ->map(fn($dm) => [ 'id' => $dm->user->id, 'name' => $dm->user->full_name, 'email' => $dm->user->email, ]) ->unique('id') ->values(), ], ]); } catch (\Exception $e) { return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al actualizar el dispositivo.', 'error' => $e->getMessage(), ]); } } public function destroy($id) { try { DB::beginTransaction(); $device = Device::findOrFail($id); $device->delete(); DB::commit(); return ApiResponse::OK->response([ 'message' => 'Dispositivo eliminado exitosamente.', ]); } catch (\Exception $e) { DB::rollBack(); return ApiResponse::INTERNAL_ERROR->response([ 'message' => 'Error al eliminar el dispositivo.', 'error' => $e->getMessage(), ]); } } }