veza/veza-backend-api/internal/services/interfaces.go
senke 7259526d43
Some checks failed
Backend API CI / test-unit (push) Failing after 2s
Backend API CI / test-integration (push) Failing after 6s
Frontend CI / test (push) Failing after 4s
Storybook Audit / Build & audit Storybook (push) Failing after 3s
feat(v0.10.4): Playlists collaboratives - F136, F140, F141, F143, F145
Backend:
- F141: GET /discover/playlists/editorial for editorial playlists
- F143: GET /playlists/shared/:token (public, no auth)
- F145: POST /playlists/import (JSON), GET /playlists/:id/export/m3u
- F136: GET /playlists/favoris (creates Favoris playlist if needed)
- Repo: GetFavorisByUserID, service GetOrCreateFavorisPlaylist

Frontend:
- SharedPlaylistPage at /playlists/shared/:token (public route)
- Editorial playlists section in DiscoverPage
- Export M3U in ExportPlaylistButton dropdown
- Import JSON via ImportPlaylistButton (PlaylistListPage)
- Favoris sidebar link, FavorisRedirectPage, AddToFavorisButton on tracks

Roadmap: v0.10.4 marked DONE
2026-03-09 16:49:05 +01:00

94 lines
4.9 KiB
Go

package services
import (
"context"
"time"
"veza-backend-api/internal/models"
"github.com/google/uuid"
)
// PlaylistServiceInterface defines the interface for playlist service
// Moved from handlers to avoid cyclic dependency with PlaylistDuplicateService
type PlaylistServiceInterface interface {
CreatePlaylist(ctx context.Context, userID uuid.UUID, title, description string, isPublic bool) (*models.Playlist, error)
GetPlaylists(ctx context.Context, currentUserID *uuid.UUID, filterUserID *uuid.UUID, page, limit int) ([]*models.Playlist, int64, error)
GetPlaylist(ctx context.Context, id uuid.UUID, currentUserID *uuid.UUID) (*models.Playlist, error)
UpdatePlaylist(ctx context.Context, id uuid.UUID, userID uuid.UUID, title, description *string, isPublic *bool) (*models.Playlist, error)
DeletePlaylist(ctx context.Context, id uuid.UUID, userID uuid.UUID) error
AddTrack(ctx context.Context, playlistID, trackID, userID uuid.UUID) error
RemoveTrack(ctx context.Context, playlistID, trackID, userID uuid.UUID) error
ReorderTracks(ctx context.Context, playlistID, userID uuid.UUID, trackIDs []uuid.UUID) error
AddCollaborator(ctx context.Context, playlistID, userID, collaboratorUserID uuid.UUID, permission models.PlaylistPermission) (*models.PlaylistCollaborator, error)
RemoveCollaborator(ctx context.Context, playlistID, userID, collaboratorUserID uuid.UUID) error
UpdateCollaboratorPermission(ctx context.Context, playlistID, userID, collaboratorUserID uuid.UUID, permission models.PlaylistPermission) error
GetCollaborators(ctx context.Context, playlistID, userID uuid.UUID) ([]*models.PlaylistCollaborator, error)
CreateShareLink(ctx context.Context, playlistID, userID uuid.UUID, expiresAt *time.Time) (*models.PlaylistShareLink, error)
GetPlaylistByShareToken(ctx context.Context, token string) (*models.Playlist, error) // v0.10.4 F143
ImportPlaylistWithTracks(ctx context.Context, userID uuid.UUID, title, description string, isPublic bool, trackIDs []uuid.UUID) (*models.Playlist, error) // v0.10.4 F145
GetOrCreateFavorisPlaylist(ctx context.Context, userID uuid.UUID) (*models.Playlist, error) // v0.10.4 F136
FollowPlaylist(ctx context.Context, playlistID, userID uuid.UUID) error
UnfollowPlaylist(ctx context.Context, playlistID, userID uuid.UUID) error
CheckPermission(ctx context.Context, playlistID, userID uuid.UUID, permission models.PlaylistPermission) (bool, error)
SearchPlaylists(ctx context.Context, params SearchPlaylistsParams) ([]*models.Playlist, int64, error)
}
// EmailServiceInterface defines methods for sending emails
type EmailServiceInterface interface {
SendVerificationEmail(email, token string) error
SendVerificationEmailWithUserID(userID uuid.UUID, email string) error
SendPasswordResetEmail(userID uuid.UUID, email string, token string) error
SendWelcomeEmail(email, username string) error
SendNotificationEmail(email, subject, message, notificationType string) error
}
// EmailVerificationServiceInterface defines methods for email verification
type EmailVerificationServiceInterface interface {
GenerateToken() (string, error)
StoreToken(userID uuid.UUID, email, token string) error
VerifyToken(token string) (uuid.UUID, error)
InvalidateOldTokens(userID uuid.UUID) error
ResendVerificationEmail(userID uuid.UUID, email string) error
}
// PasswordResetServiceInterface defines methods for password reset
type PasswordResetServiceInterface interface {
GenerateToken() (string, error)
StoreToken(userID uuid.UUID, token string) error
VerifyToken(token string) (uuid.UUID, error)
MarkTokenAsUsed(token string) error
InvalidateOldTokens(userID uuid.UUID) error
}
// PasswordServiceInterface defines methods for password management
type PasswordServiceInterface interface {
ValidatePassword(password string) error
UpdatePassword(userID uuid.UUID, newPassword string) error
Hash(password string) (string, error)
Compare(hashedPassword, password string) bool
}
// JWTServiceInterface defines methods for JWT management
type JWTServiceInterface interface {
GenerateAccessToken(user *models.User) (string, error)
GenerateRefreshToken(user *models.User) (string, error)
GenerateTokenPair(user *models.User) (*models.TokenPair, error)
ValidateToken(tokenString string) (*models.CustomClaims, error)
ExtractUserID(tokenString string) (uuid.UUID, error)
GetConfig() *models.JWTConfig
}
// RefreshTokenServiceInterface defines methods for refresh token management
type RefreshTokenServiceInterface interface {
Store(userID uuid.UUID, token string, ttl time.Duration) error
Validate(userID uuid.UUID, token string) error
Rotate(userID uuid.UUID, oldToken, newToken string, ttl time.Duration) error
Revoke(userID uuid.UUID, token string) error
RevokeAll(userID uuid.UUID) error
}
// JobWorkerInterface defines methods for background jobs
type JobWorkerInterface interface {
EnqueueEmailJobWithTemplate(to, subject, templateName string, templateData map[string]interface{})
}