context69-contracts 0.7.0

Shared request and response types for the Context69 API.
Documentation
use chrono::{DateTime, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use uuid::Uuid;

#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct TranslationDirective {
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub source_locale: Option<String>,
    #[serde(default)]
    pub target_locales: Vec<String>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TranslationStatus {
    Queued,
    Running,
    Succeeded,
    Failed,
    Skipped,
    QuotaExceeded,
    Unavailable,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TranslationProviderKind {
    Deepl,
    Llm,
    Libretranslate,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TranslationLlmApiKind {
    OpenaiResponses,
    OpenaiChatCompletions,
    AnthropicMessages,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum DeeplPlan {
    Free,
    Pro,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct TranslationProviderInput {
    pub provider: TranslationProviderKind,
    #[serde(default)]
    pub enabled: bool,
    pub priority: i32,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub endpoint: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub api_key: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub model: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub llm_api_kind: Option<TranslationLlmApiKind>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub deepl_plan: Option<DeeplPlan>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub monthly_character_limit: Option<i64>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct TranslationProviderResponse {
    pub provider: TranslationProviderKind,
    pub enabled: bool,
    pub priority: i32,
    pub endpoint: Option<String>,
    pub has_api_key: bool,
    pub model: Option<String>,
    pub llm_api_kind: Option<TranslationLlmApiKind>,
    pub deepl_plan: Option<DeeplPlan>,
    pub monthly_character_limit: Option<i64>,
    pub current_month_characters: i64,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct UpdateTranslationSettingsRequest {
    pub providers: Vec<TranslationProviderInput>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct TranslationSettingsResponse {
    pub providers: Vec<TranslationProviderResponse>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct TranslationGlossaryEntry {
    pub source: String,
    pub target: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct UpdateGroupTranslationSettingsRequest {
    pub enabled: bool,
    #[serde(default)]
    pub default_target_locales: Vec<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub source_locale: Option<String>,
    #[serde(default)]
    pub glossary: Vec<TranslationGlossaryEntry>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct GroupTranslationSettingsResponse {
    pub enabled: bool,
    pub default_target_locales: Vec<String>,
    pub source_locale: Option<String>,
    pub glossary: Vec<TranslationGlossaryEntry>,
    pub queued_count: i64,
    pub running_count: i64,
    pub succeeded_count: i64,
    pub failed_count: i64,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct TranslationJobResponse {
    pub job_id: Uuid,
    pub document_id: i64,
    pub target_locale: String,
    pub source_locale: Option<String>,
    pub status: TranslationStatus,
    pub provider: Option<TranslationProviderKind>,
    pub attempt_count: i32,
    pub source_character_count: i64,
    pub error_message: Option<String>,
    pub created_at: DateTime<Utc>,
    pub started_at: Option<DateTime<Utc>>,
    pub finished_at: Option<DateTime<Utc>>,
    pub updated_at: DateTime<Utc>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct RebuildDocumentTranslationsRequest {
    #[serde(default)]
    pub target_locales: Vec<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
pub struct TranslationJobsResponse {
    pub jobs: Vec<TranslationJobResponse>,
}