1use chrono::{DateTime, Utc};
10use serde::{Deserialize, Serialize};
11
12#[derive(Debug, Clone, Serialize, Deserialize, Default)]
21pub struct Post {
22 pub post: i32,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize, Default)]
41#[serde(rename_all = "camelCase")]
42pub struct Member {
43 #[serde(alias = "Id")]
45 pub id: i32,
46 pub username: Option<String>,
48 #[serde(skip_serializing_if = "Option::is_none")]
50 pub password: Option<String>,
51 pub intern: i16,
53 pub email: Option<String>,
55 pub avatar_url: Option<String>,
57 pub registration_time: Option<DateTime<Utc>>,
59 pub last_submit_time: Option<DateTime<Utc>>,
61 #[serde(default)]
63 pub posts: Vec<Post>,
64 #[serde(default)]
66 pub post_ids: Vec<i32>,
67 #[serde(default)]
69 pub station_count: Option<i32>,
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub station_id: Option<i32>,
73 #[serde(skip_serializing_if = "Option::is_none")]
75 pub post: Option<i32>,
76 #[serde(skip_serializing_if = "Option::is_none")]
78 pub status: Option<i16>,
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub manga_id: Option<i32>,
82 #[serde(skip_serializing_if = "Option::is_none")]
84 pub manga_name: Option<String>,
85}
86
87impl Member {
88 pub fn has_reviewer_permission(&self) -> bool {
92 self.intern != crate::entity::enums::MemberInternEnum::RETIRED
93 && self
94 .post_ids
95 .contains(&crate::entity::enums::PostEnum::REVIEWER)
96 }
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
101#[serde(rename_all = "camelCase")]
102pub struct MemberListVo {
103 pub username: Option<String>,
105 pub id: i32,
107 pub posts: Vec<Post>,
109 pub intern: i16,
111 pub last_submit_time: Option<DateTime<Utc>>,
113 pub registration_time: Option<DateTime<Utc>>,
115 pub email: Option<String>,
117 pub avatar_url: Option<String>,
119 pub station_count: Option<i32>,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
125#[serde(rename_all = "camelCase")]
126pub struct MemberInfoVo {
127 pub id: i32,
129 pub username: Option<String>,
131 pub posts: Vec<Post>,
133 pub post_ids: Vec<i32>,
135 pub intern: i16,
137 pub last_submit_time: Option<DateTime<Utc>>,
139 pub registration_time: Option<DateTime<Utc>>,
141 pub email: Option<String>,
143 pub avatar_url: Option<String>,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize)]
149#[serde(rename_all = "camelCase")]
150pub struct MemberCache {
151 #[serde(alias = "Id")]
153 pub id: i32,
154 pub username: Option<String>,
156 pub intern: i16,
158 pub email: Option<String>,
160 pub avatar_url: Option<String>,
162 pub posts: Vec<i32>,
164}
165
166#[derive(Debug, Deserialize)]
174pub struct MemberLoginRequest {
175 pub username: String,
177 pub password: String,
179}
180
181#[derive(Debug, Deserialize)]
183pub struct Reg {
184 pub id: Option<i32>,
186 pub username: String,
188 pub email: String,
190 pub password: String,
192 pub invitationcode: i32,
194}
195
196#[derive(Debug, Clone, Serialize, Deserialize)]
198pub struct InvitationCode {
199 pub id: Option<i32>,
201 pub code: i32,
203}
204
205#[derive(Debug, Deserialize)]
207pub struct ResetPassword {
208 pub id: i32,
210 pub old_pwd: String,
212 pub new_pwd: String,
214}
215
216#[derive(Debug, Clone, Deserialize, Serialize)]
224#[serde(rename_all = "camelCase")]
225pub struct MemberEpisode {
226 pub member_id: i32,
228 pub episode_id: i32,
230 pub my_name: String,
232 #[serde(skip_serializing_if = "Option::is_none")]
234 pub my_setup_time: Option<DateTime<Utc>>,
235 #[serde(skip_serializing_if = "Option::is_none")]
237 pub my_update_time: Option<DateTime<Utc>>,
238}
239
240#[derive(Debug, Deserialize)]
242#[serde(rename_all = "camelCase")]
243pub struct MemberAddRequest {
244 pub username: String,
246 pub password: String,
248 pub email: String,
250 pub intern: i16,
252 pub post_ids: Vec<i32>,
254}
255
256#[derive(Debug, Deserialize)]
258#[serde(rename_all = "camelCase")]
259pub struct MemberUpdateRequest {
260 pub id: i32,
262 pub username: Option<String>,
264 pub password: Option<String>,
266 pub email: Option<String>,
268 pub avatar_url: Option<String>,
270 pub intern: Option<i16>,
272 pub post_ids: Option<Vec<i32>>,
274 pub string_posts: Option<Vec<String>>,
276}
277
278#[derive(Debug, Deserialize)]
280#[serde(rename_all = "camelCase")]
281pub struct MemberSelfUpdateRequest {
282 pub id: i32,
284 pub username: Option<String>,
286 pub email: Option<String>,
288 pub avatar_url: Option<String>,
290}
291
292#[derive(Debug, Clone, Serialize, Deserialize, Default)]
299#[serde(rename_all = "camelCase")]
300pub struct MemberEpisodeVo {
301 pub id: i32,
303 pub manga_id: i32,
305 pub manga_name: Option<String>,
307 pub manga_episode: Option<String>,
309 pub manga_episode_name: Option<String>,
311 pub setup_time: Option<DateTime<Utc>>,
313 pub update_time: Option<DateTime<Utc>>,
315 pub provider_id: Option<i32>,
317 pub provider_name: Option<String>,
319 pub provider_setup_time: Option<DateTime<Utc>>,
321 pub provider_update_time: Option<DateTime<Utc>>,
323 pub translator_id: Option<i32>,
325 pub translator_name: Option<String>,
327 pub translator_setup_time: Option<DateTime<Utc>>,
329 pub translator_update_time: Option<DateTime<Utc>>,
331 pub proofreader_id: Option<i32>,
333 pub proofreader_name: Option<String>,
335 pub proofreader_setup_time: Option<DateTime<Utc>>,
337 pub proofreader_update_time: Option<DateTime<Utc>>,
339 pub letterer_id: Option<i32>,
341 pub letterer_name: Option<String>,
343 pub letterer_setup_time: Option<DateTime<Utc>>,
345 pub letterer_update_time: Option<DateTime<Utc>>,
347 pub timer_id: Option<i32>,
349 pub timer_name: Option<String>,
351 pub timer_setup_time: Option<DateTime<Utc>>,
353 pub timer_update_time: Option<DateTime<Utc>>,
355 pub reviewer_id: Option<i32>,
357 pub reviewer_name: Option<String>,
359 pub reviewer_setup_time: Option<DateTime<Utc>>,
361 pub reviewer_update_time: Option<DateTime<Utc>>,
363 pub provider_file_oss_id: Option<i32>,
365 pub provider_filename: Option<String>,
367 pub translator_file_oss_id: Option<i32>,
369 pub translator_filename: Option<String>,
371 pub proofreader_file_oss_id: Option<i32>,
373 pub proofreader_filename: Option<String>,
375 pub letterer_file_oss_id: Option<i32>,
377 pub letterer_filename: Option<String>,
379 pub timer_file_oss_id: Option<i32>,
381 pub timer_filename: Option<String>,
383 pub translator_file: Option<String>,
385 pub proofreader_file: Option<String>,
387 pub timer_file: Option<String>,
389 pub publish_link: Option<String>,
391 #[serde(skip_serializing_if = "Option::is_none")]
393 pub workbench_time: Option<DateTime<Utc>>,
394}
395
396#[derive(Debug, Clone, Serialize, Deserialize, Default)]
398#[serde(rename_all = "camelCase")]
399pub struct MemberWorkbenchTaskGroup {
400 pub manga_id: i32,
402 pub manga_name: String,
404 pub tasks: Vec<MemberEpisodeVo>,
406}
407
408#[derive(Debug, Clone, Serialize, Deserialize, Default)]
410#[serde(rename_all = "camelCase")]
411pub struct MemberWorkbenchRoleCounts {
412 pub translator: i32,
414 pub proofreader: i32,
416 pub letterer: i32,
418 pub timer: i32,
420 pub reviewer: i32,
422}
423
424#[derive(Debug, Clone, Serialize, Deserialize, Default)]
426#[serde(rename_all = "camelCase")]
427pub struct MemberWorkbenchOverview {
428 pub pending: i32,
430 pub working: i32,
432 pub overdue: i32,
434 pub downloadable: i32,
436 pub completed: i32,
438 pub stationed: i32,
440 pub all_count: i32,
442 pub plan_count: i32,
444 pub doing_count: i32,
446 pub role_counts: MemberWorkbenchRoleCounts,
448 pub plan_role_counts: MemberWorkbenchRoleCounts,
450}
451
452#[derive(Debug, Clone, Serialize, Deserialize)]
454#[serde(rename_all = "camelCase")]
455pub struct StationedManga {
456 #[serde(flatten)]
458 pub manga: crate::entity::manga::MangaResponse,
459 pub posts: Vec<i32>,
461}
462
463impl From<Member> for MemberListVo {
464 fn from(m: Member) -> Self {
465 Self {
466 username: m.username,
467 id: m.id,
468 posts: m.posts,
469 intern: m.intern,
470 last_submit_time: m.last_submit_time,
471 registration_time: m.registration_time,
472 email: m.email,
473 avatar_url: m.avatar_url,
474 station_count: m.station_count,
475 }
476 }
477}
478
479impl From<Member> for MemberInfoVo {
480 fn from(m: Member) -> Self {
481 Self {
482 id: m.id,
483 username: m.username,
484 posts: m.posts,
485 post_ids: m.post_ids,
486 intern: m.intern,
487 last_submit_time: m.last_submit_time,
488 registration_time: m.registration_time,
489 email: m.email,
490 avatar_url: m.avatar_url,
491 }
492 }
493}