Contexto

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:

Flujo anterior (single default playlist)

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

Decisión

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:

Flujo nuevo (user playlists + active playlist)

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

Consecuencias