1use chrono::{DateTime, Utc};
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, Serialize, Deserialize, Default)]
15#[serde(rename_all = "camelCase")]
16pub struct EpisodeSimpleListVo {
17 pub id: i32,
19 pub manga_episode: Option<String>,
21 pub manga_episode_name: Option<String>,
23 pub translator_file: Option<String>,
25 pub proofreader_file: Option<String>,
27 pub timer_file: Option<String>,
29 pub provider_file_oss_id: Option<i32>,
31 pub translator_file_oss_id: Option<i32>,
33 pub proofreader_file_oss_id: Option<i32>,
35 pub letterer_file_oss_id: Option<i32>,
37 pub timer_file_oss_id: Option<i32>,
39 pub publish_link: Option<String>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize, Default)]
45#[serde(rename_all = "camelCase")]
46pub struct EpisodeListVo {
47 pub id: i32,
49 pub manga_id: i32,
51 pub manga_episode: Option<String>,
53 pub manga_episode_name: Option<String>,
55 pub provider_id: Option<i32>,
57 pub translator_id: Option<i32>,
59 pub proofreader_id: Option<i32>,
61 pub letterer_id: Option<i32>,
63 pub timer_id: Option<i32>,
65 pub reviewer_id: Option<i32>,
67 pub setup_time: Option<DateTime<Utc>>,
69 pub update_time: Option<DateTime<Utc>>,
71 pub translator_file: Option<String>,
73 pub proofreader_file: Option<String>,
75 pub timer_file: Option<String>,
77 pub publish_link: Option<String>,
79 pub provider_file_oss_id: Option<i32>,
81 pub translator_file_oss_id: Option<i32>,
83 pub proofreader_file_oss_id: Option<i32>,
85 pub letterer_file_oss_id: Option<i32>,
87 pub timer_file_oss_id: Option<i32>,
89 #[serde(skip_serializing_if = "Option::is_none")]
91 pub translator_setup_time: Option<DateTime<Utc>>,
92 #[serde(skip_serializing_if = "Option::is_none")]
94 pub translator_update_time: Option<DateTime<Utc>>,
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub proofreader_setup_time: Option<DateTime<Utc>>,
98 #[serde(skip_serializing_if = "Option::is_none")]
100 pub proofreader_update_time: Option<DateTime<Utc>>,
101 #[serde(skip_serializing_if = "Option::is_none")]
103 pub letterer_setup_time: Option<DateTime<Utc>>,
104 #[serde(skip_serializing_if = "Option::is_none")]
106 pub letterer_update_time: Option<DateTime<Utc>>,
107 #[serde(skip_serializing_if = "Option::is_none")]
109 pub timer_setup_time: Option<DateTime<Utc>>,
110 #[serde(skip_serializing_if = "Option::is_none")]
112 pub timer_update_time: Option<DateTime<Utc>>,
113 #[serde(skip_serializing_if = "Option::is_none")]
115 pub reviewer_setup_time: Option<DateTime<Utc>>,
116 #[serde(skip_serializing_if = "Option::is_none")]
118 pub reviewer_update_time: Option<DateTime<Utc>>,
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub provider_name: Option<String>,
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub translator_name: Option<String>,
125 #[serde(skip_serializing_if = "Option::is_none")]
127 pub proofreader_name: Option<String>,
128 #[serde(skip_serializing_if = "Option::is_none")]
130 pub letterer_name: Option<String>,
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub timer_name: Option<String>,
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub reviewer_name: Option<String>,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 pub provider_filename: Option<String>,
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub translator_filename: Option<String>,
143 #[serde(skip_serializing_if = "Option::is_none")]
145 pub proofreader_filename: Option<String>,
146 #[serde(skip_serializing_if = "Option::is_none")]
148 pub letterer_filename: Option<String>,
149 #[serde(skip_serializing_if = "Option::is_none")]
151 pub timer_filename: Option<String>,
152}
153
154#[derive(Debug, Clone, Serialize, Deserialize, Default)]
156#[serde(rename_all = "camelCase")]
157pub struct EpisodeDetailVo {
158 pub id: i32,
160 pub manga_id: i32,
162 pub manga_episode: Option<String>,
164 pub manga_episode_name: Option<String>,
166 pub provider_id: Option<i32>,
168 pub translator_id: Option<i32>,
170 pub proofreader_id: Option<i32>,
172 pub letterer_id: Option<i32>,
174 pub timer_id: Option<i32>,
176 pub reviewer_id: Option<i32>,
178 pub setup_time: Option<DateTime<Utc>>,
180 pub update_time: Option<DateTime<Utc>>,
182 pub publish_link: Option<String>,
184}
185
186#[derive(Debug, Clone, Serialize, Deserialize, Default)]
188#[serde(rename_all = "camelCase")]
189pub struct NewestEpisodeVo {
190 pub manga_episode: Option<String>,
192 pub translator_id: Option<i32>,
194 pub proofreader_id: Option<i32>,
196 pub letterer_id: Option<i32>,
198 pub reviewer_id: Option<i32>,
200}
201
202#[derive(Debug, Clone, Deserialize, Serialize)]
210#[serde(rename_all = "camelCase")]
211pub struct EpisodeEditDto {
212 #[serde(default, deserialize_with = "crate::utils::query_deserialize::de_opt_i32_loose")]
214 pub id: Option<i32>,
215 #[serde(default, deserialize_with = "crate::utils::query_deserialize::de_opt_i32_loose")]
217 pub manga_id: Option<i32>,
218 pub manga_episode: Option<String>,
220 pub manga_episode_end: Option<String>,
222 pub manga_episode_name: Option<String>,
224 #[serde(default, deserialize_with = "crate::utils::query_deserialize::de_opt_i32_loose")]
226 pub provider_id: Option<i32>,
227 #[serde(default, deserialize_with = "crate::utils::query_deserialize::de_opt_i32_loose")]
229 pub translator_id: Option<i32>,
230 #[serde(default, deserialize_with = "crate::utils::query_deserialize::de_opt_i32_loose")]
232 pub proofreader_id: Option<i32>,
233 #[serde(default, deserialize_with = "crate::utils::query_deserialize::de_opt_i32_loose")]
235 pub letterer_id: Option<i32>,
236 #[serde(default, deserialize_with = "crate::utils::query_deserialize::de_opt_i32_loose")]
238 pub timer_id: Option<i32>,
239 #[serde(default, deserialize_with = "crate::utils::query_deserialize::de_opt_i32_loose")]
241 pub reviewer_id: Option<i32>,
242 pub publish_link: Option<String>,
244}
245
246#[derive(Debug, Clone, Deserialize, Serialize)]
248#[serde(rename_all = "camelCase")]
249pub struct PublishLinkRequest {
250 pub id: i32,
252 pub publish_link: Option<String>,
254}
255
256#[derive(Debug, Clone, Serialize, Deserialize, Default)]
258#[serde(rename_all = "camelCase")]
259pub struct UploadPageVo {
260 pub id: i32,
262 pub manga_id: i32,
264 pub manga_name: Option<String>,
266 pub manga_episode: Option<String>,
268 pub update_time: Option<DateTime<Utc>>,
270 pub translator_file: Option<String>,
272 pub proofreader_file: Option<String>,
274 pub timer_file: Option<String>,
276 pub provider_id: Option<i32>,
278 pub translator_id: Option<i32>,
280 pub proofreader_id: Option<i32>,
282 pub letterer_id: Option<i32>,
284 pub timer_id: Option<i32>,
286 pub reviewer_id: Option<i32>,
288 #[serde(skip_serializing_if = "Option::is_none")]
290 pub provider_name: Option<String>,
291 #[serde(skip_serializing_if = "Option::is_none")]
293 pub translator_name: Option<String>,
294 #[serde(skip_serializing_if = "Option::is_none")]
296 pub proofreader_name: Option<String>,
297 #[serde(skip_serializing_if = "Option::is_none")]
299 pub letterer_name: Option<String>,
300 #[serde(skip_serializing_if = "Option::is_none")]
302 pub timer_name: Option<String>,
303 #[serde(skip_serializing_if = "Option::is_none")]
305 pub reviewer_name: Option<String>,
306 #[serde(skip_serializing_if = "Option::is_none")]
308 pub provider_file_oss_id: Option<i32>,
309 #[serde(skip_serializing_if = "Option::is_none")]
311 pub translator_file_oss_id: Option<i32>,
312 #[serde(skip_serializing_if = "Option::is_none")]
314 pub proofreader_file_oss_id: Option<i32>,
315 #[serde(skip_serializing_if = "Option::is_none")]
317 pub letterer_file_oss_id: Option<i32>,
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub timer_file_oss_id: Option<i32>,
321 #[serde(skip_serializing_if = "Option::is_none")]
323 pub provider_filename: Option<String>,
324 #[serde(skip_serializing_if = "Option::is_none")]
326 pub translator_filename: Option<String>,
327 #[serde(skip_serializing_if = "Option::is_none")]
329 pub proofreader_filename: Option<String>,
330 #[serde(skip_serializing_if = "Option::is_none")]
332 pub letterer_filename: Option<String>,
333 #[serde(skip_serializing_if = "Option::is_none")]
335 pub timer_filename: Option<String>,
336 #[serde(skip_serializing_if = "Option::is_none")]
338 pub email: Option<String>,
339 #[serde(skip_serializing_if = "Option::is_none")]
341 pub email_now: Option<String>,
342}
343
344#[derive(Debug, Clone, Serialize, Deserialize, Default)]
346#[serde(rename_all = "camelCase")]
347pub struct Statistics {
348 #[serde(default)]
350 pub translator_count: i32,
351 #[serde(default)]
353 pub proofreader_count: i32,
354 #[serde(default)]
356 pub letterer_count: i32,
357 #[serde(default)]
359 pub reviewer_count: i32,
360}
361
362#[derive(Debug, Clone, Serialize, Deserialize, Default)]
364#[serde(rename_all = "camelCase")]
365pub struct MemberStatistics {
366 pub user_name: Option<String>,
368 pub user_id: Option<String>,
370 pub translator_count: i32,
372 pub proofreader_count: i32,
374 pub letterer_count: i32,
376 pub timer_count: i32,
378 pub reviewer_count: i32,
380}
381
382#[derive(Debug, Clone, Serialize, Deserialize, Default)]
384#[serde(rename_all = "camelCase")]
385pub struct EpisodeTask {
386 pub manga_id: Option<i32>,
388 pub episode_id: Option<i32>,
390 pub manga_episode: Option<String>,
392 pub episode_name: Option<String>,
394 pub member_id: Option<i32>,
396 pub setup_time: Option<DateTime<Utc>>,
398 pub previous_update_time: Option<DateTime<Utc>>,
400 pub post: Option<String>,
402}
403
404#[derive(Debug, Clone, Serialize, Deserialize, Default)]
406#[serde(rename_all = "camelCase")]
407pub struct MemberTaskCount {
408 pub user_name: Option<String>,
410 pub user_id: Option<String>,
412 pub intern: Option<i32>,
414 pub email: Option<String>,
416 pub last_update_time: Option<String>,
418 pub stationed_count: i32,
420 pub translator_count: i32,
422 pub proofreader_count: i32,
424 pub letterer_count: i32,
426 pub timer_count: i32,
428 pub reviewer_count: i32,
430}
431
432impl MemberTaskCount {
433 pub fn total_count(&self) -> i32 {
435 self.translator_count
436 + self.proofreader_count
437 + self.letterer_count
438 + self.timer_count
439 + self.reviewer_count
440 }
441}
442
443#[derive(Debug, Clone, Serialize, Deserialize, Default)]
449#[serde(rename_all = "camelCase")]
450pub struct TaskTrackingResponse {
451 pub translator_task_list: Vec<EpisodeTask>,
453 pub proofreader_task_list: Vec<EpisodeTask>,
455 pub letterer_task_list: Vec<EpisodeTask>,
457 pub timer_task_list: Vec<EpisodeTask>,
459 pub reviewer_task_list: Vec<EpisodeTask>,
461 pub publish_task_list: Vec<EpisodeTask>,
463 pub all_task_list: Vec<EpisodeTask>,
465}
466
467impl TaskTrackingResponse {
468 pub fn empty() -> Self {
470 Self::default()
471 }
472}
473
474#[derive(Debug, Clone, Serialize, Deserialize)]
476#[serde(rename_all = "camelCase")]
477pub struct MangaEpisode {
478 #[serde(rename = "Id")]
480 pub id: i32,
481 pub manga_id: i32,
483 pub manga_episode: Option<String>,
485 pub manga_name: Option<String>,
487 pub category: Option<i16>,
489}
490
491#[derive(Debug, Clone, Serialize, Deserialize)]
501#[serde(rename_all = "camelCase")]
502pub struct PendingMangaTask {
503 pub mangatb: crate::entity::manga::Mangatb,
505 pub newest_manga_episode: Option<String>,
507 pub pending_episode_list: Vec<PendingEpisode>,
509}
510#[derive(Debug, Clone, Serialize, Deserialize, Default)]
514#[serde(rename_all = "camelCase")]
515pub struct MangaEpisodeTb {
516 pub id: i32,
518 pub manga_id: i32,
520 pub manga_episode: Option<String>,
522 pub manga_episode_name: Option<String>,
524 pub provider_id: Option<i32>,
526 pub translator_id: Option<i32>,
528 pub proofreader_id: Option<i32>,
530 pub letterer_id: Option<i32>,
532 pub timer_id: Option<i32>,
534 pub reviewer_id: Option<i32>,
536 pub setup_time: Option<DateTime<Utc>>,
538 pub update_time: Option<DateTime<Utc>>,
540 pub translator_file: Option<String>,
542 pub proofreader_file: Option<String>,
544 pub timer_file: Option<String>,
546 pub publish_link: Option<String>,
548 pub provider_file_oss_id: Option<i32>,
550 pub translator_file_oss_id: Option<i32>,
552 pub proofreader_file_oss_id: Option<i32>,
554 pub letterer_file_oss_id: Option<i32>,
556 pub timer_file_oss_id: Option<i32>,
558}
559
560#[derive(Debug, Clone, Serialize, Deserialize)]
562#[serde(rename_all = "camelCase")]
563pub struct PendingEpisode {
564 pub mangaepisodetb: MangaEpisodeTb,
566 pub status: String,
568 pub next_publish: bool,
570}