a3s-boot 0.2.0

Adapter-first modular Rust web framework for A3S inspired by Nest.js
Documentation
use a3s_orm::Migration;

const POSTGRES_QUEUE_SQL: &str = r#"
CREATE TABLE IF NOT EXISTS boot_queue_jobs (
    queue_name TEXT NOT NULL,
    job_id TEXT NOT NULL,
    job_name TEXT NOT NULL,
    payload_json TEXT NOT NULL,
    options_json TEXT NOT NULL,
    state TEXT NOT NULL CHECK (state IN ('pending', 'active', 'completed', 'failed')),
    priority BIGINT NOT NULL CHECK (priority BETWEEN 0 AND 4294967295),
    lifo BOOLEAN NOT NULL,
    available_at_nanos BIGINT NOT NULL,
    attempts_made BIGINT NOT NULL DEFAULT 0 CHECK (attempts_made >= 0),
    stalled_count BIGINT NOT NULL DEFAULT 0 CHECK (stalled_count >= 0),
    worker_id TEXT,
    lock_token TEXT,
    lease_expires_at_nanos BIGINT,
    failed_reason TEXT,
    deduplication_id TEXT,
    deduplication_expires_at_nanos BIGINT,
    successor_job_id TEXT,
    successor_job_name TEXT,
    successor_payload_json TEXT,
    successor_options_json TEXT,
    created_at_nanos BIGINT NOT NULL,
    updated_at_nanos BIGINT NOT NULL,
    finished_at_nanos BIGINT,
    PRIMARY KEY (queue_name, job_id),
    CHECK (
        (state = 'active' AND worker_id IS NOT NULL AND lock_token IS NOT NULL
            AND lease_expires_at_nanos IS NOT NULL)
        OR
        (state <> 'active' AND worker_id IS NULL AND lock_token IS NULL
            AND lease_expires_at_nanos IS NULL)
    ),
    CHECK (
        (successor_job_id IS NULL AND successor_job_name IS NULL
            AND successor_payload_json IS NULL AND successor_options_json IS NULL)
        OR
        (successor_job_id IS NOT NULL AND successor_job_name IS NOT NULL
            AND successor_payload_json IS NOT NULL AND successor_options_json IS NOT NULL)
    )
);

CREATE INDEX IF NOT EXISTS boot_queue_jobs_claim_idx
    ON boot_queue_jobs (
        queue_name,
        state,
        available_at_nanos,
        priority,
        created_at_nanos,
        job_id
    );

CREATE INDEX IF NOT EXISTS boot_queue_jobs_lease_idx
    ON boot_queue_jobs (queue_name, state, lease_expires_at_nanos, job_id);

CREATE INDEX IF NOT EXISTS boot_queue_jobs_terminal_idx
    ON boot_queue_jobs (queue_name, state, finished_at_nanos DESC, job_id DESC);

CREATE UNIQUE INDEX IF NOT EXISTS boot_queue_jobs_active_dedup_idx
    ON boot_queue_jobs (queue_name, deduplication_id)
    WHERE deduplication_id IS NOT NULL AND state IN ('pending', 'active');
"#;

pub(super) fn postgres_queue_migrations() -> Vec<Migration> {
    vec![Migration::new(
        "a3s-boot-0001-queue",
        "create durable Boot queue jobs",
        POSTGRES_QUEUE_SQL,
    )]
}