synops/migrations/013_job_queue.sql
vegard 07fa10620b Fullfører oppgave 15.3: Jobbkø-oversikt med admin-UI
Admin kan nå se, filtrere, retrye og avbryte jobber via /admin/jobs.

Backend:
- jobs.rs: list_jobs(), count_by_status(), distinct_job_types(),
  retry_job(), cancel_job() for admin-spørringer
- intentions.rs: GET /admin/jobs, POST retry_job/cancel_job handlers
- main.rs: tre nye ruter

Frontend:
- /admin/jobs: statusoppsummering med antall per status, filter på
  type/status, paginert tabell med retry/avbryt-knapper, 5s polling
- /admin: navigasjonslenke til jobbkø

Migrasjon:
- 013_job_queue.sql: formaliserer job_queue-tabellen med admin-indekser

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 03:40:56 +00:00

34 lines
1.4 KiB
SQL

-- Oppgave 15.3: Jobbkø-tabell
--
-- Denne tabellen har vært referert fra jobs.rs og maintenance.rs
-- men manglet som formell migrasjon. Oppretter den nå med enum,
-- indekser og kolonner som matcher eksisterende Rust-kode.
CREATE TYPE job_status AS ENUM ('pending', 'running', 'completed', 'error', 'retry');
CREATE TABLE job_queue (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
collection_node_id UUID REFERENCES nodes(id) ON DELETE CASCADE,
job_type TEXT NOT NULL,
payload JSONB NOT NULL DEFAULT '{}',
status job_status NOT NULL DEFAULT 'pending',
priority SMALLINT NOT NULL DEFAULT 0,
result JSONB,
error_msg TEXT,
attempts SMALLINT NOT NULL DEFAULT 0,
max_attempts SMALLINT NOT NULL DEFAULT 3,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
started_at TIMESTAMPTZ,
completed_at TIMESTAMPTZ,
scheduled_for TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- Indeks for effektiv dequeue: henter ventende/retry-jobber sortert etter prioritet
CREATE INDEX idx_job_queue_pending ON job_queue (priority DESC, scheduled_for ASC)
WHERE status IN ('pending', 'retry');
-- Indeks for admin-oversikt: filtrer på status
CREATE INDEX idx_job_queue_status ON job_queue (status, created_at DESC);
-- Indeks for filtrering på jobbtype
CREATE INDEX idx_job_queue_type ON job_queue (job_type, created_at DESC);