1use crate::sea_entity::{editor_page, editor_unit};
11use chrono::{DateTime, Utc};
12use serde::{Deserialize, Serialize};
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
16#[serde(rename_all = "camelCase")]
17pub struct EditorPageInfo {
18 pub page_id: i64,
20 pub episode_id: i32,
22 pub index: i32,
24 pub source_file_name: Option<String>,
26 pub image_url: String,
28 pub image_width: Option<i32>,
30 pub image_height: Option<i32>,
32 pub uploaded: bool,
34 pub translation_completed: bool,
36}
37
38impl From<editor_page::Model> for EditorPageInfo {
39 fn from(m: editor_page::Model) -> Self {
41 Self {
42 page_id: m.id,
43 episode_id: m.episode_id,
44 index: m.page_index,
45 source_file_name: m.source_file_name,
46 image_url: m.image_url,
47 image_width: m.image_width,
48 image_height: m.image_height,
49 uploaded: m.uploaded,
50 translation_completed: m.translation_completed,
51 }
52 }
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize)]
57#[serde(rename_all = "camelCase")]
58pub struct EditorUnitInfo {
59 pub id: i64,
61 pub page_id: i64,
63 pub index: i32,
65 pub x_coord: f32,
67 pub y_coord: f32,
69 pub in_bubble: bool,
71 pub is_proofread: bool,
73 pub translated_text: Option<String>,
75 pub translator_id: Option<i32>,
77 pub translator_comment: Option<String>,
79 pub proofreader_text: Option<String>,
81 pub proofreader_id: Option<i32>,
83 pub proofreader_comment: Option<String>,
85 pub revision: i32,
87 pub last_edited_by: Option<i32>,
89 pub last_edited_at: Option<String>,
91}
92
93impl From<editor_unit::Model> for EditorUnitInfo {
94 fn from(m: editor_unit::Model) -> Self {
96 Self {
97 id: m.id,
98 page_id: m.page_id,
99 index: m.unit_index,
100 x_coord: m.x_coord,
101 y_coord: m.y_coord,
102 in_bubble: m.in_bubble,
103 is_proofread: m.is_proofread,
104 translated_text: m.translated_text,
105 translator_id: m.translator_id,
106 translator_comment: m.translator_comment,
107 proofreader_text: m.proofreader_text,
108 proofreader_id: m.proofreader_id,
109 proofreader_comment: m.proofreader_comment,
110 revision: m.revision,
111 last_edited_by: m.last_edited_by,
112 last_edited_at: m
113 .last_edited_at
114 .map(|t| DateTime::<Utc>::from_naive_utc_and_offset(t, Utc).to_rfc3339()),
115 }
116 }
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize)]
121#[serde(rename_all = "camelCase")]
122pub struct EditorUnitInput {
123 pub index: i32,
125 pub x_coord: f32,
127 pub y_coord: f32,
129 #[serde(default = "default_true")]
131 pub in_bubble: bool,
132 #[serde(default)]
134 pub is_proofread: bool,
135 #[serde(default)]
137 pub translated_text: Option<String>,
138 #[serde(default)]
140 pub translator_id: Option<i32>,
141 #[serde(default)]
143 pub translator_comment: Option<String>,
144 #[serde(default)]
146 pub proofreader_text: Option<String>,
147 #[serde(default)]
149 pub proofreader_id: Option<i32>,
150 #[serde(default)]
152 pub proofreader_comment: Option<String>,
153}
154
155fn default_true() -> bool {
157 true
158}
159
160#[derive(Debug, Clone, Serialize, Deserialize)]
162#[serde(rename_all = "camelCase")]
163pub struct SaveEditorUnitsRequest {
164 pub page_id: i64,
166 pub units: Vec<EditorUnitInput>,
168}
169
170#[derive(Debug, Clone, Default, Serialize, Deserialize)]
172#[serde(rename_all = "camelCase")]
173pub struct ImportProviderPagesRequest {
174 #[serde(default)]
176 pub force: bool,
177}
178
179#[derive(Debug, Clone, Default, Serialize, Deserialize)]
181#[serde(rename_all = "camelCase")]
182pub struct EditorUploadCredentialsRequest {
183 pub files: Vec<EditorUploadFile>,
185}
186
187#[derive(Debug, Clone, Serialize, Deserialize)]
189#[serde(rename_all = "camelCase")]
190pub struct EditorUploadFile {
191 pub index: i32,
193 pub filename: String,
195}
196
197#[derive(Debug, Clone, Serialize, Deserialize)]
199#[serde(rename_all = "camelCase")]
200pub struct EditorUploadCredential {
201 pub index: i32,
203 pub object_key: String,
205 pub presigned_url: String,
207 pub bucket: String,
209 pub image_url: String,
211}
212
213#[derive(Debug, Clone, Serialize, Deserialize)]
215#[serde(rename_all = "camelCase")]
216pub struct SourceArchiveUploadCredential {
217 pub object_key: String,
219 pub presigned_url: String,
221 pub download_url: String,
223}
224
225#[derive(Debug, Clone, Serialize, Deserialize)]
227#[serde(rename_all = "camelCase")]
228pub struct EditorUploadCredentialsResponse {
229 pub files: Vec<EditorUploadCredential>,
231 pub source_archive: SourceArchiveUploadCredential,
233 #[serde(default)]
235 pub expected_page_ids: Vec<i64>,
236}
237
238#[derive(Debug, Clone, Default, Serialize, Deserialize)]
242#[serde(rename_all = "camelCase")]
243pub struct RegisterEditorPagesRequest {
244 #[serde(default)]
246 pub force: bool,
247 #[serde(default)]
249 pub expected_page_ids: Vec<i64>,
250 pub pages: Vec<RegisterEditorPage>,
252}
253
254#[derive(Debug, Clone, Serialize, Deserialize)]
256#[serde(rename_all = "camelCase")]
257pub struct RegisterEditorPage {
258 pub page_index: i32,
260 pub object_key: String,
262 #[serde(default)]
264 pub source_file_name: Option<String>,
265 #[serde(default)]
267 pub image_width: Option<i32>,
268 #[serde(default)]
270 pub image_height: Option<i32>,
271}
272
273#[derive(Debug, Clone, Serialize, Deserialize)]
275#[serde(rename_all = "camelCase")]
276pub struct CompleteEpisodeWorkflowRequest {
277 pub role: String,
279}
280
281#[derive(Debug, Clone, Serialize, Deserialize)]
283#[serde(rename_all = "camelCase")]
284pub struct EditorWorkspace {
285 pub episode_id: i32,
287 pub manga_id: i32,
289 pub manga_name: Option<String>,
291 pub has_provider_source: bool,
293 pub pages: Vec<EditorPageInfo>,
295}
296
297#[derive(Debug, Clone, Serialize, Deserialize)]
299#[serde(rename_all = "camelCase")]
300pub struct ImportProviderResult {
301 pub episode_id: i32,
303 pub imported: bool,
305 pub page_count: usize,
307 pub pages: Vec<EditorPageInfo>,
309}