backend/objects/
message.rs1use 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}