Skip to main content

context69_contracts/
translation.rs

1use chrono::{DateTime, Utc};
2use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4use utoipa::ToSchema;
5use uuid::Uuid;
6
7#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
8pub struct TranslationDirective {
9    #[serde(default, skip_serializing_if = "Option::is_none")]
10    pub source_locale: Option<String>,
11    #[serde(default)]
12    pub target_locales: Vec<String>,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
16#[serde(rename_all = "snake_case")]
17pub enum TranslationStatus {
18    Queued,
19    Running,
20    Succeeded,
21    Failed,
22    Skipped,
23    QuotaExceeded,
24    Unavailable,
25}
26
27#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
28#[serde(rename_all = "snake_case")]
29pub enum TranslationProviderKind {
30    Deepl,
31    Llm,
32    Libretranslate,
33}
34
35#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
36#[serde(rename_all = "snake_case")]
37pub enum TranslationLlmApiKind {
38    OpenaiResponses,
39    OpenaiChatCompletions,
40    AnthropicMessages,
41}
42
43#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema, JsonSchema)]
44#[serde(rename_all = "snake_case")]
45pub enum DeeplPlan {
46    Free,
47    Pro,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
51pub struct TranslationProviderInput {
52    pub provider: TranslationProviderKind,
53    #[serde(default)]
54    pub enabled: bool,
55    pub priority: i32,
56    #[serde(default, skip_serializing_if = "Option::is_none")]
57    pub endpoint: Option<String>,
58    #[serde(default, skip_serializing_if = "Option::is_none")]
59    pub api_key: Option<String>,
60    #[serde(default, skip_serializing_if = "Option::is_none")]
61    pub model: Option<String>,
62    #[serde(default, skip_serializing_if = "Option::is_none")]
63    pub llm_api_kind: Option<TranslationLlmApiKind>,
64    #[serde(default, skip_serializing_if = "Option::is_none")]
65    pub deepl_plan: Option<DeeplPlan>,
66    #[serde(default, skip_serializing_if = "Option::is_none")]
67    pub monthly_character_limit: Option<i64>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
71pub struct TranslationProviderResponse {
72    pub provider: TranslationProviderKind,
73    pub enabled: bool,
74    pub priority: i32,
75    pub endpoint: Option<String>,
76    pub has_api_key: bool,
77    pub model: Option<String>,
78    pub llm_api_kind: Option<TranslationLlmApiKind>,
79    pub deepl_plan: Option<DeeplPlan>,
80    pub monthly_character_limit: Option<i64>,
81    pub current_month_characters: i64,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
85pub struct UpdateTranslationSettingsRequest {
86    pub providers: Vec<TranslationProviderInput>,
87}
88
89#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
90pub struct TranslationSettingsResponse {
91    pub providers: Vec<TranslationProviderResponse>,
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
95pub struct TranslationGlossaryEntry {
96    pub source: String,
97    pub target: String,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
101pub struct UpdateGroupTranslationSettingsRequest {
102    pub enabled: bool,
103    #[serde(default)]
104    pub default_target_locales: Vec<String>,
105    #[serde(default, skip_serializing_if = "Option::is_none")]
106    pub source_locale: Option<String>,
107    #[serde(default)]
108    pub glossary: Vec<TranslationGlossaryEntry>,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
112pub struct GroupTranslationSettingsResponse {
113    pub enabled: bool,
114    pub default_target_locales: Vec<String>,
115    pub source_locale: Option<String>,
116    pub glossary: Vec<TranslationGlossaryEntry>,
117    pub queued_count: i64,
118    pub running_count: i64,
119    pub succeeded_count: i64,
120    pub failed_count: i64,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
124pub struct TranslationJobResponse {
125    pub job_id: Uuid,
126    pub document_id: i64,
127    pub target_locale: String,
128    pub source_locale: Option<String>,
129    pub status: TranslationStatus,
130    pub provider: Option<TranslationProviderKind>,
131    pub attempt_count: i32,
132    pub source_character_count: i64,
133    pub error_message: Option<String>,
134    pub created_at: DateTime<Utc>,
135    pub started_at: Option<DateTime<Utc>>,
136    pub finished_at: Option<DateTime<Utc>>,
137    pub updated_at: DateTime<Utc>,
138}
139
140#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
141pub struct RebuildDocumentTranslationsRequest {
142    #[serde(default)]
143    pub target_locales: Vec<String>,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, JsonSchema)]
147pub struct TranslationJobsResponse {
148    pub jobs: Vec<TranslationJobResponse>,
149}