package jellyfin
import (
"context"
"net/http"
"strconv"
"github.com/Masterminds/squirrel"
"github.com/go-chi/chi/v5"
"github.com/navidrome/navidrome/model/request"
"github.com/navidrome/navidrome/server/jellyfin/dto"
"github.com/navidrome/navidrome/utils/req"
)
func accessibleLibraryIDs(ctx context.Context) []int {
u, _ := request.UserFrom(ctx)
return u.Libraries.IDs()
}
func resolveLibraryScope(ctx context.Context, parentId string) (scopeIDs []int, isLibraryParent bool) {
if parentId != "" {
if id, err := strconv.Atoi(parentId); err == nil {
if u, _ := request.UserFrom(ctx); u.HasLibraryAccess(id) {
return []int{id}, true
}
}
}
return accessibleLibraryIDs(ctx), false
}
func decodeFilterParam(raw string) (id string, ok bool) {
if raw == "" {
return "", true
}
return dto.DecodeID(raw)
}
func itemIDParam(w http.ResponseWriter, r *http.Request, key string) (string, bool) {
id, ok := dto.DecodeID(chi.URLParam(r, key))
if !ok {
http.Error(w, "Not Found", http.StatusNotFound)
return "", false
}
return id, true
}
func parentIDScope(ctx context.Context, r *http.Request) (scopeIDs []int, isLibraryParent bool, ok bool) {
parentId, ok := decodeFilterParam(req.Params(r).StringOr("parentid", ""))
if !ok {
return nil, false, false
}
scopeIDs, isLibraryParent = resolveLibraryScope(ctx, parentId)
return scopeIDs, isLibraryParent, true
}
func libraryScopeFilter(scope []int) squirrel.Sqlizer {
if len(scope) == 0 {
return nil
}
return squirrel.Eq{"library_tag.library_id": scope}
}