mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-11 00:14:00 +00:00
fix: make SQL queue recovery expire authoritatively
This commit is contained in:
@@ -91,15 +91,19 @@ type queueTicketRecord struct {
|
||||
Revision uint64 `json:"revision"`
|
||||
}
|
||||
|
||||
func GetQueueTicket(ctx context.Context, db *sql.DB, playerID, ticketID string) (domain.QueueTicket, error) {
|
||||
if db == nil || playerID == "" || ticketID == "" {
|
||||
func GetQueueTicket(ctx context.Context, db *sql.DB, playerID, ticketID string, now time.Time) (domain.QueueTicket, error) {
|
||||
if db == nil || playerID == "" || ticketID == "" || now.IsZero() {
|
||||
return domain.QueueTicket{}, fmt.Errorf("invalid queue recovery arguments")
|
||||
}
|
||||
var record queueTicketRecord
|
||||
if err := db.QueryRowContext(ctx, QueueTicketSelectSQL, ticketID, playerID).Scan(&record.TicketID, &record.PlayerID, &record.Playlist, &record.State, &record.ClientBuild, &record.ProtocolVersion, &record.EnqueuedAt, &record.ExpiresAt, &record.Revision); err != nil {
|
||||
return domain.QueueTicket{}, err
|
||||
}
|
||||
return queueTicketRecordToDomain(record), nil
|
||||
ticket := queueTicketRecordToDomain(record)
|
||||
if (ticket.State == domain.Queued || ticket.State == domain.Proposed) && !now.Before(ticket.ExpiresAt) {
|
||||
return domain.QueueTicket{}, domain.ErrTicketExpired
|
||||
}
|
||||
return ticket, nil
|
||||
}
|
||||
|
||||
func HeartbeatQueueTicket(ctx context.Context, db *sql.DB, playerID, ticketID, idempotencyKey string, expectedRevision uint64, now time.Time) (domain.QueueTicket, error) {
|
||||
|
||||
Reference in New Issue
Block a user