mayhem_db/client/query/
user.rs1use 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}