package db import ( "context" "database/sql" "time" ) type ClaimMessage struct { TicketID int64 MessageID string LastReupAt time.Time } type ClaimMessageRepo struct{ db *sql.DB } func NewClaimMessageRepo(db *sql.DB) *ClaimMessageRepo { return &ClaimMessageRepo{db: db} } func (r *ClaimMessageRepo) Upsert(ctx context.Context, ticketID int64, messageID string, at time.Time) error { _, err := r.db.ExecContext(ctx, ` INSERT INTO claim_messages(ticket_id, message_id, last_reup_at) VALUES(?,?,?) ON CONFLICT(ticket_id) DO UPDATE SET message_id=excluded.message_id, last_reup_at=excluded.last_reup_at`, ticketID, messageID, at.UTC()) return err } func (r *ClaimMessageRepo) Get(ctx context.Context, ticketID int64) (*ClaimMessage, error) { var cm ClaimMessage err := r.db.QueryRowContext(ctx, `SELECT ticket_id, message_id, last_reup_at FROM claim_messages WHERE ticket_id=?`, ticketID, ).Scan(&cm.TicketID, &cm.MessageID, &cm.LastReupAt) if err == sql.ErrNoRows { return nil, nil } return &cm, err } func (r *ClaimMessageRepo) Delete(ctx context.Context, ticketID int64) error { _, err := r.db.ExecContext(ctx, `DELETE FROM claim_messages WHERE ticket_id=?`, ticketID) return err } func (r *ClaimMessageRepo) ListAll(ctx context.Context) ([]*ClaimMessage, error) { rows, err := r.db.QueryContext(ctx, `SELECT ticket_id, message_id, last_reup_at FROM claim_messages`) if err != nil { return nil, err } defer rows.Close() var result []*ClaimMessage for rows.Next() { var cm ClaimMessage if err := rows.Scan(&cm.TicketID, &cm.MessageID, &cm.LastReupAt); err != nil { return nil, err } result = append(result, &cm) } return result, rows.Err() }