// Package service — library / media bookkeeping. package service import ( "go.uber.org/zap" "golang.org/x/sync/singleflight" "github.com/truewhile/MeBox/internal/config" "github.com/truewhile/MeBox/internal/model" "github.com/truewhile/MeBox/internal/repository" ) // MediaService offers high-level CRUD over libraries and media items. type MediaService struct { cfg *config.Config log *zap.Logger repo *repository.Container cache *RuntimeCacheService groupedMediaFlight singleflight.Group libraryRowsFlight singleflight.Group } type MediaVisibility struct { IncludeNSFW bool AllowedLibraryIDs []string HiddenLibraryIDs []string } const maxMediaSearchLimit = 50000 const maxMediaSearchPageSize = 2000 func (v MediaVisibility) Allows(media *model.Media) bool { if media == nil { return false } if !v.IncludeNSFW && media.NSFW { return false } for _, id := range v.HiddenLibraryIDs { if id == media.LibraryID { return false } } if len(v.AllowedLibraryIDs) == 0 { return true } for _, id := range v.AllowedLibraryIDs { if id == media.LibraryID { return true } } return false } // NewMediaService is the constructor. func NewMediaService(cfg *config.Config, log *zap.Logger, repo *repository.Container) *MediaService { return &MediaService{cfg: cfg, log: log, repo: repo} } func (s *MediaService) SetRuntimeCache(cache *RuntimeCacheService) *MediaService { if s != nil { s.cache = cache } return s }