use serde::{Deserialize, Serialize}; use time::format_description::well_known::Rfc3339; use utoipa::ToSchema; use uuid::Uuid; #[derive(Debug, Clone, Copy, Serialize, Deserialize, ToSchema)] #[serde(rename_all = "snake_case")] pub enum EmailChangeTicketStatus { Pending, Verified, Completed, Cancelled, } impl From for EmailChangeTicketStatus { fn from(s: db::user::user_email_change_tickets::EmailChangeTicketStatus) -> Self { use db::user::user_email_change_tickets::EmailChangeTicketStatus as Db; match s { Db::Pending => EmailChangeTicketStatus::Pending, Db::Verified => EmailChangeTicketStatus::Verified, Db::Completed => EmailChangeTicketStatus::Completed, Db::Cancelled => EmailChangeTicketStatus::Cancelled, } } } impl From for db::user::user_email_change_tickets::EmailChangeTicketStatus { fn from(s: EmailChangeTicketStatus) -> Self { use db::user::user_email_change_tickets::EmailChangeTicketStatus as Db; match s { EmailChangeTicketStatus::Pending => Db::Pending, EmailChangeTicketStatus::Verified => Db::Verified, EmailChangeTicketStatus::Completed => Db::Completed, EmailChangeTicketStatus::Cancelled => Db::Cancelled, } } } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct EmailView { pub id: Uuid, pub email: String, pub is_activated: bool, pub is_primary: bool, pub activated_at: Option, pub created_at: String, pub updated_at: String, } impl From for EmailView { fn from(m: db::user::user_emails::Model) -> Self { Self { id: m.id, email: m.email, is_activated: m.is_activated, is_primary: m.is_primary, activated_at: m .activated_at .map(|t| t.format(&Rfc3339).unwrap_or_default()), created_at: m.created_at.format(&Rfc3339).unwrap_or_default(), updated_at: m.updated_at.format(&Rfc3339).unwrap_or_default(), } } } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct AddEmailCmd { pub email: String, } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct AddEmailResp { pub email_id: Uuid, } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct SetPrimaryEmailResp { pub email: EmailView, } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct EmailChangeTicketView { pub id: Uuid, pub new_email: String, pub status: EmailChangeTicketStatus, pub expires_at: String, pub created_at: String, pub used_at: Option, } impl From for EmailChangeTicketView { fn from(m: db::user::user_email_change_tickets::Model) -> Self { Self { id: m.id, new_email: m.new_email, status: m.status.into(), expires_at: m.expires_at.format(&Rfc3339).unwrap_or_default(), created_at: m.created_at.format(&Rfc3339).unwrap_or_default(), used_at: m.used_at.map(|t| t.format(&Rfc3339).unwrap_or_default()), } } } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct ConfirmEmailChangeCmd { pub ticket_id: Uuid, }