coda/internal/models/models.go
Rodrigo Verdiani 2eead05c34 feat: expirar jobs stuck com status timeout
Adiciona mecanismo de expiração periódica para jobs que ficam presos
nos status received ou processing além de um threshold configurável.

- models: novo status StatusTimeout
- store: migration v2 com índice em jobs(status); método ExpireStuck
  que faz UPDATE atômico para os status alvo anteriores ao threshold
- expirer: novo pacote com goroutine periódica que chama ExpireStuck
  e loga WARN quando algum job é expirado
- config: campos JobTimeoutMinutes (default 120) e
  ExpirerIntervalMinutes (default 10), lidos via env vars
  JOB_TIMEOUT_MINUTES e EXPIRER_INTERVAL_MINUTES
- main: instancia e inicia o Expirer no startup
- dashboard: card Timeout com contagem; badge neutral na tabela de jobs
2026-07-07 08:43:33 -03:00

42 lines
711 B
Go

package models
import "time"
type JobStatus string
const (
StatusReceived JobStatus = "received"
StatusProcessing JobStatus = "processing"
StatusDone JobStatus = "done"
StatusError JobStatus = "error"
StatusTimeout JobStatus = "timeout"
)
type JobSource string
const (
SourceWebhook JobSource = "webhook"
SourceManual JobSource = "manual"
)
type Job struct {
ID string
Artist string
Album string
Path string
Status JobStatus
Source JobSource
CreatedAt time.Time
FinishedAt *time.Time
DurationMs int64
ErrorMsg string
}
type LogEntry struct {
ID int64
JobID string
Level string
Message string
Timestamp time.Time
}