Project Structure & Key Technologies

Árbol del Proyecto (enfocado en API + SU)

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ías Clave

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

Convenciones de la API

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:

Siguente página

04-Core-Data-Models