User Model & Identity System

Modelo User (app/Models/User.php)

Traits

Atributos (fillable)

Campo Tipo Descripción
name string Nombre completo
username string Nombre de usuario (único, usado como route key)
email string Correo electrónico (validado con EmailDomain rule)
password hashed Contraseña (cast automático)
role string aspirante, estudiante, egresado
imagen string Nombre del archivo de foto de perfil (default: img.jpg via mutator)
gender string Género
profession string Profesión
insignia string Insignia legacy (string directo)
is_online boolean Estado de presencia
last_activity datetime Última actividad registrada
last_seen datetime Última vez visto (se muestra como diffForHumans)
universidad_id FK Relación con Universidad
carrera_id FK Relación con Carrera

Accessors y Appends

protected $appends = ['imagen_url'];

// Se incluye automáticamente en JSON:
public function getImagenUrlAttribute()
{
    return $this->imagen ? url('perfiles/' . $this->imagen) : null;
}

Route Model Binding

public function getRouteKeyName() { return 'username'; }

Laravel resuelve {user} en rutas usando username en lugar de id.

Relaciones

// Contenido
$user->posts()              // hasMany Post
$user->likes()              // hasMany Like
$user->tasks()              // hasMany Task
$user->pomodoroSessions()   // hasMany PomodoroSession

// Grafo social (self-referencing many-to-many via tabla 'followers')
$user->followers()          // belongsToMany User (quiénes lo siguen)
$user->following()          // belongsToMany User (a quiénes sigue)
$user->isFollowing($user)   // Verifica si sigue a un usuario

// Notificaciones
$user->notifications()         // hasMany Notification (scope: recent)
$user->unreadNotifications()   // hasMany Notification (scope: unread + recent)
$user->unread_notifications_count  // Accessor con conteo

// Social
$user->socialLinks()        // hasMany SocialLink (scope: ordered)
$user->insignias()          // belongsToMany Insignia (pivote con timestamps)
$user->reportesRecibidos()  // hasMany Reporte (reported_user_id)

// Académico
$user->universidad()  // belongsTo Universidad
$user->carrera()      // belongsTo Carrera

Sistema de Presencia Online

$user->updateActivity()  // Marca is_online=true, last_activity=now()
$user->setOffline()      // Marca is_online=false, last_seen=now()
$user->isOnline()        // true si is_online && last_activity < 5 min

// Scope:
User::online()->get()    // Solo usuarios activos en últimos 5 min

El middleware UpdateUserActivity actualiza automáticamente en cada request autenticado.

Mutator de Imagen

public function setImagenAttribute($value) {
    $this->attributes['imagen'] = $value ?: 'img.jpg';
}