backend/objects/
bans.rs

1use diesel::{ExpressionMethods, QueryDsl, Queryable, Selectable, SelectableHelper};
2use serde::{Deserialize, Serialize};
3use uuid::Uuid;
4
5use diesel_async::RunQueryDsl;
6
7use crate::{Conn, error::Error, objects::load_or_empty, schema::guild_bans};
8
9#[derive(Selectable, Queryable, Serialize, Deserialize)]
10#[diesel(table_name = guild_bans)]
11#[diesel(check_for_backend(diesel::pg::Pg))]
12pub struct GuildBan {
13    pub guild_uuid: Uuid,
14    pub user_uuid: Uuid,
15    pub reason: Option<String>,
16    pub banned_since: chrono::DateTime<chrono::Utc>,
17}
18
19impl GuildBan {
20    pub async fn fetch_one(
21        conn: &mut Conn,
22        guild_uuid: Uuid,
23        user_uuid: Uuid,
24    ) -> Result<GuildBan, Error> {
25        use guild_bans::dsl;
26        let guild_ban = dsl::guild_bans
27            .filter(dsl::guild_uuid.eq(guild_uuid))
28            .filter(dsl::user_uuid.eq(user_uuid))
29            .select(GuildBan::as_select())
30            .get_result(conn)
31            .await?;
32
33        Ok(guild_ban)
34    }
35
36    pub async fn fetch_all(conn: &mut Conn, guild_uuid: Uuid) -> Result<Vec<Self>, Error> {
37        use guild_bans::dsl;
38        let all_guild_bans = load_or_empty(
39            dsl::guild_bans
40                .filter(dsl::guild_uuid.eq(guild_uuid))
41                .load(conn)
42                .await,
43        )?;
44
45        Ok(all_guild_bans)
46    }
47
48    pub async fn unban(self, conn: &mut Conn) -> Result<(), Error> {
49        use guild_bans::dsl;
50        diesel::delete(guild_bans::table)
51            .filter(dsl::guild_uuid.eq(self.guild_uuid))
52            .filter(dsl::user_uuid.eq(self.user_uuid))
53            .execute(conn)
54            .await?;
55        Ok(())
56    }
57}