backend-ci.yml's `test -z "$(gofmt -l .)"` strict gate (added in
13c21ac11) failed on a backlog of unformatted files. None of the
85 files in this commit had been edited since the gate was added
because no push touched veza-backend-api/** in between, so the
gate never fired until today's CI fixes triggered it.
The diff is exclusively whitespace alignment in struct literals
and trailing-space comments. `go build ./...` and the full test
suite (with VEZA_SKIP_INTEGRATION=1 -short) pass identically.
94 lines
5 KiB
Go
94 lines
5 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{})
|
|
}
|