use sqlx::PgConnection;
use uuid::Uuid;
pub struct MessageEditRepository;
impl MessageEditRepository {
pub fn new() -> Self {
Self
}
pub async fn message_authors(
conn: &mut PgConnection,
message_id: Uuid,
) -> Result<Option<(Option<Uuid>, Option<Uuid>)>, sqlx::Error> {
sqlx::query_as(
r#"SELECT author_id, author_guest_id FROM messaging.mail_messages
WHERE id = $1 AND (metadata->>'deleted_at') IS NULL"#,
)
.bind(message_id)
.fetch_optional(&mut *conn)
.await
}
pub async fn update_content(
conn: &mut PgConnection,
message_id: Uuid,
subject: Option<&str>,
body: Option<&str>,
) -> Result<bool, sqlx::Error> {
let res = sqlx::query(r#"
UPDATE messaging.mail_messages
SET subject = COALESCE($2, subject),
body = COALESCE($3, body)
WHERE id = $1
"#)
.bind(message_id)
.bind(subject)
.bind(body)
.execute(&mut *conn)
.await?;
Ok(res.rows_affected() > 0)
}
pub async fn channel_key(
conn: &mut PgConnection,
message_id: Uuid,
) -> Result<Option<String>, sqlx::Error> {
sqlx::query_scalar::<_, Option<String>>(
r#"SELECT model || '_' || res_id::text FROM messaging.mail_messages WHERE id = $1"#,
)
.bind(message_id)
.fetch_one(&mut *conn)
.await
}
pub async fn delete_star(
conn: &mut PgConnection,
partner_id: Uuid,
message_id: Uuid,
) -> Result<bool, sqlx::Error> {
let res = sqlx::query(r#"
DELETE FROM messaging.mail_message_stars
WHERE partner_id = $1 AND message_id = $2
"#)
.bind(partner_id)
.bind(message_id)
.execute(&mut *conn)
.await?;
Ok(res.rows_affected() > 0)
}
pub async fn insert_star(
conn: &mut PgConnection,
id: Uuid,
partner_id: Uuid,
message_id: Uuid,
) -> Result<bool, sqlx::Error> {
let res = sqlx::query(r#"
INSERT INTO messaging.mail_message_stars (id, partner_id, message_id)
VALUES ($1, $2, $3)
ON CONFLICT DO NOTHING
"#)
.bind(id)
.bind(partner_id)
.bind(message_id)
.execute(&mut *conn)
.await?;
Ok(res.rows_affected() > 0)
}
}
impl Default for MessageEditRepository {
fn default() -> Self {
Self::new()
}
}