package core
import (
"context"
"github.com/deluan/rest"
"github.com/navidrome/navidrome/model"
)
type PluginUnloader interface {
UnloadDisabledPlugins(ctx context.Context)
}
type User interface {
NewRepository(ctx context.Context) rest.Repository
}
type userService struct {
ds model.DataStore
pluginManager PluginUnloader
}
func NewUser(ds model.DataStore, pluginManager PluginUnloader) User {
return &userService{
ds: ds,
pluginManager: pluginManager,
}
}
func (s *userService) NewRepository(ctx context.Context) rest.Repository {
repo := s.ds.User(ctx)
wrapper := &userRepositoryWrapper{
ctx: ctx,
UserRepository: repo,
pluginManager: s.pluginManager,
}
return wrapper
}
type userRepositoryWrapper struct {
model.UserRepository
ctx context.Context
pluginManager PluginUnloader
}
func (r *userRepositoryWrapper) Save(entity any) (string, error) {
return r.UserRepository.(rest.Persistable).Save(entity)
}
func (r *userRepositoryWrapper) Update(id string, entity any, cols ...string) error {
return r.UserRepository.(rest.Persistable).Update(id, entity, cols...)
}
func (r *userRepositoryWrapper) Delete(id string) error {
err := r.UserRepository.(rest.Persistable).Delete(id)
if err != nil {
return err
}
r.pluginManager.UnloadDisabledPlugins(r.ctx)
return nil
}