Files
OnAPB-Carrere_Demartin/app/Http/Controllers/SeguimientoController.php
T
2026-06-04 15:10:18 -03:00

123 lines
4.2 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Equipo;
use App\Models\EquipoSeguimiento;
use App\Models\Evento;
use App\Services\NotificacionService;
class SeguimientoController extends Controller
{
private NotificacionService $notifService;
public function __construct(NotificacionService $notifService)
{
$this->notifService = $notifService;
}
private function getUserSession(): ?array
{
if (!session()->has('user_logged_in')) return null;
return ['tipo' => session('user_tipo'), 'id' => session('user_id')];
}
/**
* POST /seguimiento/equipo/{id} — Toggle: seguir o dejar de seguir un equipo
*/
public function toggle(int $id)
{
$u = $this->getUserSession();
if (!$u) {
return response()->json(['ok' => false, 'msg' => 'Debés iniciar sesión para seguir equipos.'], 401);
}
$equipo = Equipo::find($id);
if (!$equipo) {
return response()->json(['ok' => false, 'msg' => 'Equipo no encontrado.'], 404);
}
$existing = EquipoSeguimiento::where('id_equipo', $id)
->where('tipo_usuario', $u['tipo'])
->where('id_usuario', (string)$u['id'])
->first();
if ($existing) {
$existing->delete();
return response()->json(['ok' => true, 'siguiendo' => false, 'msg' => 'Dejaste de seguir este equipo.']);
}
EquipoSeguimiento::create([
'id_equipo' => $id,
'tipo_usuario'=> $u['tipo'],
'id_usuario' => (string)$u['id'],
'created_at' => now(),
]);
return response()->json(['ok' => true, 'siguiendo' => true, 'msg' => '¡Ahora seguís este equipo!']);
}
/**
* GET /seguimiento/mis-equipos — Devuelve equipos seguidos y próximos partidos
*/
public function misEquipos()
{
$u = $this->getUserSession();
if (!$u) return response()->json(['equipos' => []]);
$seguimientos = EquipoSeguimiento::with(['equipo.club'])
->where('tipo_usuario', $u['tipo'])
->where('id_usuario', (string)$u['id'])
->get();
$equiposIds = $seguimientos->pluck('id_equipo');
// Próximos partidos de los equipos seguidos
$proximosPartidos = Evento::with(['equipoLocal.club', 'equipoVisitante.club'])
->where('fecha_evento', '>=', now()->toDateString())
->where(function ($q) use ($equiposIds) {
$q->whereIn('id_equipo_local', $equiposIds)
->orWhereIn('id_equipo_visitante', $equiposIds);
})
->orderBy('fecha_evento')
->orderBy('hora_inicio')
->limit(10)
->get();
return response()->json([
'equipos' => $seguimientos->map(fn($s) => [
'id' => $s->id_equipo,
'nombre' => ($s->equipo->club->nombre ?? 'Equipo') . ' ' . $s->equipo->categoria . ($s->equipo->division ? ' ' . $s->equipo->division : ''),
'club' => $s->equipo->club->nombre ?? '—',
'categoria'=> $s->equipo->categoria,
'division' => $s->equipo->division,
]),
'proximos_partidos' => $proximosPartidos->map(fn($e) => [
'id' => $e->id_evento,
'fecha' => $e->fecha_evento->format('d/m/Y'),
'hora' => $e->hora_inicio ? $e->hora_inicio->format('H:i') : '',
'local' => $e->equipoLocal->club->nombre ?? '?',
'visitante'=> $e->equipoVisitante->club->nombre ?? '?',
'sede' => $e->sede,
]),
]);
}
/**
* GET /seguimiento/estado/{id_equipo} — ¿El usuario sigue este equipo?
*/
public function estado(int $id)
{
$u = $this->getUserSession();
if (!$u) return response()->json(['siguiendo' => false]);
$siguiendo = EquipoSeguimiento::where('id_equipo', $id)
->where('tipo_usuario', $u['tipo'])
->where('id_usuario', (string)$u['id'])
->exists();
return response()->json(['siguiendo' => $siguiendo]);
}
}