Vista general
La aplicación mobile de Melody es el cliente principal con el que los usuarios interactúan para consumir y crear contenido musical. Desarrollada con Expo y React Native, la aplicación proporciona una experiencia nativa para Android que permite a oyentes y artistas acceder al catálogo completo, reproducir música, gestionar playlists, y recibir notificaciones en tiempo real.
La aplicación se conecta exclusivamente con el API Gateway mediante peticiones HTTP, delegando toda la lógica de negocio a los microservicios del backend. Esto permite mantener una arquitectura desacoplada donde el frontend se enfoca en la experiencia de usuario mientras el backend gestiona la seguridad, persistencia y lógica de negocio.
NOTE
La aplicación mobile fue desarrollada exclusivamente para Android. Aunque la arquitectura de Expo permite soporte multiplataforma, el proyecto se enfocó en Android como plataforma objetivo.
Arquitectura y Stack Tecnológico
La aplicación está construida sobre un stack moderno de React Native con las siguientes tecnologías principales:
Framework Base
- Expo: Framework que simplifica el desarrollo de aplicaciones React Native, proporcionando acceso a APIs nativas y facilitando el proceso de build y deployment.
- React Native: Framework para desarrollo de aplicaciones móviles nativas usando React.
Navegación y Routing
La aplicación utiliza Expo Router para la navegación, implementando un sistema de routing basado en archivos similar a Next.js. Esto permite:
- Navegación declarativa mediante la estructura de carpetas en
app/ - Deep linking automático para notificaciones push y enlaces externos
- Tipado automático de rutas y parámetros
- Transiciones y animaciones entre pantallas
Gestión de Estado
El estado de la aplicación se maneja mediante una combinación de:
- React Context API: Para estado global compartido (sesión de usuario, reproductor de música, formularios de creación)
- Custom Hooks: Para lógica reutilizable (búsqueda, visibilidad del teclado)
- AsyncStorage: Para persistencia local de datos (borradores de canciones, preferencias)
- Expo Secure Store: Para almacenamiento seguro de tokens de autenticación
UI y Estilos
- NativeWind: Implementación de Tailwind CSS para React Native, permitiendo estilos utility-first
- Gluestack UI: Sistema de componentes con theming consistente y modo oscuro
- Lucide React Native: Librería de iconos moderna y consistente
Integraciones Externas
- Firebase Storage: Para almacenamiento y descarga de archivos multimedia (imágenes de perfil, covers, audio, video)
- OneSignal: Para notificaciones push en tiempo real
- Google Sign-In: Para autenticación con cuentas de Google
Comunicación con el Backend
La aplicación se comunica con el backend a través de una capa de servicios bien definida ubicada en services/. Cada servicio encapsula las llamadas a un microservicio específico del backend:
- AuthService: Gestiona autenticación, registro, login con Google y recuperación de contraseña
- UserService: Operaciones sobre perfiles de usuario, follow/unfollow, búsqueda de usuarios
- CatalogService: Gestión completa del catálogo (canciones, colecciones, playlists, búsquedas)
- NotificationService: Gestión de notificaciones del usuario
- ArtistService: Operaciones específicas para perfiles de artistas
Cliente HTTP y Manejo de Tokens
Todos los servicios utilizan un cliente HTTP centralizado (lib/http.ts) basado en Axios que implementa:
- Inyección automática de tokens: Añade el header
x-access-tokena todas las peticiones autenticadas - Refresh automático de tokens: Intercepta respuestas 401/403, refresca el access token usando el refresh token, y reintenta la petición original
- Manejo de errores centralizado: Parsea errores de la API y los transforma en objetos de error consistentes
Estructura de la Aplicación
Contextos Principales
La aplicación utiliza tres contextos principales para gestionar estado global:
SessionProvider
Gestiona el ciclo de vida completo de la sesión del usuario:
- Login y logout
- Registro de nuevos usuarios
- Recuperación de sesión al iniciar la app
- Navegación automática según estado de autenticación (onboarding, tabs, login)
- Normalización de roles (artist/listener)
PlayerProvider
Centraliza toda la lógica del reproductor de música:
- Cola de reproducción (queue)
- Canción actual y estado de reproducción
- Controles de reproducción (play, pause, next, previous)
- Gestión del audio mediante Expo Audio
- Sincronización con el contexto de reproducción (playlist, album, etc.)
SongFormProvider
Gestiona el estado de creación de canciones para artistas:
- Borrador persistente de canciones en creación
- Sincronización con AsyncStorage
- Limpieza y recuperación de borradores
Funcionalidades Principales
Autenticación y Onboarding
La aplicación soporta múltiples métodos de autenticación:
- Registro tradicional con email y contraseña
- Login con credenciales
- Autenticación con Google OAuth
- Recuperación de contraseña mediante tokens por email
Después del primer login, los usuarios pasan por un flujo de onboarding donde completan su perfil con información adicional (región, géneros favoritos, etc.).
Reproducción de Música
El reproductor de música es el componente central de la aplicación, permitiendo:
- Reproducción de canciones individuales o desde contextos (playlist, album, artista)
- Cola de reproducción con capacidad de reordenar
- Controles de reproducción (play, pause, skip, seek)
- Visualización de portada, título y artista
- Integración con el sistema de likes
Búsqueda y Descubrimiento
La funcionalidad de búsqueda permite encontrar:
- Canciones
- Álbumes, singles y EPs
- Playlists
- Artistas y usuarios
Los resultados se ordenan por relevancia usando el algoritmo de distancia de Levenshtein para mejorar la precisión de las búsquedas.
Gestión de Biblioteca
Los usuarios pueden organizar su contenido mediante:
- Canciones favoritas (liked songs)
- Playlists personalizadas
- Colecciones guardadas
- Seguimiento de artistas
Creación de Contenido (Artistas)
Los usuarios con rol de artista tienen acceso a funcionalidades adicionales:
- Subida de canciones con metadata completa (título, género, mood, colaboradores)
- Creación de colecciones (álbumes, singles, EPs)
- Gestión de Artist Picks (canciones destacadas en su perfil)
- Subida de multimedia (audio, video, imágenes) a Firebase Storage
Notificaciones Push
La aplicación integra OneSignal para notificaciones push en tiempo real, permitiendo:
- Notificaciones de nuevos seguidores
- Notificaciones de nuevas playlists de usuarios seguidos
- Notificaciones de nuevas colecciones de artistas seguidos
IMPORTANT
Las notificaciones push requieren un development build ya que OneSignal necesita código nativo que no está disponible en Expo Go. Los usuarios deben generar un build de desarrollo usando
npx expo prebuildo EAS Build.
Almacenamiento y Multimedia
Firebase Storage
La aplicación utiliza Firebase Storage para el almacenamiento de archivos multimedia:
- Imágenes: Fotos de perfil, covers de colecciones, banners
- Audio: Archivos de canciones
- Video: Contenido multimedia de canciones
El flujo de subida funciona de la siguiente manera:
- El usuario selecciona un archivo desde su dispositivo
- La aplicación sube el archivo a Firebase Storage usando el Firebase Admin SDK
- Firebase retorna una URL de almacenamiento
- La URL se envía al backend como parte de la metadata del contenido
Autenticación con Firebase
Para acceder a Firebase Storage, la aplicación obtiene un token personalizado de Firebase desde el servicio de usuarios, que genera el token usando el Firebase Admin SDK. Esto permite que el frontend tenga acceso controlado al storage sin exponer credenciales de servicio.
Desarrollo y Deployment
Configuración del Entorno
La aplicación utiliza variables de entorno inyectadas a través de app.config.js:
API_URL: URL base del API Gateway- Credenciales de Firebase (API Key, Project ID, Storage Bucket, etc.)
- Client IDs de Google para OAuth
- OneSignal App ID para notificaciones push
Testing Local
Para desarrollo local, los desarrolladores pueden usar:
- Android Emulator: Emulador de Android Studio para testing en dispositivo virtual
- Expo Go: Para testing rápido de funcionalidades que no requieren código nativo (limitado, no soporta OneSignal ni Google Sign-In)
- Physical Device: Instalando el development build en un dispositivo Android físico