diff --git a/model/playlist.go b/model/playlist.go index d5d8b6717..cc4ef1569 100644 --- a/model/playlist.go +++ b/model/playlist.go @@ -15,7 +15,7 @@ type Playlist struct { } type PlaylistRepository interface { - CountAll() (int64, error) + CountAll(options ...QueryOptions) (int64, error) Exists(id string) (bool, error) Put(pls *Playlist) error Get(id string) (*Playlist, error) diff --git a/persistence/persistence.go b/persistence/persistence.go index a37fda7b9..11987aae7 100644 --- a/persistence/persistence.go +++ b/persistence/persistence.go @@ -72,6 +72,8 @@ func (s *SQLStore) Resource(ctx context.Context, m interface{}) model.ResourceRe return s.Album(ctx).(model.ResourceRepository) case model.MediaFile: return s.MediaFile(ctx).(model.ResourceRepository) + case model.Playlist: + return s.Playlist(ctx).(model.ResourceRepository) } log.Error("Resource not implemented", "model", reflect.TypeOf(m).Name()) return nil diff --git a/persistence/playlist_repository.go b/persistence/playlist_repository.go index c35d4726a..8f226930c 100644 --- a/persistence/playlist_repository.go +++ b/persistence/playlist_repository.go @@ -9,6 +9,7 @@ import ( "github.com/astaxie/beego/orm" "github.com/deluan/navidrome/log" "github.com/deluan/navidrome/model" + "github.com/deluan/rest" ) type playlist struct { @@ -25,6 +26,7 @@ type playlist struct { type playlistRepository struct { sqlRepository + sqlRestful } func NewPlaylistRepository(ctx context.Context, o orm.Ormer) model.PlaylistRepository { @@ -35,8 +37,8 @@ func NewPlaylistRepository(ctx context.Context, o orm.Ormer) model.PlaylistRepos return r } -func (r *playlistRepository) CountAll() (int64, error) { - return r.count(Select()) +func (r *playlistRepository) CountAll(options ...model.QueryOptions) (int64, error) { + return r.count(Select(), options...) } func (r *playlistRepository) Exists(id string) (bool, error) { @@ -112,6 +114,7 @@ func (r *playlistRepository) fromModel(p *model.Playlist) playlist { CreatedAt: p.CreatedAt, UpdatedAt: p.UpdatedAt, } + // TODO Update duration with a SQL query, instead of loading all tracks p.Tracks = r.loadTracks(p) var newTracks []string for _, t := range p.Tracks { @@ -168,4 +171,25 @@ func (r *playlistRepository) loadTracks(p *model.Playlist) model.MediaFiles { return newTracks } +func (r *playlistRepository) Count(options ...rest.QueryOptions) (int64, error) { + return r.CountAll(r.parseRestOptions(options...)) +} + +func (r *playlistRepository) Read(id string) (interface{}, error) { + return r.Get(id) +} + +func (r *playlistRepository) ReadAll(options ...rest.QueryOptions) (interface{}, error) { + return r.GetAll(r.parseRestOptions(options...)) +} + +func (r *playlistRepository) EntityName() string { + return "playlist" +} + +func (r *playlistRepository) NewInstance() interface{} { + return &model.Playlist{} +} + var _ model.PlaylistRepository = (*playlistRepository)(nil) +var _ model.ResourceRepository = (*playlistRepository)(nil) diff --git a/server/app/app.go b/server/app/app.go index e4892565a..5945649e2 100644 --- a/server/app/app.go +++ b/server/app/app.go @@ -47,6 +47,7 @@ func (app *Router) routes(path string) http.Handler { app.R(r, "/album", model.Album{}, true) app.R(r, "/artist", model.Artist{}, true) app.R(r, "/player", model.Player{}, true) + app.R(r, "/playlist", model.Playlist{}, true) app.R(r, "/transcoding", model.Transcoding{}, conf.Server.EnableTranscodingConfig) app.addResource(r, "/translation", newTranslationRepository, false)