summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/service/media.go10
-rw-r--r--internal/service/mock.go10
-rw-r--r--internal/service/service.go40
3 files changed, 55 insertions, 5 deletions
diff --git a/internal/service/media.go b/internal/service/media.go
index 064d193..064178a 100644
--- a/internal/service/media.go
+++ b/internal/service/media.go
@@ -20,6 +20,16 @@ import (
"codeberg.org/snonux/player/internal/thumb"
)
+var (
+ _ MediaBrowseService = (*mediaService)(nil)
+ _ MediaWriteService = (*mediaService)(nil)
+ _ MediaShareService = (*mediaService)(nil)
+ _ MediaTagService = (*mediaService)(nil)
+ _ MediaFavoriteService = (*mediaService)(nil)
+ _ MediaNoteService = (*mediaService)(nil)
+ _ MediaService = (*mediaService)(nil)
+)
+
// mediaService is the concrete implementation of MediaService.
type mediaService struct {
store repository.MediaServiceStore
diff --git a/internal/service/mock.go b/internal/service/mock.go
index 3788152..f174a62 100644
--- a/internal/service/mock.go
+++ b/internal/service/mock.go
@@ -10,6 +10,16 @@ import (
"codeberg.org/snonux/player/internal/repository"
)
+var (
+ _ MediaBrowseService = (*MockMediaService)(nil)
+ _ MediaWriteService = (*MockMediaService)(nil)
+ _ MediaShareService = (*MockMediaService)(nil)
+ _ MediaTagService = (*MockMediaService)(nil)
+ _ MediaFavoriteService = (*MockMediaService)(nil)
+ _ MediaNoteService = (*MockMediaService)(nil)
+ _ MediaService = (*MockMediaService)(nil)
+)
+
// MockMediaService is a fake MediaService for testing.
type MockMediaService struct {
ListSetsFunc func(ctx context.Context, userID int64) ([]model.Set, error)
diff --git a/internal/service/service.go b/internal/service/service.go
index 9599a86..3a14626 100644
--- a/internal/service/service.go
+++ b/internal/service/service.go
@@ -10,8 +10,8 @@ import (
"codeberg.org/snonux/player/internal/repository"
)
-// MediaService handles media and set operations.
-type MediaService interface {
+// MediaBrowseService handles read-only browsing and media streaming operations.
+type MediaBrowseService interface {
ListSets(ctx context.Context, userID int64) ([]model.Set, error)
GetMediaDetail(ctx context.Context, mediaID, userID int64) (*MediaDetail, error)
ListMedia(ctx context.Context, userID int64, filter repository.MediaFilter) ([]model.Media, error)
@@ -20,22 +20,52 @@ type MediaService interface {
GetThumbnail(ctx context.Context, mediaID, userID int64) (*FileResult, error)
RegenerateThumbnail(ctx context.Context, mediaID, userID int64) error
RegenerateSetCover(ctx context.Context, setID, userID int64) error
- ToggleFavorite(ctx context.Context, userID, mediaID int64) (bool, error)
- AssignTag(ctx context.Context, mediaID, userID int64, tagName string) error
- RemoveTag(ctx context.Context, mediaID, userID int64, tagName string) error
+}
+
+// MediaWriteService handles mutations such as upload, soft-delete and restore.
+type MediaWriteService interface {
SoftDeleteMedia(ctx context.Context, mediaID, userID int64) error
RestoreMedia(ctx context.Context, mediaID, userID int64) error
UploadMedia(ctx context.Context, setID, userID int64, filename string, data io.Reader, size int64) (*model.Media, error)
+}
+
+// MediaShareService handles creation, validation and revocation of share links.
+type MediaShareService interface {
CreateShare(ctx context.Context, userID, mediaID int64, expiresAt time.Time) (*model.Share, error)
ListShares(ctx context.Context, mediaID, userID int64) ([]model.Share, error)
RevokeShare(ctx context.Context, token string, userID int64) error
ValidateShareToken(ctx context.Context, token string) (*model.Share, error)
StreamSharedMedia(ctx context.Context, token string) (*FileResult, error)
+}
+
+// MediaTagService handles tagging of media items.
+type MediaTagService interface {
+ AssignTag(ctx context.Context, mediaID, userID int64, tagName string) error
+ RemoveTag(ctx context.Context, mediaID, userID int64, tagName string) error
+}
+
+// MediaFavoriteService handles toggling favorite status.
+type MediaFavoriteService interface {
+ ToggleFavorite(ctx context.Context, userID, mediaID int64) (bool, error)
+}
+
+// MediaNoteService handles CRUD for per-user per-media notes.
+type MediaNoteService interface {
GetNote(ctx context.Context, mediaID, userID int64) (*model.Note, error)
UpsertNote(ctx context.Context, note *model.Note) error
DeleteNote(ctx context.Context, mediaID, userID int64) error
}
+// MediaService is the composite interface combining all media-related roles.
+type MediaService interface {
+ MediaBrowseService
+ MediaWriteService
+ MediaShareService
+ MediaTagService
+ MediaFavoriteService
+ MediaNoteService
+}
+
// AdminService handles admin-only operations.
type AdminService interface {
ListTrash(ctx context.Context) ([]model.Media, error)