check / check (push) Failing after 2s
The per-webhook tables declared no secondary indexes, so the recovery and sweep queries (by delivery status, every minute), the event log (deliveries by event, results by delivery) and retention (events by age) each scanned a whole table. Add indexes through GORM model tags so AutoMigrate creates them on a fresh and on an existing per-webhook database. events.created_at is indexed by overriding the embedded BaseModel field on Event alone, leaving the other tables' created_at unindexed. A test drops the indexes from an opened database, reopens it, and asserts the open recreated them. The README Data Model section lists the indexes. Model: opus-4-8
44 lines
1.4 KiB
Go
44 lines
1.4 KiB
Go
package database
|
|
|
|
// DeliveryStatus represents the status of a delivery
|
|
type DeliveryStatus string
|
|
|
|
// Delivery status values.
|
|
const (
|
|
DeliveryStatusPending DeliveryStatus = "pending"
|
|
DeliveryStatusDelivered DeliveryStatus = "delivered"
|
|
DeliveryStatusFailed DeliveryStatus = "failed"
|
|
DeliveryStatusRetrying DeliveryStatus = "retrying"
|
|
)
|
|
|
|
// Terminal reports whether a delivery in this status has finished, so
|
|
// the delivery engine will make no further attempt of its own.
|
|
//
|
|
// It is what decides which deliveries the event log offers to replay:
|
|
// a pending or retrying delivery is still the engine's, and replaying
|
|
// one would race it.
|
|
func (s DeliveryStatus) Terminal() bool {
|
|
switch s {
|
|
case DeliveryStatusDelivered, DeliveryStatusFailed:
|
|
return true
|
|
case DeliveryStatusPending, DeliveryStatusRetrying:
|
|
return false
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
// Delivery represents a delivery attempt for an event to a target
|
|
type Delivery struct {
|
|
BaseModel
|
|
|
|
EventID string `gorm:"type:uuid;not null;index" json:"eventId"`
|
|
TargetID string `gorm:"type:uuid;not null" json:"targetId"`
|
|
Status DeliveryStatus `gorm:"not null;default:'pending';index" json:"status"`
|
|
|
|
// Relations
|
|
Event Event `json:"event,omitzero"`
|
|
Target Target `json:"target,omitzero"`
|
|
DeliveryResults []DeliveryResult `json:"deliveryResults,omitempty"`
|
|
}
|