backend/objects/
mod.rs

1use lettre::{
2    AsyncSmtpTransport, AsyncTransport, Message as Email, Tokio1Executor,
3    message::{Mailbox, MessageBuilder as EmailBuilder},
4    transport::smtp::authentication::Credentials,
5};
6use log::debug;
7use serde::{Deserialize, Serialize};
8use uuid::Uuid;
9
10mod bans;
11mod channel;
12mod email_token;
13mod friends;
14mod guild;
15mod invite;
16mod me;
17mod member;
18pub mod message;
19mod password_reset_token;
20mod role;
21mod user;
22
23pub use bans::GuildBan;
24pub use channel::Channel;
25pub use email_token::EmailToken;
26pub use friends::Friend;
27pub use friends::FriendRequest;
28pub use guild::Guild;
29pub use invite::Invite;
30pub use me::Me;
31pub use member::Member;
32pub use message::Message;
33pub use password_reset_token::PasswordResetToken;
34pub use role::Permissions;
35pub use role::Role;
36pub use user::User;
37
38use crate::error::Error;
39
40pub trait HasUuid {
41    fn uuid(&self) -> &Uuid;
42}
43
44pub trait HasIsAbove {
45    fn is_above(&self) -> Option<&Uuid>;
46}
47/*
48pub trait Cookies {
49    fn cookies(&self) -> CookieJar;
50    fn cookie<T: AsRef<str>>(&self, cookie: T) -> Option<Cookie>;
51}
52
53impl Cookies for Request<Body> {
54    fn cookies(&self) -> CookieJar {
55        let cookies = self.headers()
56            .get(axum::http::header::COOKIE)
57            .and_then(|value| value.to_str().ok())
58            .map(|s| Cookie::split_parse(s.to_string()))
59            .and_then(|c| c.collect::<Result<Vec<Cookie>, cookie::ParseError>>().ok())
60            .unwrap_or(vec![]);
61
62        let mut cookie_jar = CookieJar::new();
63
64        for cookie in cookies {
65            cookie_jar.add(cookie)
66        }
67
68        cookie_jar
69    }
70
71    fn cookie<T: AsRef<str>>(&self, cookie: T) -> Option<Cookie> {
72        self.cookies()
73            .get(cookie.as_ref())
74            .and_then(|c| Some(c.to_owned()))
75    }
76}
77*/
78
79#[derive(Serialize)]
80pub struct Pagination<T> {
81    objects: Vec<T>,
82    amount: i32,
83    pages: i32,
84    page: i32,
85}
86
87#[derive(Deserialize)]
88pub struct PaginationRequest {
89    pub page: i32,
90    pub per_page: Option<i32>,
91}
92
93fn load_or_empty<T>(
94    query_result: Result<Vec<T>, diesel::result::Error>,
95) -> Result<Vec<T>, diesel::result::Error> {
96    match query_result {
97        Ok(vec) => Ok(vec),
98        Err(diesel::result::Error::NotFound) => Ok(Vec::new()),
99        Err(e) => Err(e),
100    }
101}
102
103#[derive(PartialEq, Eq, Clone)]
104pub enum MailTls {
105    StartTls,
106    Tls,
107}
108
109impl From<String> for MailTls {
110    fn from(value: String) -> Self {
111        match &*value.to_lowercase() {
112            "starttls" => Self::StartTls,
113            _ => Self::Tls,
114        }
115    }
116}
117
118#[derive(Clone)]
119pub struct MailClient {
120    creds: Credentials,
121    smtp_server: String,
122    mbox: Mailbox,
123    tls: MailTls,
124}
125
126impl MailClient {
127    pub fn new<T: Into<MailTls>>(
128        creds: Credentials,
129        smtp_server: String,
130        mbox: String,
131        tls: T,
132    ) -> Result<Self, Error> {
133        Ok(Self {
134            creds,
135            smtp_server,
136            mbox: mbox.parse()?,
137            tls: tls.into(),
138        })
139    }
140
141    pub fn message_builder(&self) -> EmailBuilder {
142        Email::builder().from(self.mbox.clone())
143    }
144
145    pub async fn send_mail(&self, email: Email) -> Result<(), Error> {
146        let mailer: AsyncSmtpTransport<Tokio1Executor> = match self.tls {
147            MailTls::StartTls => {
148                AsyncSmtpTransport::<Tokio1Executor>::starttls_relay(&self.smtp_server)?
149                    .credentials(self.creds.clone())
150                    .build()
151            }
152            MailTls::Tls => AsyncSmtpTransport::<Tokio1Executor>::relay(&self.smtp_server)?
153                .credentials(self.creds.clone())
154                .build(),
155        };
156
157        let response = mailer.send(email).await?;
158
159        debug!("mail sending response: {response:?}");
160
161        Ok(())
162    }
163}
164
165#[derive(Deserialize)]
166pub struct StartAmountQuery {
167    pub start: Option<i64>,
168    pub amount: Option<i64>,
169}