2025-10-23 17:01:49 -06:00

131 lines
4.6 KiB
PHP

<?php
namespace App\Http\Controllers\Repuve;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Notsoweb\ApiResponse\Enums\ApiResponse;
use App\Http\Requests\Repuve\DeviceStoreRequest;
use App\Models\Device;
use App\Models\DeviceModule;
use Illuminate\Support\Facades\DB;
class DeviceController extends Controller
{
public function index(Request $request)
{
try {
$query = Device::query();
if (!$request->filled('serie') && !$request->filled('brand')) {
return ApiResponse::BAD_REQUEST->response([
'message' => 'Debe proporcionar al menos uno de los siguientes parámetros: serie o marca.'
]);
}
if ($request->filled('serie')) {
$query->where('serie', 'LIKE', '%' . $request->input('serie') . '%');
}
if ($request->filled('brand')) {
$query->where('brand', 'LIKE', '%' . $request->input('brand') . '%');
}
$query->with('deviceModules.module', 'deviceModules.user');
$perPage = $request->input('per_page', 15);
$devices = $query->paginate($perPage);
return ApiResponse::OK->response([
'devices' => $devices->map(function ($device) {
$module = $device->deviceModules->first()?->module;
$authorizedUsers = $device->deviceModules
->filter(fn($dm) => $dm->user !== null)
->map(function ($deviceModule) {
return [
'id' => $deviceModule->user->id,
'name' => $deviceModule->user->full_name,
'email' => $deviceModule->user->email,
];
})
->unique('id')
->values();
return [
'id' => $device->id,
'brand' => $device->brand,
'serie' => $device->serie,
'mac_address' => $device->mac_address,
'status' => $device->status ? 'activo' : 'inactivo',
'module' => $module ? [
'id' => $module->id,
'name' => $module->name,
] : null,
'authorized_users' => $authorizedUsers,
];
}),
'pagination' => [
'total' => $devices->total(),
'per_page' => $devices->perPage(),
'current_page' => $devices->currentPage(),
'last_page' => $devices->lastPage(),
'from' => $devices->firstItem(),
'to' => $devices->lastItem(),
],
]);
} 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();
// 1. 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),
]);
// 2. 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(),
]);
}
}
}