// Code generated by sqlc. DO NOT EDIT. // versions: // sqlc v1.31.1 // source: suggestion_snoozes.sql package dbq import ( "context" "github.com/jackc/pgx/v5/pgtype" ) const gcDeleteExpiredSuggestionSnoozes = `-- name: GcDeleteExpiredSuggestionSnoozes :execrows DELETE FROM suggestion_snoozes WHERE snoozed_until < now() ` // Keeps the table from growing without bound. Every read already filters on // snoozed_until > now(), so deleting an expired row changes no behaviour — // this is purely reclamation. func (q *Queries) GcDeleteExpiredSuggestionSnoozes(ctx context.Context) (int64, error) { result, err := q.db.Exec(ctx, gcDeleteExpiredSuggestionSnoozes) if err != nil { return 0, err } return result.RowsAffected(), nil } const listActiveSuggestionSnoozes = `-- name: ListActiveSuggestionSnoozes :many SELECT candidate_mbid, candidate_name, snoozed_until, created_at FROM suggestion_snoozes WHERE user_id = $1 AND snoozed_until > now() ORDER BY snoozed_until, candidate_mbid ` type ListActiveSuggestionSnoozesRow struct { CandidateMbid string CandidateName string SnoozedUntil pgtype.Timestamptz CreatedAt pgtype.Timestamptz } // Backs the manage / un-snooze surface. Expired rows are filtered HERE // rather than left to the sweeper: gc runs on an hourly tick, so a row can // outlive its expiry by up to a tick and must not read as still-snoozed in // the meantime. func (q *Queries) ListActiveSuggestionSnoozes(ctx context.Context, userID pgtype.UUID) ([]ListActiveSuggestionSnoozesRow, error) { rows, err := q.db.Query(ctx, listActiveSuggestionSnoozes, userID) if err != nil { return nil, err } defer rows.Close() var items []ListActiveSuggestionSnoozesRow for rows.Next() { var i ListActiveSuggestionSnoozesRow if err := rows.Scan( &i.CandidateMbid, &i.CandidateName, &i.SnoozedUntil, &i.CreatedAt, ); err != nil { return nil, err } items = append(items, i) } if err := rows.Err(); err != nil { return nil, err } return items, nil } const snoozeSuggestion = `-- name: SnoozeSuggestion :exec INSERT INTO suggestion_snoozes (user_id, candidate_mbid, candidate_name, snoozed_until) VALUES ($1, $2, $3, now() + ($4::float8 * INTERVAL '1 day')) ON CONFLICT (user_id, candidate_mbid) DO UPDATE SET snoozed_until = EXCLUDED.snoozed_until, candidate_name = EXCLUDED.candidate_name ` type SnoozeSuggestionParams struct { UserID pgtype.UUID CandidateMbid string CandidateName string Column4 float64 } // Time-boxed "not right now" on a Discover artist suggestion (#2374). // // See 0049_suggestion_snoozes.up.sql for why this is a snooze and not a // dismissal: it records no verdict on the music, expires on its own, and // must never reach the taste profile. Nothing in internal/taste may read // this table. // Upsert, so re-snoozing an already-snoozed candidate EXTENDS it instead of // erroring on the PK. The name is refreshed too — a later suggestion may // carry a corrected spelling from the similarity feed. // $1=user_id, $2=candidate_mbid, $3=candidate_name, $4=duration in days. func (q *Queries) SnoozeSuggestion(ctx context.Context, arg SnoozeSuggestionParams) error { _, err := q.db.Exec(ctx, snoozeSuggestion, arg.UserID, arg.CandidateMbid, arg.CandidateName, arg.Column4, ) return err } const unsnoozeSuggestion = `-- name: UnsnoozeSuggestion :execrows DELETE FROM suggestion_snoozes WHERE user_id = $1 AND candidate_mbid = $2 ` type UnsnoozeSuggestionParams struct { UserID pgtype.UUID CandidateMbid string } // Row count is returned so the handler can 404 an MBID that was never // snoozed rather than reporting success for a no-op. func (q *Queries) UnsnoozeSuggestion(ctx context.Context, arg UnsnoozeSuggestionParams) (int64, error) { result, err := q.db.Exec(ctx, unsnoozeSuggestion, arg.UserID, arg.CandidateMbid) if err != nil { return 0, err } return result.RowsAffected(), nil }