LaUapi/
├── app/
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── Api/ # API REST (15 controladores)
│ │ │ │ ├── AuthController.php # Login, registro, OAuth, sesión
│ │ │ │ ├── PostController.php # CRUD de publicaciones
│ │ │ │ ├── CommentController.php # Comentarios anidados
│ │ │ │ ├── LikeController.php # Toggle likes
│ │ │ │ ├── UserController.php # Usuarios, búsqueda, stats
│ │ │ │ ├── FollowerController.php # Follow/unfollow
│ │ │ │ ├── NotificationController.php # Notificaciones + FCM push
│ │ │ │ ├── ChatApiController.php # Mensajería (Pusher)
│ │ │ │ ├── MusicSearchController.php # iTunes Search API
│ │ │ │ ├── UniversidadController.php # Universidades y carreras
│ │ │ │ ├── TaskController.php # Tareas (to-do)
│ │ │ │ ├── PomodoroController.php # Sesiones Pomodoro
│ │ │ │ ├── BannerController.php # Banners activos
│ │ │ │ ├── ReporteController.php # Reportes de usuarios
│ │ │ │ └── AppUpdateController.php # Check OTA updates
│ │ │ └── SUController.php # Panel de administración SU
│ │ ├── Middleware/
│ │ │ └── UpdateUserActivity.php # Actualiza is_online/last_activity
│ │ └── Requests/
│ │ └── RegisterRequest.php # Validación de registro (EmailDomain)
│ ├── Models/ # 18 modelos Eloquent
│ │ ├── User.php # HasApiTokens, followers/following, universidad/carrera
│ │ ├── Post.php # 4 tipos: imagen, musica, texto, archivo
│ │ ├── Comentario.php # Anidamiento parent_id, depth (max 5)
│ │ ├── Like.php
│ │ ├── Follower.php
│ │ ├── Notification.php # Tipos: follow, like, comment, reply_comment
│ │ ├── Universidad.php # dominio, siglas, color_primario
│ │ ├── Carrera.php # Pivote carrera_universidad
│ │ ├── Insignia.php # Pivote insignia_user
│ │ ├── Banner.php # Pivote banner_user_views, scopeActive
│ │ ├── Reporte.php # reporter_id, reported_user_id, estado
│ │ ├── SocialLink.php
│ │ ├── Task.php # uuid_cliente, status, priority, scopes
│ │ ├── PomodoroSession.php # uuid_cliente, scopes today/thisWeek/thisMonth
│ │ ├── DeviceToken.php # FCM tokens por dispositivo
│ │ ├── AppUpdate.php # OTA updates (version, file_path, is_active)
│ │ ├── ChMessage.php # Chatify: mensajes
│ │ ├── ChFavorite.php # Chatify: favoritos
│ │ └── su_ad.php # Modelo de administradores SU
│ ├── Policies/
│ │ └── PostPolicy.php # Autorización de posts
│ ├── Rules/
│ │ └── EmailDomain.php # Validación de dominio institucional
│ └── Services/
│ ├── NotificationService.php # Creación de notificaciones + push FCM
│ └── CrossPlatformMusicService.php # URLs Apple Music ↔ Spotify
├── routes/
│ ├── api.php # ~160 líneas: todas las rutas API (Sanctum)
│ ├── web.php # Panel SU (prefix us/su/lau, auth:super)
│ └── console.php # Comandos Artisan personalizados
├── resources/views/
│ ├── su/ # Vistas del panel SU (10 archivos Blade)
│ │ ├── login.blade.php
│ │ ├── dashboard.blade.php
│ │ ├── universidad.blade.php
│ │ ├── carreras.blade.php
│ │ ├── usuarios.blade.php
│ │ ├── perfil.blade.php
│ │ ├── reportes.blade.php
│ │ ├── insignia.blade.php
│ │ ├── anuncio.blade.php
│ │ └── updates.blade.php
│ └── layouts/
│ └── app-su.blade.php # Layout base del panel SU
├── config/
│ ├── auth.php # Guards: web, super (su_ad)
│ ├── sanctum.php # Token expiry
│ ├── chatify.php # Pusher config
│ └── services.php # Spotify, Giphy, Make webhook
├── database/
│ ├── migrations/ # ~30 migraciones
│ └── seeders/ # 13 seeders
└── public/
├── uploads/ # Imágenes de posts (WebP)
├── perfiles/ # Fotos de perfil
├── files/ # Archivos adjuntos (PDF, DOC, ZIP)
└── build/ # Assets compilados (Vite)
| Tecnología | Uso |
|---|---|
| Laravel 12 + PHP 8.2 | Framework backend |
| Laravel Sanctum | Autenticación por tokens (API móvil) |
| MySQL | Base de datos relacional |
| Pusher | WebSockets para chat en tiempo real |
| Firebase Cloud Messaging | Push notifications (Android/iOS) |
| iTunes Search API | Búsqueda de música para posts |
| Intervention Image (GD) | Redimensionado y conversión a WebP |
| Vite + Tailwind CSS | Build de assets (panel SU) |
| Make.com | Webhook para alertas de reportes |
Todas las respuestas JSON siguen este formato:
{
"success": true|false,
"data": { ... },
"message": "Texto descriptivo"
}
En caso de error:
{
"success": false,
"message": "Descripción del error",
"error": "Detalle técnico (solo en debug)",
"errors": { "campo": ["validación"] }
}
Las URLs de imágenes se construyen dinámicamente en cada controlador:
url('perfiles/' . $user->imagen)url('uploads/' . $post->imagen)url('files/' . $post->archivo)/storage/attachments/{filename}