1.7 KiB · text History 1ce9641
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum JobKind {
    Thumbnail,
    Ocr,
    Describe,
    ExtractTags,
    SimilaritySearch,
}

impl JobKind {
    pub fn as_str(&self) -> &'static str {
        match self {
            JobKind::Thumbnail => "thumbnail",
            JobKind::Ocr => "ocr",
            JobKind::Describe => "describe",
            JobKind::ExtractTags => "extract_tags",
            JobKind::SimilaritySearch => "similarity_search",
        }
    }

    pub fn from_str(s: &str) -> Option<Self> {
        match s {
            "thumbnail" | "thumbs" => Some(JobKind::Thumbnail),
            "ocr" => Some(JobKind::Ocr),
            "describe" => Some(JobKind::Describe),
            "extract_tags" | "extract-tags" => Some(JobKind::ExtractTags),
            "similarity_search" | "similarity" => Some(JobKind::SimilaritySearch),
            _ => None,
        }
    }
}

/// Envelope sent over RabbitMQ for every job. The kind is duplicated in the
/// routing key but kept here so consumers can re-publish without inspecting
/// AMQP metadata.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JobMessage {
    pub kind: JobKind,
    pub upload_id: i64,
    pub user_id: i64,
    /// UUID generated at publish time so workers can dedupe redeliveries
    /// across queue restarts.
    pub job_id: String,
    pub attempt: u32,
}

impl JobMessage {
    pub fn new(kind: JobKind, upload_id: i64, user_id: i64) -> Self {
        Self {
            kind,
            upload_id,
            user_id,
            job_id: uuid::Uuid::new_v4().to_string(),
            attempt: 1,
        }
    }
}