use crate::{ newtypes::{PersonId, PrivateMessageReportId}, schema::private_message_report::dsl::{private_message_report, resolved, resolver_id, updated}, source::private_message_report::{PrivateMessageReport, PrivateMessageReportForm}, traits::Reportable, utils::{get_conn, naive_now, DbPool}, }; use diesel::{ dsl::{insert_into, update}, result::Error, ExpressionMethods, QueryDsl, }; use diesel_async::RunQueryDsl; #[async_trait] impl Reportable for PrivateMessageReport { type Form = PrivateMessageReportForm; type IdType = PrivateMessageReportId; async fn report(pool: &DbPool, pm_report_form: &PrivateMessageReportForm) -> Result { let conn = &mut get_conn(pool).await?; insert_into(private_message_report) .values(pm_report_form) .get_result::(conn) .await } async fn resolve( pool: &DbPool, report_id: Self::IdType, by_resolver_id: PersonId, ) -> Result { let conn = &mut get_conn(pool).await?; update(private_message_report.find(report_id)) .set(( resolved.eq(true), resolver_id.eq(by_resolver_id), updated.eq(naive_now()), )) .execute(conn) .await } async fn unresolve( pool: &DbPool, report_id: Self::IdType, by_resolver_id: PersonId, ) -> Result { let conn = &mut get_conn(pool).await?; update(private_message_report.find(report_id)) .set(( resolved.eq(false), resolver_id.eq(by_resolver_id), updated.eq(naive_now()), )) .execute(conn) .await } }