diff options
| -rw-r--r-- | internal/service/media.go | 10 | ||||
| -rw-r--r-- | internal/service/mock.go | 10 | ||||
| -rw-r--r-- | internal/service/service.go | 40 |
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) |
