mayhem_db/client/query/
server.rs

1use 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}