From 914bd7cd6aa14e839332a98d91c30b19865b0cf2 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 17 May 2026 15:25:52 +0300 Subject: Restructure repo: move Go server into player-server/ --- internal/service/progress.go | 164 ------------------------------------------- 1 file changed, 164 deletions(-) delete mode 100644 internal/service/progress.go (limited to 'internal/service/progress.go') diff --git a/internal/service/progress.go b/internal/service/progress.go deleted file mode 100644 index 4e79aa5..0000000 --- a/internal/service/progress.go +++ /dev/null @@ -1,164 +0,0 @@ -package service - -import ( - "context" - "errors" - "fmt" - - "codeberg.org/snonux/player/internal/clock" - "codeberg.org/snonux/player/internal/model" - "codeberg.org/snonux/player/internal/repository" -) - -// progressService is the concrete implementation of ProgressService. -type progressService struct { - store repository.ProgressServiceStore - helper *accessHelper - clock clock.Clock -} - -// NewProgressService creates a concrete ProgressService. -func NewProgressService(store repository.ProgressServiceStore, clk clock.Clock) *progressService { - return &progressService{ - store: store, - helper: NewAccessHelper(store), - clock: clk, - } -} - -func (s *progressService) UpdateProgress(ctx context.Context, sessionID string, userID, mediaID int64, position float64) error { - if sessionID == "" { - return errors.New("session_id required") - } - if mediaID == 0 { - return errors.New("media_id required") - } - - now := s.clock.Now() - - if err := s.store.UpsertProgress(ctx, &model.PlaybackProgress{ - UserID: userID, - MediaID: mediaID, - PositionSeconds: position, - UpdatedAt: now, - }); err != nil { - return fmt.Errorf("upsert progress: %w", err) - } - - acc, err := s.store.GetAccumulator(ctx, sessionID, mediaID) - if err != nil { - return fmt.Errorf("get accumulator: %w", err) - } - if acc == nil { - acc = &model.PlaybackAccumulator{ - SessionID: sessionID, - MediaID: mediaID, - LastPosition: 0, - AccumulatedSeconds: 0, - Counted: false, - UpdatedAt: now, - } - } - - delta := position - acc.LastPosition - if delta < 0 { - delta = 0 - } - if delta > 12 { - delta = 12 - } - acc.AccumulatedSeconds += delta - acc.LastPosition = position - acc.UpdatedAt = now - - if acc.AccumulatedSeconds >= 60 && !acc.Counted { - if err := s.store.IncrementPlayCount(ctx, mediaID); err != nil { - return fmt.Errorf("increment play count: %w", err) - } - acc.Counted = true - } - - if err := s.store.UpsertAccumulator(ctx, acc); err != nil { - return fmt.Errorf("upsert accumulator: %w", err) - } - - return nil -} - -func (s *progressService) MarkFinished(ctx context.Context, userID, mediaID int64) error { - if mediaID == 0 { - return errors.New("media_id required") - } - - media, err := s.helper.verifyAccess(ctx, mediaID, userID) - if err != nil { - return err - } - - if err := s.store.UpsertProgress(ctx, &model.PlaybackProgress{ - UserID: userID, - MediaID: mediaID, - PositionSeconds: media.Duration, - Finished: true, - UpdatedAt: s.clock.Now(), - }); err != nil { - return fmt.Errorf("mark finished: %w", err) - } - - return nil -} - -func (s *progressService) MarkNotStarted(ctx context.Context, userID, mediaID int64) error { - if mediaID == 0 { - return errors.New("media_id required") - } - - if _, err := s.helper.verifyAccess(ctx, mediaID, userID); err != nil { - return err - } - - if err := s.store.DeleteProgress(ctx, userID, mediaID); err != nil { - return fmt.Errorf("delete progress: %w", err) - } - if err := s.store.DeleteAccumulatorByMedia(ctx, mediaID); err != nil { - return fmt.Errorf("delete accumulator: %w", err) - } - - return nil -} - -func (s *progressService) ListInProgress(ctx context.Context, userID int64) ([]model.Media, error) { - allowed, err := s.helper.allowedSetIDs(ctx, userID) - if err != nil { - return nil, err - } - if allowed != nil && len(allowed) == 0 { - return []model.Media{}, nil - } - - return s.store.ListInProgressMedia(ctx, userID, repository.MediaFilter{ - AllowedSetIDs: allowed, - }) -} - -func (h *accessHelper) allowedSetIDs(ctx context.Context, userID int64) ([]int64, error) { - user, err := h.store.GetUserByID(ctx, userID) - if err != nil { - return nil, fmt.Errorf("get user: %w", err) - } - if user != nil && user.IsAdmin { - return nil, nil - } - - perms, err := h.store.ListPermissionsByUser(ctx, userID) - if err != nil { - return nil, fmt.Errorf("list permissions: %w", err) - } - - allowed := make([]int64, 0, len(perms)) - for _, p := range perms { - allowed = append(allowed, p.SetID) - } - - return allowed, nil -} -- cgit v1.2.3