AlpenQueue/pkg/worker/worker.go
Soldier 018d699e31 Add webhook callback support
Add webhook_url column to jobs table. POST /jobs endpoint accepts JSON payload with optional webhook_url. After job completion, worker POSTs to webhook with status and duration.
2025-11-16 08:01:53 +00:00

59 lines
1.2 KiB
Go

package worker
import (
"alpenqueue/pkg/db"
"bytes"
"database/sql"
"encoding/json"
"fmt"
"log"
"net/http"
"time"
)
func Start(database *sql.DB) {
go func() {
for {
jobs, err := db.GetPendingJobs(database)
if err != nil {
log.Printf("Error fetching jobs: %v", err)
time.Sleep(5 * time.Second)
continue
}
for _, job := range jobs {
log.Printf("Processing job %d", job.ID)
start := time.Now()
time.Sleep(2 * time.Second)
duration := time.Since(start)
if job.WebhookURL != "" {
payload := map[string]string{
"status": "ok",
"took": fmt.Sprintf("%.1fs", duration.Seconds()),
}
jsonData, _ := json.Marshal(payload)
resp, err := http.Post(job.WebhookURL, "application/json", bytes.NewBuffer(jsonData))
if err != nil {
log.Printf("Error posting webhook for job %d: %v", job.ID, err)
} else {
resp.Body.Close()
log.Printf("Webhook posted for job %d", job.ID)
}
}
if err := db.MarkJobDone(database, job.ID); err != nil {
log.Printf("Error marking job %d done: %v", job.ID, err)
} else {
log.Printf("Job %d completed", job.ID)
}
}
time.Sleep(5 * time.Second)
}
}()
}