🏡 index : quine-global/quintodrome.git

package core

import (
	"context"

	"github.com/deluan/rest"
	"github.com/navidrome/navidrome/model"
)

// PluginUnloader defines the interface for unloading disabled plugins.
// This is satisfied by plugins.Manager but defined here to avoid import cycles.
type PluginUnloader interface {
	UnloadDisabledPlugins(ctx context.Context)
}

// User provides business logic for user management with plugin coordination.
type User interface {
	Repository() rest.Repository[model.User]
}

type userService struct {
	repo *userRepositoryWrapper
}

// NewUser creates a new User service
func NewUser(ds model.DataStore, pluginManager PluginUnloader) User {
	return &userService{
		repo: &userRepositoryWrapper{
			UserRepository: ds.User(),
			pluginManager:  pluginManager,
		},
	}
}

// Repository returns a REST repository wrapper for user operations.
// The wrapper intercepts Delete operations to coordinate plugin unloading.
func (s *userService) Repository() rest.Repository[model.User] {
	return s.repo
}

type userRepositoryWrapper struct {
	model.UserRepository
	pluginManager PluginUnloader
}

var _ rest.Persistable[model.User] = (*userRepositoryWrapper)(nil)

// Delete unloads plugins even on error: a bulk delete can fail after earlier users were removed
// and their plugins auto-disabled.
func (r *userRepositoryWrapper) Delete(ctx context.Context, ids ...string) error {
	err := r.UserRepository.Delete(ctx, ids...)
	r.pluginManager.UnloadDisabledPlugins(ctx)
	return err
}