quintodrome/persistence/genre_repository.go

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

97 lines
2.3 KiB
Go
Raw Normal View History

2020-01-15 13:49:09 -09:00
package persistence
import (
"context"
2020-01-15 13:49:09 -09:00
"github.com/navidrome/navidrome/log"
"github.com/deluan/rest"
. "github.com/Masterminds/squirrel"
2020-01-15 13:49:09 -09:00
"github.com/astaxie/beego/orm"
2020-01-23 15:44:08 -09:00
"github.com/navidrome/navidrome/model"
2020-01-15 13:49:09 -09:00
)
type genreRepository struct {
sqlRepository
sqlRestful
}
2020-01-15 13:49:09 -09:00
func NewGenreRepository(ctx context.Context, o orm.Ormer) model.GenreRepository {
r := &genreRepository{}
r.ctx = ctx
r.ormer = o
r.tableName = "genre"
2021-07-16 15:41:49 -08:00
r.filterMappings = map[string]filterFunc{
"name": containsFilter,
}
return r
2020-01-15 13:49:09 -09:00
}
func (r *genreRepository) GetAll() (model.Genres, error) {
2021-07-16 07:03:28 -08:00
sq := Select("*",
2021-07-16 13:15:34 -08:00
"count(distinct a.album_id) as album_count",
2021-07-16 07:03:28 -08:00
"count(distinct f.media_file_id) as song_count").
From(r.tableName).
2021-07-16 13:15:34 -08:00
LeftJoin("album_genres a on a.genre_id = genre.id").
2021-07-16 07:03:28 -08:00
LeftJoin("media_file_genres f on f.genre_id = genre.id").
GroupBy("genre.id")
2020-01-31 12:47:13 -09:00
res := model.Genres{}
err := r.queryAll(sq, &res)
return res, err
2020-01-15 13:49:09 -09:00
}
func (r *genreRepository) Put(m *model.Genre) error {
2021-07-16 07:03:28 -08:00
id, err := r.put(m.ID, m)
m.ID = id
return err
}
func (r *genreRepository) Count(options ...rest.QueryOptions) (int64, error) {
return r.count(Select(), r.parseRestOptions(options...))
}
func (r *genreRepository) Read(id string) (interface{}, error) {
sel := r.newSelect().Columns("*").Where(Eq{"id": id})
var res model.Genre
err := r.queryOne(sel, &res)
return &res, err
}
func (r *genreRepository) ReadAll(options ...rest.QueryOptions) (interface{}, error) {
sel := r.newSelect(r.parseRestOptions(options...)).Columns("*")
res := model.Genres{}
err := r.queryAll(sel, &res)
return res, err
}
func (r *genreRepository) EntityName() string {
return r.tableName
}
func (r *genreRepository) NewInstance() interface{} {
return &model.Genre{}
}
func (r *genreRepository) purgeEmpty() error {
del := Delete(r.tableName).Where(`id in (
select genre.id from genre
left join album_genres ag on genre.id = ag.genre_id
left join artist_genres a on genre.id = a.genre_id
left join media_file_genres mfg on genre.id = mfg.genre_id
where ag.genre_id is null
and a.genre_id is null
and mfg.genre_id is null
)`)
c, err := r.executeSQL(del)
if err == nil {
if c > 0 {
log.Debug(r.ctx, "Purged unused genres", "totalDeleted", c)
}
}
return err
}
var _ model.GenreRepository = (*genreRepository)(nil)
var _ model.ResourceRepository = (*genreRepository)(nil)