diff --git a/usecase/session_timer.go b/usecase/session_timer.go index 78209373..1e27da07 100644 --- a/usecase/session_timer.go +++ b/usecase/session_timer.go @@ -167,7 +167,7 @@ func (s *SessionTimerUseCase) handleTrackEnd(ctx context.Context, sessionID stri return false, nil } -// handleTrackEnd はある一曲の再生が終わったときの処理を行います。 +// handleNext は曲がスキップされたときの処理を行います。 func (s *SessionTimerUseCase) handleNext(ctx context.Context, sessionID string) (bool, error) { triggerAfterTrackEndResponse, err := s.sessionRepo.DoInTx(ctx, s.handleNextTx(sessionID)) if v, ok := triggerAfterTrackEndResponse.(*handleTrackEndResponse); ok { @@ -204,18 +204,8 @@ func (s *SessionTimerUseCase) handleTrackEndTx(sessionID string) func(ctx contex } }() - // 曲の再生中にArchivedになった場合 if sess.StateType == entity.Archived { - - s.pusher.Push(&event.PushMessage{ - SessionID: sess.ID, - Msg: entity.EventArchived, - }) - - return &handleTrackEndResponse{ - nextTrack: false, - err: nil, - }, nil + return s.handleArchiveInTransaction(sessionID) } if err := sess.GoNextTrack(); err != nil && errors.Is(err, entity.ErrSessionAllTracksFinished) { @@ -226,20 +216,9 @@ func (s *SessionTimerUseCase) handleTrackEndTx(sessionID string) func(ctx contex }, nil } - track := sess.TrackURIShouldBeAddedWhenHandleTrackEnd() - if track != "" { - if err := s.playerCli.Enqueue(ctx, track, sess.DeviceID); err != nil { - s.handleInterrupt(sess) - if err := s.sessionRepo.Update(ctx, sess); err != nil { - logger.Errorj(map[string]interface{}{ - "message": "handleWaitTimerExpired: failed to update session after Enqueue and handleInterrupt", - "sessionID": sessionID, - "error": err.Error(), - }) - return &handleTrackEndResponse{err: err}, fmt.Errorf("failed to enqueue track") - } - return &handleTrackEndResponse{nextTrack: false, err: nil}, nil - } + res, err := s.enqueueTrackInTransaction(ctx, sess) + if res != nil { + return res, err } logger.Debugj(map[string]interface{}{"message": "next track", "sessionID": sess.ID, "queueHead": sess.QueueHead}) @@ -248,7 +227,7 @@ func (s *SessionTimerUseCase) handleTrackEndTx(sessionID string) func(ctx contex } } -// handleTrackEndTx はINTERRUPTになってerrorを帰す場合もトランザクションをコミットして欲しいので、 +// handleNextTx はINTERRUPTになってerrorを帰す場合もトランザクションをコミットして欲しいので、 // アプリケーションエラーはhandleTrackEndResponseのフィールドで返すようにしてerrorの返り値はnilにしている func (s *SessionTimerUseCase) handleNextTx(sessionID string) func(ctx context.Context) (interface{}, error) { logger := log.New() @@ -272,18 +251,8 @@ func (s *SessionTimerUseCase) handleNextTx(sessionID string) func(ctx context.Co return &handleTrackEndResponse{nextTrack: false}, fmt.Errorf("GoNextTrack: %w", err) } - // 曲の再生中にArchivedになった場合 if sess.StateType == entity.Archived { - - s.pusher.Push(&event.PushMessage{ - SessionID: sess.ID, - Msg: entity.EventArchived, - }) - - return &handleTrackEndResponse{ - nextTrack: false, - err: nil, - }, nil + return s.handleArchiveInTransaction(sessionID) } if err := sess.GoNextTrack(); err != nil && errors.Is(err, entity.ErrSessionAllTracksFinished) { @@ -294,20 +263,9 @@ func (s *SessionTimerUseCase) handleNextTx(sessionID string) func(ctx context.Co }, nil } - track := sess.TrackURIShouldBeAddedWhenHandleTrackEnd() - if track != "" { - if err := s.playerCli.Enqueue(ctx, track, sess.DeviceID); err != nil { - s.handleInterrupt(sess) - if err := s.sessionRepo.Update(ctx, sess); err != nil { - logger.Errorj(map[string]interface{}{ - "message": "handleWaitTimerExpired: failed to update session after Enqueue and handleInterrupt", - "sessionID": sessionID, - "error": err.Error(), - }) - return &handleTrackEndResponse{err: err}, fmt.Errorf("failed to enqueue track") - } - return &handleTrackEndResponse{nextTrack: false, err: nil}, nil - } + res, err := s.enqueueTrackInTransaction(ctx, sess) + if res != nil { + return res, err } logger.Debugj(map[string]interface{}{"message": "next track", "sessionID": sess.ID, "queueHead": sess.QueueHead}) @@ -316,6 +274,39 @@ func (s *SessionTimerUseCase) handleNextTx(sessionID string) func(ctx context.Co } } +func (s *SessionTimerUseCase) handleArchiveInTransaction(sessionID string) (*handleTrackEndResponse, error) { + s.pusher.Push(&event.PushMessage{ + SessionID: sessionID, + Msg: entity.EventArchived, + }) + + return &handleTrackEndResponse{ + nextTrack: false, + err: nil, + }, nil +} + +func (s *SessionTimerUseCase) enqueueTrackInTransaction(ctx context.Context, sess *entity.Session) (*handleTrackEndResponse, error) { + logger := log.New() + + track := sess.TrackURIShouldBeAddedWhenHandleTrackEnd() + if track != "" { + if err := s.playerCli.Enqueue(ctx, track, sess.DeviceID); err != nil { + s.handleInterrupt(sess) + if err := s.sessionRepo.Update(ctx, sess); err != nil { + logger.Errorj(map[string]interface{}{ + "message": "handleWaitTimerExpired: failed to update session after Enqueue and handleInterrupt", + "sessionID": sess.ID, + "error": err.Error(), + }) + return &handleTrackEndResponse{err: err}, fmt.Errorf("failed to enqueue track") + } + return &handleTrackEndResponse{nextTrack: false, err: nil}, nil + } + } + return nil, nil +} + // handleAllTrackFinish はキューの全ての曲の再生が終わったときの処理を行います。 func (s *SessionTimerUseCase) handleAllTrackFinish(sess *entity.Session) { logger := log.New()