arcos-backend/app/Http/Controllers/Api/ArcoController.php

157 lines
3.7 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Arco;
use Illuminate\Http\Request;
use Notsoweb\ApiResponse\Enums\ApiResponse;
/**
* Controlador para gestión de Arcos
*/
class ArcoController extends Controller
{
/**
* Listar todos los arcos
* GET /api/arcos
*/
public function index(Request $request)
{
$query = Arco::query();
// Filtro por estado activo
if ($request->has('activo')) {
$query->where('activo', $request->boolean('activo'));
}
// Filtro por IP
if ($request->has('ip')) {
$query->where('ip_address', 'like', '%' . $request->ip . '%');
}
$arcos = $query->orderBy('created_at', 'desc')->get();
return ApiResponse::OK->response([
'arcos' => $arcos
]);
}
/**
* Crear un nuevo arco
* POST /api/arcos
*/
public function store(Request $request)
{
$validated = $request->validate([
'nombre' => 'required|string|max:255',
'ip_address' => 'required|ip|unique:arcos,ip_address',
'ubicacion' => 'nullable|string|max:255',
'descripcion' => 'nullable|string',
'activo' => 'boolean'
]);
$arco = Arco::create($validated);
return ApiResponse::CREATED->response([
'message' => 'Arco creado exitosamente',
'arco' => $arco
]);
}
/**
* Mostrar un arco específico
* GET /api/arcos/{id}
*/
public function show(int $id)
{
$arco = Arco::with(['detecciones' => function ($query) {
$query->latest()->limit(10);
}])->find($id);
if (!$arco) {
return ApiResponse::NOT_FOUND->response([
'message' => 'Arco no encontrado'
]);
}
return ApiResponse::OK->response([
'arco' => $arco
]);
}
/**
* Actualizar un arco
* PUT/PATCH /api/arcos/{id}
*/
public function update(Request $request, int $id)
{
$arco = Arco::find($id);
if (!$arco) {
return ApiResponse::NOT_FOUND->response([
'message' => 'Arco no encontrado'
]);
}
$validated = $request->validate([
'nombre' => 'sometimes|required|string|max:255',
'ip_address' => 'sometimes|required|ip|unique:arcos,ip_address,' . $id,
'ubicacion' => 'nullable|string|max:255',
'descripcion' => 'nullable|string',
'activo' => 'boolean'
]);
$arco->update($validated);
return ApiResponse::OK->response([
'message' => 'Arco actualizado exitosamente',
'arco' => $arco
]);
}
/**
* Eliminar un arco
* DELETE /api/arcos/{id}
*/
public function destroy(int $id)
{
$arco = Arco::find($id);
if (!$arco) {
return ApiResponse::NOT_FOUND->response([
'message' => 'Arco no encontrado'
]);
}
$arco->delete();
return ApiResponse::OK->response([
'message' => 'Arco eliminado exitosamente'
]);
}
/**
* Activar/Desactivar un arco
* PATCH /api/arcos/{id}/toggle-estado
*/
public function toggleEstado(int $id)
{
$arco = Arco::find($id);
if (!$arco) {
return ApiResponse::NOT_FOUND->response([
'message' => 'Arco no encontrado'
]);
}
$arco->activo = !$arco->activo;
$arco->save();
return ApiResponse::OK->response([
'message' => $arco->activo ? 'Arco activado' : 'Arco desactivado',
'arco' => $arco
]);
}
}