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}