La aplicación gestionaba una única playlist por usuario, creada automáticamente al iniciar sesión (SongSwipe Likes) y almacenada en la tabla user_playlists de Supabase. Todas las canciones marcadas con swipe a la derecha en el SwipeScreen se añadían obligatoriamente a esa playlist.
Esta implementación presentaba varias limitaciones:
user_playlists) que duplicaba una información ya disponible en la API de Spotify.sequenceDiagram
actor U as Usuario
participant UI as SwipeScreen
participant VM as SwipeViewModel
participant PS as ProcessSwipeLikeUseCase
participant GC as GetOrCreateDefaultPlaylistUseCase
participant SB as Supabase (user_playlists)
participant SP as Spotify Web API
U->>UI: Swipe derecha
UI->>VM: onSwipe(RIGHT, track)
VM->>PS: handle(track)
PS->>GC: invoke(userId)
GC->>SB: SELECT playlist_id WHERE user_id = ?
alt No existe referencia
GC->>SP: POST /users/{id}/playlists ("SongSwipe Likes")
SP-->>GC: playlistId
GC->>SB: UPSERT (userId, playlistId)
end
GC-->>PS: playlistId (fijo)
PS->>SP: POST /playlists/{id}/tracks
SP-->>PS: 201 Created
PS-->>VM: NetworkResult.Success
VM-->>UI: Feedback visual
Se reemplaza la playlist por defecto por un modelo centrado en las playlists reales del usuario en Spotify, con una playlist activa persistida localmente como destino del swipe.
Cambios clave:
DefaultPlaylistRepository, SupabaseDefaultPlaylistRepository, GetOrCreateDefaultPlaylistUseCase, DeleteDefaultPlaylistUseCase y la tabla user_playlists de Supabase deja de usarse para este flujo.GetUserPlaylistsUseCase y CreatePlaylistUseCase sobre Spotify Web API.GetActivePlaylistUseCase / SetActivePlaylistUseCase sobre ActivePlaylistDataStore (DataStore local).AddItemToPlaylistUseCase y RemoveItemFromPlaylistUseCase reutilizables.ProcessSwipeLikeUseCase refactorizado: recibe playlistId (la activa) y delega en AddItemToPlaylistUseCase con reintentos (hasta 3).PlaylistsScreen (listado), PlaylistDetailsScreen, PlaylistPickerBottomSheet, CreatePlaylistDialog y chip de playlist activa en el TopAppBar del SwipeScreen.sequenceDiagram
actor U as Usuario
participant PL as PlaylistsScreen
participant PLVM as PlaylistListViewModel
participant GUP as GetUserPlaylistsUseCase
participant SAP as SetActivePlaylistUseCase
participant DS as ActivePlaylistDataStore
participant UI as SwipeScreen
participant VM as SwipeViewModel
participant PS as ProcessSwipeLikeUseCase
participant AIP as AddItemToPlaylistUseCase
participant SP as Spotify Web API
U->>PL: Abre pestaña Playlists
PL->>PLVM: loadPlaylists()
PLVM->>GUP: invoke()
GUP->>SP: GET /me/playlists
SP-->>GUP: List<Playlist>
GUP-->>PLVM: NetworkResult.Success
PLVM-->>PL: renderiza lista
U->>PL: Selecciona playlist activa
PL->>SAP: invoke(playlistId, name)
SAP->>DS: saveActivePlaylist(id, name)
U->>UI: Swipe derecha
UI->>VM: onSwipe(RIGHT, track)
VM->>DS: getActivePlaylistIdSync()
DS-->>VM: playlistId
VM->>PS: handle(playlistId, trackId)
loop hasta 3 intentos
PS->>AIP: invoke(playlistId, trackId)
AIP->>SP: POST /playlists/{id}/tracks
SP-->>AIP: 201 / error
AIP-->>PS: NetworkResult
end
PS-->>VM: NetworkResult.Success
VM-->>UI: Feedback visual