mayhem_db/client/query/
server.rs1use sea_orm::{DbConn, DbErr, ModelTrait};
2use std::sync::Arc;
3
4use super::common::ConnectionHolder;
5use crate::{
6 models::server::{channel, member, role, server},
7 util::{CompleteMember, CompleteRole},
8};
9
10#[derive(Clone)]
11pub struct ServerQueryHelper {
12 pub client: Arc<DbConn>,
13}
14
15unsafe impl Sync for ServerQueryHelper {}
16unsafe impl Send for ServerQueryHelper {}
17
18impl ConnectionHolder for ServerQueryHelper {
19 fn get_connection(&self) -> &DbConn {
20 return &self.client as &DbConn;
21 }
22
23 fn get_connection_ref(&self) -> Arc<DbConn> {
24 return self.client.clone();
25 }
26
27 fn get_connection_raw(&self) -> *const DbConn {
28 return Arc::into_raw(self.client.clone());
29 }
30}
31
32impl ServerQueryHelper {
33 pub async fn find_server_roles(
34 &self,
35 server: &server::Model,
36 ) -> Result<Vec<CompleteRole>, DbErr> {
37 let mut roles: Vec<CompleteRole> = Vec::new();
38
39 let found_roles = server
40 .clone()
41 .find_related(role::Entity)
42 .all(&self.client as &DbConn)
43 .await;
44
45 let ok_roles: Vec<role::Model> = match found_roles {
46 Ok(res) => res,
47 Err(err) => return Err(err),
48 };
49
50 for role in ok_roles {
51 let members = role
52 .find_related(member::Entity)
53 .all(&self.client as &DbConn)
54 .await
55 .unwrap()
56 .iter()
57 .map(|val| val.id)
58 .collect();
59
60 roles.push(CompleteRole {
61 id: role.id,
62 name: role.name,
63 server_id: role.server_id,
64 member_ids: members,
65 });
66 }
67
68 return Ok(roles);
69 }
70
71 pub async fn find_server_members(
72 &self,
73 server: &server::Model,
74 ) -> Result<Vec<CompleteMember>, DbErr> {
75 let mut members: Vec<CompleteMember> = Vec::new();
76
77 let members_found = server
78 .clone()
79 .find_related(member::Entity)
80 .all(&self.client as &DbConn)
81 .await;
82
83 let ok_members: Vec<member::Model> = match members_found {
84 Ok(res) => res,
85 Err(err) => return Err(err),
86 };
87
88 for member in ok_members {
89 let roles_local = member
90 .find_related(role::Entity)
91 .all(&self.client as &DbConn)
92 .await
93 .unwrap()
94 .iter()
95 .map(|val| val.id)
96 .collect();
97
98 members.push(CompleteMember {
99 id: member.id,
100 name: member.name,
101 nick: member.nick,
102 server_id: member.server_id,
103 role_ids: roles_local,
104 });
105 }
106
107 return Ok(members);
108 }
109
110 pub async fn find_server_channels(
111 &self,
112 server: &server::Model,
113 ) -> Result<Vec<channel::Model>, DbErr> {
114 let channels = server
115 .clone()
116 .find_related(channel::Entity)
117 .all(&self.client as &DbConn)
118 .await;
119
120 return channels;
121 }
122}