Add nested resource playlist/{id}/tracks

This commit is contained in:
Deluan
2020-05-08 23:48:06 -04:00
committed by Deluan Quintão
parent a56e588c8e
commit aebee651ac
4 changed files with 121 additions and 7 deletions
+18 -3
View File
@@ -77,10 +77,20 @@ func (r *playlistRepository) GetAll(options ...model.QueryOptions) (model.Playli
if err != nil {
return nil, err
}
// TODO Maybe the tracks are not required when retrieving all playlists?
err = r.loadAllTracks(res)
return res, err
}
func (r *playlistRepository) Tracks(playlistId string) model.PlaylistTracksRepository {
p := &playlistTracksRepository{}
p.playlistId = playlistId
p.ctx = r.ctx
p.ormer = r.ormer
p.tableName = "playlist_tracks"
return p
}
func (r *playlistRepository) updateTracks(id string, tracks model.MediaFiles) error {
// Remove old tracks
del := Delete("playlist_tracks").Where(Eq{"playlist_id": id})
@@ -128,9 +138,14 @@ func (r *playlistRepository) loadAllTracks(all model.Playlists) error {
}
func (r *playlistRepository) loadTracks(pls *model.Playlist) (err error) {
tracksQuery := Select("media_file.*").From("media_file").
Join("playlist_tracks f on f.media_file_id = media_file.id").
Where(Eq{"f.playlist_id": pls.ID}).OrderBy("f.id")
tracksQuery := Select().From("playlist_tracks").
LeftJoin("annotation on ("+
"annotation.item_id = media_file_id"+
" AND annotation.item_type = 'media_file'"+
" AND annotation.user_id = '"+userId(r.ctx)+"')").
Columns("starred", "starred_at", "play_count", "play_date", "rating", "f.*").
Join("media_file f on f.id = media_file_id").
Where(Eq{"playlist_id": pls.ID}).OrderBy("playlist_tracks.id")
err = r.queryAll(tracksQuery, &pls.Tracks)
if err != nil {
log.Error("Error loading playlist tracks", "playlist", pls.Name, "id", pls.ID)
+56
View File
@@ -0,0 +1,56 @@
package persistence
import (
. "github.com/Masterminds/squirrel"
"github.com/deluan/navidrome/model"
"github.com/deluan/rest"
)
type playlistTracksRepository struct {
sqlRepository
sqlRestful
playlistId string
}
func (r *playlistTracksRepository) Count(options ...rest.QueryOptions) (int64, error) {
return r.count(Select().Where(Eq{"playlist_id": r.playlistId}), r.parseRestOptions(options...))
}
func (r *playlistTracksRepository) Read(id string) (interface{}, error) {
sel := r.newSelect().
LeftJoin("annotation on ("+
"annotation.item_id = media_file_id"+
" AND annotation.item_type = 'media_file'"+
" AND annotation.user_id = '"+userId(r.ctx)+"')").
Columns("starred", "starred_at", "play_count", "play_date", "rating", "f.*", "playlist_tracks.*").
Join("media_file f on f.id = media_file_id").
Where(And{Eq{"playlist_id": r.playlistId}, Eq{"id": id}})
var trk model.PlaylistTracks
err := r.queryOne(sel, &trk)
return &trk, err
}
func (r *playlistTracksRepository) ReadAll(options ...rest.QueryOptions) (interface{}, error) {
sel := r.newSelect(r.parseRestOptions(options...)).
LeftJoin("annotation on ("+
"annotation.item_id = media_file_id"+
" AND annotation.item_type = 'media_file'"+
" AND annotation.user_id = '"+userId(r.ctx)+"')").
Columns("starred", "starred_at", "play_count", "play_date", "rating", "f.*", "playlist_tracks.*").
Join("media_file f on f.id = media_file_id").
Where(Eq{"playlist_id": r.playlistId})
var res []model.PlaylistTracks
err := r.queryAll(sel, &res)
return res, err
}
func (r *playlistTracksRepository) EntityName() string {
return "playlist_tracks"
}
func (r *playlistTracksRepository) NewInstance() interface{} {
return &model.PlaylistTracks{}
}
var _ model.PlaylistTracksRepository = (*playlistTracksRepository)(nil)
var _ model.ResourceRepository = (*playlistTracksRepository)(nil)