]> Untitled Git - lemmy.git/blobdiff - crates/db_schema/src/impls/comment_report.rs
Automatically resolve report when post/comment is removed (#3850)
[lemmy.git] / crates / db_schema / src / impls / comment_report.rs
index 56e917e028f0135effae2521ef156ff9fc20f8d8..19c12876f7679d8523060a78d7e1665b2b7587a9 100644 (file)
@@ -1,23 +1,39 @@
 use crate::{
-  newtypes::{CommentReportId, PersonId},
+  newtypes::{CommentId, CommentReportId, PersonId},
+  schema::comment_report::{
+    comment_id,
+    dsl::{comment_report, resolved, resolver_id, updated},
+  },
   source::comment_report::{CommentReport, CommentReportForm},
   traits::Reportable,
-  utils::naive_now,
+  utils::{get_conn, naive_now, DbPool},
 };
-use diesel::{dsl::*, result::Error, *};
+use diesel::{
+  dsl::{insert_into, update},
+  result::Error,
+  ExpressionMethods,
+  QueryDsl,
+};
+use diesel_async::RunQueryDsl;
 
+#[async_trait]
 impl Reportable for CommentReport {
   type Form = CommentReportForm;
   type IdType = CommentReportId;
+  type ObjectIdType = CommentId;
   /// creates a comment report and returns it
   ///
   /// * `conn` - the postgres connection
   /// * `comment_report_form` - the filled CommentReportForm to insert
-  fn report(conn: &PgConnection, comment_report_form: &CommentReportForm) -> Result<Self, Error> {
-    use crate::schema::comment_report::dsl::*;
+  async fn report(
+    pool: &mut DbPool<'_>,
+    comment_report_form: &CommentReportForm,
+  ) -> Result<Self, Error> {
+    let conn = &mut get_conn(pool).await?;
     insert_into(comment_report)
       .values(comment_report_form)
       .get_result::<Self>(conn)
+      .await
   }
 
   /// resolve a comment report
@@ -25,19 +41,36 @@ impl Reportable for CommentReport {
   /// * `conn` - the postgres connection
   /// * `report_id` - the id of the report to resolve
   /// * `by_resolver_id` - the id of the user resolving the report
-  fn resolve(
-    conn: &PgConnection,
-    report_id: Self::IdType,
+  async fn resolve(
+    pool: &mut DbPool<'_>,
+    report_id_: Self::IdType,
+    by_resolver_id: PersonId,
+  ) -> Result<usize, Error> {
+    let conn = &mut get_conn(pool).await?;
+    update(comment_report.find(report_id_))
+      .set((
+        resolved.eq(true),
+        resolver_id.eq(by_resolver_id),
+        updated.eq(naive_now()),
+      ))
+      .execute(conn)
+      .await
+  }
+
+  async fn resolve_all_for_object(
+    pool: &mut DbPool<'_>,
+    comment_id_: CommentId,
     by_resolver_id: PersonId,
   ) -> Result<usize, Error> {
-    use crate::schema::comment_report::dsl::*;
-    update(comment_report.find(report_id))
+    let conn = &mut get_conn(pool).await?;
+    update(comment_report.filter(comment_id.eq(comment_id_)))
       .set((
         resolved.eq(true),
         resolver_id.eq(by_resolver_id),
         updated.eq(naive_now()),
       ))
       .execute(conn)
+      .await
   }
 
   /// unresolve a comment report
@@ -45,18 +78,19 @@ impl Reportable for CommentReport {
   /// * `conn` - the postgres connection
   /// * `report_id` - the id of the report to unresolve
   /// * `by_resolver_id` - the id of the user unresolving the report
-  fn unresolve(
-    conn: &PgConnection,
-    report_id: Self::IdType,
+  async fn unresolve(
+    pool: &mut DbPool<'_>,
+    report_id_: Self::IdType,
     by_resolver_id: PersonId,
   ) -> Result<usize, Error> {
-    use crate::schema::comment_report::dsl::*;
-    update(comment_report.find(report_id))
+    let conn = &mut get_conn(pool).await?;
+    update(comment_report.find(report_id_))
       .set((
         resolved.eq(false),
         resolver_id.eq(by_resolver_id),
         updated.eq(naive_now()),
       ))
       .execute(conn)
+      .await
   }
 }