123 lines
4.2 KiB
PHP
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]);
|
|
}
|
|
}
|