Files
Sistema-Educativo-Laravel/app/Http/Controllers/FriendshipController.php
fernando d7ae38ce27 feat: gestión de amigos y mejora visual del dropdown de búsqueda
- FriendshipController: carga también amigos aceptados con su friendship
- friendships/index: tabs con 'Mis amigos' (tabla con Mensaje/Quitar) y 'Solicitudes'
- Notificaciones de solicitud abren directamente la pestaña de solicitudes (#solicitudes)
- Dropdown de búsqueda: bordes redondeados, sombra suave, margen superior, hover en items, etiqueta de sección y separadores finos

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 17:20:01 -06:00

128 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Friendship;
use App\Models\User;
use App\Support\Notifier;
use Illuminate\Http\Request;
class FriendshipController extends Controller
{
public function index()
{
$me = auth()->user();
$requests = $me->receivedFriendRequests()
->where('status', 'pending')
->with('sender')
->latest()
->get();
// Amigos aceptados (en ambas direcciones)
$friendIds = $me->friendIds();
$friends = User::whereIn('id', $friendIds)
->orderBy('name')
->get()
->map(function (User $user) use ($me) {
$user->friendship = $me->friendshipWith($user);
return $user;
});
return view('friendships.index', compact('requests', 'friends'));
}
public function send(User $user)
{
$me = auth()->user();
if ($me->id === $user->id) {
return back()->with('error', 'No puedes enviarte una solicitud a ti mismo.');
}
if ($me->friendshipWith($user)) {
return back()->with('error', 'Ya existe una relación con este usuario.');
}
Friendship::create([
'sender_id' => $me->id,
'receiver_id' => $user->id,
'status' => 'pending',
]);
Notifier::send(
recipient: $user,
title: $me->name . ' te envió una solicitud de amistad',
icon: 'fa-user-plus',
color: 'primary',
url: route('friendships.index') . '#solicitudes',
);
return back()->with('success', 'Solicitud de amistad enviada.');
}
public function accept(Friendship $friendship)
{
abort_unless($friendship->receiver_id === auth()->id(), 403);
$friendship->update(['status' => 'accepted']);
$friendship->load('receiver');
Notifier::send(
recipient: $friendship->sender,
title: $friendship->receiver->name . ' aceptó tu solicitud de amistad',
icon: 'fa-user-check',
color: 'success',
url: route('social.profile', $friendship->receiver),
);
return back()->with('success', 'Solicitud aceptada.');
}
public function destroy(Friendship $friendship)
{
$me = auth()->id();
abort_unless(
$friendship->sender_id === $me || $friendship->receiver_id === $me,
403
);
$friendship->delete();
return back()->with('success', 'Solicitud eliminada.');
}
// AJAX desde búsqueda/perfil
public function toggle(User $user)
{
$me = auth()->user();
if ($me->id === $user->id) {
return response()->json(['error' => 'No permitido'], 422);
}
$existing = $me->friendshipWith($user);
if ($existing) {
$existing->delete();
return response()->json(['status' => 'none']);
}
Friendship::create([
'sender_id' => $me->id,
'receiver_id' => $user->id,
'status' => 'pending',
]);
Notifier::send(
recipient: $user,
title: $me->name . ' te envió una solicitud de amistad',
icon: 'fa-user-plus',
color: 'primary',
url: route('friendships.index') . '#solicitudes',
);
return response()->json(['status' => 'pending']);
}
}