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}