mirror of
https://github.com/navidrome/navidrome.git
synced 2025-06-06 10:23:21 +03:00
feat: allow regular users to change their players' configuration
This commit is contained in:
parent
c8b0d2bfae
commit
68a49befc8
@ -40,16 +40,28 @@ func (r *playerRepository) FindByName(client, userName string) (*model.Player, e
|
|||||||
return &res, err
|
return &res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *playerRepository) newRestSelect(options ...model.QueryOptions) SelectBuilder {
|
||||||
|
s := r.newSelect(options...)
|
||||||
|
u := loggedUser(r.ctx)
|
||||||
|
if u.IsAdmin {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
return s.Where(Eq{"user_name": u.UserName})
|
||||||
|
}
|
||||||
|
|
||||||
func (r *playerRepository) Count(options ...rest.QueryOptions) (int64, error) {
|
func (r *playerRepository) Count(options ...rest.QueryOptions) (int64, error) {
|
||||||
return r.count(Select(), r.parseRestOptions(options...))
|
return r.count(r.newRestSelect(), r.parseRestOptions(options...))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *playerRepository) Read(id string) (interface{}, error) {
|
func (r *playerRepository) Read(id string) (interface{}, error) {
|
||||||
return r.Get(id)
|
sel := r.newRestSelect().Columns("*").Where(Eq{"id": id})
|
||||||
|
var res model.Player
|
||||||
|
err := r.queryOne(sel, &res)
|
||||||
|
return &res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *playerRepository) ReadAll(options ...rest.QueryOptions) (interface{}, error) {
|
func (r *playerRepository) ReadAll(options ...rest.QueryOptions) (interface{}, error) {
|
||||||
sel := r.newSelect(r.parseRestOptions(options...)).Columns("*")
|
sel := r.newRestSelect(r.parseRestOptions(options...)).Columns("*")
|
||||||
res := model.Players{}
|
res := model.Players{}
|
||||||
err := r.queryAll(sel, &res)
|
err := r.queryAll(sel, &res)
|
||||||
return res, err
|
return res, err
|
||||||
@ -63,8 +75,16 @@ func (r *playerRepository) NewInstance() interface{} {
|
|||||||
return &model.Player{}
|
return &model.Player{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *playerRepository) isPermitted(p *model.Player) bool {
|
||||||
|
u := loggedUser(r.ctx)
|
||||||
|
return u.IsAdmin || p.UserName == u.UserName
|
||||||
|
}
|
||||||
|
|
||||||
func (r *playerRepository) Save(entity interface{}) (string, error) {
|
func (r *playerRepository) Save(entity interface{}) (string, error) {
|
||||||
t := entity.(*model.Player)
|
t := entity.(*model.Player)
|
||||||
|
if !r.isPermitted(t) {
|
||||||
|
return "", rest.ErrPermissionDenied
|
||||||
|
}
|
||||||
id, err := r.put(t.ID, t)
|
id, err := r.put(t.ID, t)
|
||||||
if err == model.ErrNotFound {
|
if err == model.ErrNotFound {
|
||||||
return "", rest.ErrNotFound
|
return "", rest.ErrNotFound
|
||||||
@ -74,6 +94,9 @@ func (r *playerRepository) Save(entity interface{}) (string, error) {
|
|||||||
|
|
||||||
func (r *playerRepository) Update(entity interface{}, cols ...string) error {
|
func (r *playerRepository) Update(entity interface{}, cols ...string) error {
|
||||||
t := entity.(*model.Player)
|
t := entity.(*model.Player)
|
||||||
|
if !r.isPermitted(t) {
|
||||||
|
return rest.ErrPermissionDenied
|
||||||
|
}
|
||||||
_, err := r.put(t.ID, t)
|
_, err := r.put(t.ID, t)
|
||||||
if err == model.ErrNotFound {
|
if err == model.ErrNotFound {
|
||||||
return rest.ErrNotFound
|
return rest.ErrNotFound
|
||||||
@ -82,7 +105,7 @@ func (r *playerRepository) Update(entity interface{}, cols ...string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *playerRepository) Delete(id string) error {
|
func (r *playerRepository) Delete(id string) error {
|
||||||
err := r.delete(Eq{"id": id})
|
err := r.delete(And{Eq{"id": id}, Eq{"user_name": loggedUser(r.ctx).UserName}})
|
||||||
if err == model.ErrNotFound {
|
if err == model.ErrNotFound {
|
||||||
return rest.ErrNotFound
|
return rest.ErrNotFound
|
||||||
}
|
}
|
||||||
|
@ -49,20 +49,20 @@ const App = () => {
|
|||||||
permissions === 'admin' ? (
|
permissions === 'admin' ? (
|
||||||
<Resource name="user" {...user} options={{ subMenu: 'settings' }} />
|
<Resource name="user" {...user} options={{ subMenu: 'settings' }} />
|
||||||
) : null,
|
) : null,
|
||||||
permissions === 'admin' ? (
|
<Resource
|
||||||
<Resource
|
name="player"
|
||||||
name="player"
|
{...player}
|
||||||
{...player}
|
options={{ subMenu: 'settings' }}
|
||||||
options={{ subMenu: 'settings' }}
|
/>,
|
||||||
/>
|
|
||||||
) : null,
|
|
||||||
permissions === 'admin' ? (
|
permissions === 'admin' ? (
|
||||||
<Resource
|
<Resource
|
||||||
name="transcoding"
|
name="transcoding"
|
||||||
{...transcoding}
|
{...transcoding}
|
||||||
options={{ subMenu: 'settings' }}
|
options={{ subMenu: 'settings' }}
|
||||||
/>
|
/>
|
||||||
) : null,
|
) : (
|
||||||
|
<Resource name="transcoding" />
|
||||||
|
),
|
||||||
<Player />
|
<Player />
|
||||||
]}
|
]}
|
||||||
</Admin>
|
</Admin>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user