// Code generated by sqlc. DO NOT EDIT. // versions: // sqlc v1.31.1 // source: system_playlist_rotation.sql package dbq import ( "context" "github.com/jackc/pgx/v5/pgtype" ) const appendRotationPlayed = `-- name: AppendRotationPlayed :exec INSERT INTO system_playlist_rotation_state ( user_id, playlist_kind, played_track_ids, rotation_started_at, updated_at ) VALUES ( $1, $2, array_append('{}'::uuid[], $3::uuid), now(), now() ) ON CONFLICT (user_id, playlist_kind) DO UPDATE SET played_track_ids = CASE WHEN $3::uuid = ANY(system_playlist_rotation_state.played_track_ids) THEN system_playlist_rotation_state.played_track_ids ELSE array_append(system_playlist_rotation_state.played_track_ids, $3::uuid) END, updated_at = now() ` type AppendRotationPlayedParams struct { UserID pgtype.UUID PlaylistKind string TrackID pgtype.UUID } // Rotation state for system-playlist sample-history dedup (#415). // One row per (user, playlist_kind). played_track_ids accumulates // tracks heard from that playlist in the current rotation; shuffle // prefers ids NOT in this set, then resets when the snapshot is // exhausted. // Records that the given track was played from the (user, kind) // system playlist. Creates the row on first play; on conflict // appends only if not already present so the array stays a set. func (q *Queries) AppendRotationPlayed(ctx context.Context, arg AppendRotationPlayedParams) error { _, err := q.db.Exec(ctx, appendRotationPlayed, arg.UserID, arg.PlaylistKind, arg.TrackID) return err } const getRotationState = `-- name: GetRotationState :one SELECT user_id, playlist_kind, played_track_ids, rotation_started_at, updated_at FROM system_playlist_rotation_state WHERE user_id = $1 AND playlist_kind = $2 ` type GetRotationStateParams struct { UserID pgtype.UUID PlaylistKind string } func (q *Queries) GetRotationState(ctx context.Context, arg GetRotationStateParams) (SystemPlaylistRotationState, error) { row := q.db.QueryRow(ctx, getRotationState, arg.UserID, arg.PlaylistKind) var i SystemPlaylistRotationState err := row.Scan( &i.UserID, &i.PlaylistKind, &i.PlayedTrackIds, &i.RotationStartedAt, &i.UpdatedAt, ) return i, err } const resetRotationState = `-- name: ResetRotationState :exec UPDATE system_playlist_rotation_state SET played_track_ids = '{}', rotation_started_at = now(), updated_at = now() WHERE user_id = $1 AND playlist_kind = $2 ` type ResetRotationStateParams struct { UserID pgtype.UUID PlaylistKind string } // Clears the played set and advances the rotation window. Called // when the playlist snapshot has been fully sampled (Stage 2). func (q *Queries) ResetRotationState(ctx context.Context, arg ResetRotationStateParams) error { _, err := q.db.Exec(ctx, resetRotationState, arg.UserID, arg.PlaylistKind) return err }