feat(playevents): post-commit MaybeEnqueue in RecordPlayEnded + Synthetic
This commit is contained in:
@@ -21,6 +21,7 @@ import (
|
||||
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
|
||||
"git.fabledsword.com/bvandeusen/minstrel/internal/playsessions"
|
||||
"git.fabledsword.com/bvandeusen/minstrel/internal/recommendation"
|
||||
"git.fabledsword.com/bvandeusen/minstrel/internal/scrobble"
|
||||
)
|
||||
|
||||
type Writer struct {
|
||||
@@ -109,7 +110,7 @@ func (w *Writer) RecordPlayEnded(
|
||||
durationPlayedMs int32,
|
||||
at time.Time,
|
||||
) error {
|
||||
return pgx.BeginFunc(ctx, w.pool, func(tx pgx.Tx) error {
|
||||
if err := pgx.BeginFunc(ctx, w.pool, func(tx pgx.Tx) error {
|
||||
q := dbq.New(tx)
|
||||
ev, err := q.GetPlayEventByID(ctx, playEventID)
|
||||
if err != nil {
|
||||
@@ -147,7 +148,16 @@ func (w *Writer) RecordPlayEnded(
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
// Post-commit best-effort scrobble enqueue. Errors logged + swallowed:
|
||||
// scrobble delivery is enrichment, not a precondition for canonical play
|
||||
// history.
|
||||
if err := scrobble.MaybeEnqueue(ctx, dbq.New(w.pool), playEventID); err != nil {
|
||||
w.logger.Warn("playevents: scrobble enqueue failed", "play_event_id", playEventID, "err", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// RecordPlaySkipped is the user-initiated-skip variant: was_skipped is forced
|
||||
@@ -203,7 +213,8 @@ func (w *Writer) RecordSyntheticCompletedPlay(
|
||||
clientID string,
|
||||
at time.Time,
|
||||
) error {
|
||||
return pgx.BeginFunc(ctx, w.pool, func(tx pgx.Tx) error {
|
||||
var playEventID pgtype.UUID
|
||||
if err := pgx.BeginFunc(ctx, w.pool, func(tx pgx.Tx) error {
|
||||
q := dbq.New(tx)
|
||||
track, err := q.GetTrackByID(ctx, trackID)
|
||||
if err != nil {
|
||||
@@ -230,6 +241,7 @@ func (w *Writer) RecordSyntheticCompletedPlay(
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
playEventID = ev.ID
|
||||
if err := w.captureSessionVector(ctx, q, ev.ID, sessionID, at); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -243,7 +255,16 @@ func (w *Writer) RecordSyntheticCompletedPlay(
|
||||
WasSkipped: false,
|
||||
})
|
||||
return err
|
||||
})
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
// Post-commit best-effort scrobble enqueue. Errors logged + swallowed:
|
||||
// scrobble delivery is enrichment, not a precondition for canonical play
|
||||
// history.
|
||||
if err := scrobble.MaybeEnqueue(ctx, dbq.New(w.pool), playEventID); err != nil {
|
||||
w.logger.Warn("playevents: scrobble enqueue failed", "play_event_id", playEventID, "err", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// captureSessionVector queries the user's prior plays in the given session
|
||||
|
||||
Reference in New Issue
Block a user