mayhem_db/client/query/
user.rs

1use sea_orm::{ColumnTrait, DbConn, DbErr, EntityTrait, ModelTrait, QueryFilter};
2use std::sync::Arc;
3
4use super::{common::ConnectionHolder, server::ServerQueryHelper};
5use crate::{
6    models::{
7        server::{channel, server},
8        user, user_settings,
9    },
10    util::{CompleteMember, CompleteRole, CompleteServer, CompleteUser},
11};
12
13#[derive(Clone)]
14pub struct UserQueryHelper {
15    pub client: Arc<DbConn>,
16    pub server: Arc<ServerQueryHelper>,
17}
18
19unsafe impl Sync for UserQueryHelper {}
20unsafe impl Send for UserQueryHelper {}
21
22impl ConnectionHolder for UserQueryHelper {
23    fn get_connection(&self) -> &DbConn {
24        return &self.client as &DbConn;
25    }
26
27    fn get_connection_ref(&self) -> Arc<DbConn> {
28        return self.client.clone();
29    }
30
31    fn get_connection_raw(&self) -> *const DbConn {
32        return Arc::into_raw(self.client.clone());
33    }
34}
35
36impl UserQueryHelper {
37    pub async fn find_user_servers(
38        &self,
39        user: &user::Model,
40    ) -> Result<Vec<CompleteServer>, DbErr> {
41        let mut servers: Vec<CompleteServer> = Vec::new();
42
43        let servers_result = user
44            .find_related(server::Entity)
45            .all(&self.client as &DbConn)
46            .await;
47
48        let servers_query: Vec<server::Model> = match servers_result {
49            Ok(res) => res,
50            Err(err) => return Err(err),
51        };
52
53        for server in servers_query {
54            let roles_found = self.server.find_server_roles(&server).await;
55            let members_found = self.server.find_server_members(&server).await;
56            let channels_found = self.server.find_server_channels(&server).await;
57
58            let roles: Vec<CompleteRole> = match roles_found {
59                Ok(val) => val,
60                Err(err) => return Err(err),
61            };
62
63            let members: Vec<CompleteMember> = match members_found {
64                Ok(val) => val,
65                Err(err) => return Err(err),
66            };
67
68            let channels: Vec<channel::Model> = match channels_found {
69                Ok(val) => val,
70                Err(err) => return Err(err),
71            };
72
73            servers.push(CompleteServer {
74                id: server.id,
75                name: server.name,
76                roles,
77                members,
78                channels,
79            });
80        }
81
82        return Ok(servers);
83    }
84
85    pub async fn find_user_by_id(&self, id: i32) -> Result<Option<user::Model>, DbErr> {
86        return user::Entity::find_by_id(id)
87            .one(&self.client as &DbConn)
88            .await;
89    }
90
91    pub async fn find_user_by_name(&self, username: String) -> Result<Option<CompleteUser>, DbErr> {
92        let user_result = user::Entity::find()
93            .filter(user::Column::Username.eq(username.clone()))
94            .one(&self.client as &DbConn)
95            .await;
96
97        let user_option: Option<user::Model> = match user_result {
98            Ok(res) => res,
99            Err(err) => return Err(err),
100        };
101
102        let user: user::Model = match user_option {
103            Some(res) => res,
104            None => return Ok(None),
105        };
106
107        let servers_result = self.find_user_servers(&user).await;
108
109        let servers: Vec<CompleteServer> = match servers_result {
110            Ok(res) => res,
111            Err(err) => return Err(err),
112        };
113
114        let settings = user
115            .find_related(user_settings::Entity)
116            .one(&self.client as &DbConn)
117            .await
118            .unwrap();
119
120        return Ok(Some(CompleteUser {
121            id: user.id,
122            first_name: user.first_name,
123            last_name: user.last_name,
124            email: user.email,
125            username: user.username,
126            password: user.password,
127            servers,
128            settings,
129        }));
130    }
131}