backend/objects/
message.rs

1use diesel::{ExpressionMethods, Insertable, QueryDsl, Queryable, Selectable};
2use diesel_async::RunQueryDsl;
3use serde::Serialize;
4use uuid::Uuid;
5
6use crate::{
7    Conn,
8    error::Error,
9    schema::{channels, guilds, messages},
10};
11
12use super::Member;
13
14#[derive(Clone, Queryable, Selectable, Insertable)]
15#[diesel(table_name = messages)]
16#[diesel(check_for_backend(diesel::pg::Pg))]
17pub struct MessageBuilder {
18    pub uuid: Uuid,
19    pub channel_uuid: Uuid,
20    pub user_uuid: Uuid,
21    pub message: String,
22    pub reply_to: Option<Uuid>,
23}
24
25impl MessageBuilder {
26    pub async fn build(
27        &self,
28        conn: &mut Conn,
29        cache_pool: &redis::Client,
30    ) -> Result<Message, Error> {
31        use channels::dsl;
32
33        let guild_uuid = dsl::channels
34            .filter(dsl::uuid.eq(self.channel_uuid))
35            .inner_join(guilds::table)
36            .select(guilds::uuid)
37            .get_result(conn)
38            .await?;
39
40        let member = Member::fetch_one(conn, cache_pool, None, self.user_uuid, guild_uuid).await?;
41
42        Ok(Message {
43            uuid: self.uuid,
44            channel_uuid: self.channel_uuid,
45            user_uuid: self.user_uuid,
46            message: self.message.clone(),
47            reply_to: self.reply_to,
48            member,
49        })
50    }
51}
52
53#[derive(Clone, Serialize)]
54pub struct Message {
55    uuid: Uuid,
56    channel_uuid: Uuid,
57    user_uuid: Uuid,
58    message: String,
59    reply_to: Option<Uuid>,
60    member: Member,
61}