]> Untitled Git - lemmy.git/blobdiff - crates/db_views/src/comment_report_view.rs
Diesel 2.0.0 upgrade (#2452)
[lemmy.git] / crates / db_views / src / comment_report_view.rs
index 52089ec57d7289f4c738939b4194a6da5ab45827..50564b0ab72a7fd471842e01f905ba44b227f14c 100644 (file)
@@ -1,7 +1,7 @@
+use crate::structs::CommentReportView;
 use diesel::{dsl::*, result::Error, *};
 use lemmy_db_schema::{
-  aggregates::comment_aggregates::CommentAggregates,
-  limit_and_offset,
+  aggregates::structs::CommentAggregates,
   newtypes::{CommentReportId, CommunityId, PersonId},
   schema::{
     comment,
@@ -12,34 +12,19 @@ use lemmy_db_schema::{
     community_moderator,
     community_person_ban,
     person,
-    person_alias_1,
-    person_alias_2,
     post,
   },
   source::{
     comment::Comment,
     comment_report::CommentReport,
     community::{Community, CommunityPersonBan, CommunitySafe},
-    person::{Person, PersonAlias1, PersonAlias2, PersonSafe, PersonSafeAlias1, PersonSafeAlias2},
+    person::{Person, PersonSafe},
     post::Post,
   },
-  traits::{MaybeOptional, ToSafe, ViewToVec},
+  traits::{ToSafe, ViewToVec},
+  utils::limit_and_offset,
 };
-use serde::{Deserialize, Serialize};
-
-#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
-pub struct CommentReportView {
-  pub comment_report: CommentReport,
-  pub comment: Comment,
-  pub post: Post,
-  pub community: CommunitySafe,
-  pub creator: PersonSafe,
-  pub comment_creator: PersonSafeAlias1,
-  pub counts: CommentAggregates,
-  pub creator_banned_from_community: bool, // Left Join to CommunityPersonBan
-  pub my_vote: Option<i16>,                // Left join to CommentLike
-  pub resolver: Option<PersonSafeAlias2>,
-}
+use typed_builder::TypedBuilder;
 
 type CommentReportViewTuple = (
   CommentReport,
@@ -47,11 +32,11 @@ type CommentReportViewTuple = (
   Post,
   CommunitySafe,
   PersonSafe,
-  PersonSafeAlias1,
+  PersonSafe,
   CommentAggregates,
   Option<CommunityPersonBan>,
   Option<i16>,
-  Option<PersonSafeAlias2>,
+  Option<PersonSafe>,
 );
 
 impl CommentReportView {
@@ -59,10 +44,12 @@ impl CommentReportView {
   ///
   /// * `report_id` - the report id to obtain
   pub fn read(
-    conn: &PgConnection,
+    conn: &mut PgConnection,
     report_id: CommentReportId,
     my_person_id: PersonId,
   ) -> Result<Self, Error> {
+    let (person_alias_1, person_alias_2) = diesel::alias!(person as person1, person as person2);
+
     let (
       comment_report,
       comment,
@@ -80,7 +67,7 @@ impl CommentReportView {
       .inner_join(post::table.on(comment::post_id.eq(post::id)))
       .inner_join(community::table.on(post::community_id.eq(community::id)))
       .inner_join(person::table.on(comment_report::creator_id.eq(person::id)))
-      .inner_join(person_alias_1::table.on(comment::creator_id.eq(person_alias_1::id)))
+      .inner_join(person_alias_1.on(comment::creator_id.eq(person_alias_1.field(person::id))))
       .inner_join(
         comment_aggregates::table.on(comment_report::comment_id.eq(comment_aggregates::comment_id)),
       )
@@ -104,7 +91,8 @@ impl CommentReportView {
         ),
       )
       .left_join(
-        person_alias_2::table.on(comment_report::resolver_id.eq(person_alias_2::id.nullable())),
+        person_alias_2
+          .on(comment_report::resolver_id.eq(person_alias_2.field(person::id).nullable())),
       )
       .select((
         comment_report::all_columns,
@@ -112,19 +100,17 @@ impl CommentReportView {
         post::all_columns,
         Community::safe_columns_tuple(),
         Person::safe_columns_tuple(),
-        PersonAlias1::safe_columns_tuple(),
+        person_alias_1.fields(Person::safe_columns_tuple()),
         comment_aggregates::all_columns,
         community_person_ban::all_columns.nullable(),
         comment_like::score.nullable(),
-        PersonAlias2::safe_columns_tuple().nullable(),
+        person_alias_2
+          .fields(Person::safe_columns_tuple())
+          .nullable(),
       ))
       .first::<CommentReportViewTuple>(conn)?;
 
-    let my_vote = if comment_like.is_none() {
-      None
-    } else {
-      comment_like
-    };
+    let my_vote = comment_like;
 
     Ok(Self {
       comment_report,
@@ -142,7 +128,7 @@ impl CommentReportView {
 
   /// Returns the current unresolved post report count for the communities you mod
   pub fn get_report_count(
-    conn: &PgConnection,
+    conn: &mut PgConnection,
     my_person_id: PersonId,
     admin: bool,
     community_id: Option<CommunityId>,
@@ -177,9 +163,14 @@ impl CommentReportView {
   }
 }
 
-pub struct CommentReportQueryBuilder<'a> {
-  conn: &'a PgConnection,
+#[derive(TypedBuilder)]
+#[builder(field_defaults(default))]
+pub struct CommentReportQuery<'a> {
+  #[builder(!default)]
+  conn: &'a mut PgConnection,
+  #[builder(!default)]
   my_person_id: PersonId,
+  #[builder(!default)]
   admin: bool,
   community_id: Option<CommunityId>,
   page: Option<i64>,
@@ -187,46 +178,16 @@ pub struct CommentReportQueryBuilder<'a> {
   unresolved_only: Option<bool>,
 }
 
-impl<'a> CommentReportQueryBuilder<'a> {
-  pub fn create(conn: &'a PgConnection, my_person_id: PersonId, admin: bool) -> Self {
-    CommentReportQueryBuilder {
-      conn,
-      my_person_id,
-      admin,
-      community_id: None,
-      page: None,
-      limit: None,
-      unresolved_only: Some(true),
-    }
-  }
-
-  pub fn community_id<T: MaybeOptional<CommunityId>>(mut self, community_id: T) -> Self {
-    self.community_id = community_id.get_optional();
-    self
-  }
-
-  pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
-    self.page = page.get_optional();
-    self
-  }
-
-  pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
-    self.limit = limit.get_optional();
-    self
-  }
-
-  pub fn unresolved_only<T: MaybeOptional<bool>>(mut self, unresolved_only: T) -> Self {
-    self.unresolved_only = unresolved_only.get_optional();
-    self
-  }
-
+impl<'a> CommentReportQuery<'a> {
   pub fn list(self) -> Result<Vec<CommentReportView>, Error> {
+    let (person_alias_1, person_alias_2) = diesel::alias!(person as person1, person as person2);
+
     let mut query = comment_report::table
       .inner_join(comment::table)
       .inner_join(post::table.on(comment::post_id.eq(post::id)))
       .inner_join(community::table.on(post::community_id.eq(community::id)))
       .inner_join(person::table.on(comment_report::creator_id.eq(person::id)))
-      .inner_join(person_alias_1::table.on(comment::creator_id.eq(person_alias_1::id)))
+      .inner_join(person_alias_1.on(comment::creator_id.eq(person_alias_1.field(person::id))))
       .inner_join(
         comment_aggregates::table.on(comment_report::comment_id.eq(comment_aggregates::comment_id)),
       )
@@ -250,7 +211,8 @@ impl<'a> CommentReportQueryBuilder<'a> {
         ),
       )
       .left_join(
-        person_alias_2::table.on(comment_report::resolver_id.eq(person_alias_2::id.nullable())),
+        person_alias_2
+          .on(comment_report::resolver_id.eq(person_alias_2.field(person::id).nullable())),
       )
       .select((
         comment_report::all_columns,
@@ -258,11 +220,13 @@ impl<'a> CommentReportQueryBuilder<'a> {
         post::all_columns,
         Community::safe_columns_tuple(),
         Person::safe_columns_tuple(),
-        PersonAlias1::safe_columns_tuple(),
+        person_alias_1.fields(Person::safe_columns_tuple()),
         comment_aggregates::all_columns,
         community_person_ban::all_columns.nullable(),
         comment_like::score.nullable(),
-        PersonAlias2::safe_columns_tuple().nullable(),
+        person_alias_2
+          .fields(Person::safe_columns_tuple())
+          .nullable(),
       ))
       .into_boxed();
 
@@ -270,11 +234,11 @@ impl<'a> CommentReportQueryBuilder<'a> {
       query = query.filter(post::community_id.eq(community_id));
     }
 
-    if self.unresolved_only.unwrap_or(false) {
+    if self.unresolved_only.unwrap_or(true) {
       query = query.filter(comment_report::resolved.eq(false));
     }
 
-    let (limit, offset) = limit_and_offset(self.page, self.limit);
+    let (limit, offset) = limit_and_offset(self.page, self.limit)?;
 
     query = query
       .order_by(comment_report::published.desc())
@@ -304,18 +268,18 @@ impl ViewToVec for CommentReportView {
   type DbTuple = CommentReportViewTuple;
   fn from_tuple_to_vec(items: Vec<Self::DbTuple>) -> Vec<Self> {
     items
-      .iter()
+      .into_iter()
       .map(|a| Self {
-        comment_report: a.0.to_owned(),
-        comment: a.1.to_owned(),
-        post: a.2.to_owned(),
-        community: a.3.to_owned(),
-        creator: a.4.to_owned(),
-        comment_creator: a.5.to_owned(),
-        counts: a.6.to_owned(),
+        comment_report: a.0,
+        comment: a.1,
+        post: a.2,
+        community: a.3,
+        creator: a.4,
+        comment_creator: a.5,
+        counts: a.6,
         creator_banned_from_community: a.7.is_some(),
         my_vote: a.8,
-        resolver: a.9.to_owned(),
+        resolver: a.9,
       })
       .collect::<Vec<Self>>()
   }
@@ -323,49 +287,53 @@ impl ViewToVec for CommentReportView {
 
 #[cfg(test)]
 mod tests {
-  use crate::comment_report_view::{CommentReportQueryBuilder, CommentReportView};
+  use crate::comment_report_view::{CommentReportQuery, CommentReportView};
   use lemmy_db_schema::{
-    aggregates::comment_aggregates::CommentAggregates,
-    establish_unpooled_connection,
+    aggregates::structs::CommentAggregates,
     source::{comment::*, comment_report::*, community::*, person::*, post::*},
     traits::{Crud, Joinable, Reportable},
+    utils::establish_unpooled_connection,
   };
   use serial_test::serial;
 
   #[test]
   #[serial]
   fn test_crud() {
-    let conn = establish_unpooled_connection();
+    let conn = &mut establish_unpooled_connection();
 
     let new_person = PersonForm {
       name: "timmy_crv".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
-    let inserted_timmy = Person::create(&conn, &new_person).unwrap();
+    let inserted_timmy = Person::create(conn, &new_person).unwrap();
 
     let new_person_2 = PersonForm {
       name: "sara_crv".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
-    let inserted_sara = Person::create(&conn, &new_person_2).unwrap();
+    let inserted_sara = Person::create(conn, &new_person_2).unwrap();
 
     // Add a third person, since new ppl can only report something once.
     let new_person_3 = PersonForm {
       name: "jessica_crv".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
-    let inserted_jessica = Person::create(&conn, &new_person_3).unwrap();
+    let inserted_jessica = Person::create(conn, &new_person_3).unwrap();
 
     let new_community = CommunityForm {
       name: "test community crv".to_string(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
-    let inserted_community = Community::create(&conn, &new_community).unwrap();
+    let inserted_community = Community::create(conn, &new_community).unwrap();
 
     // Make timmy a mod
     let timmy_moderator_form = CommunityModeratorForm {
@@ -373,7 +341,7 @@ mod tests {
       person_id: inserted_timmy.id,
     };
 
-    let _inserted_moderator = CommunityModerator::join(&conn, &timmy_moderator_form).unwrap();
+    let _inserted_moderator = CommunityModerator::join(conn, &timmy_moderator_form).unwrap();
 
     let new_post = PostForm {
       name: "A test post crv".into(),
@@ -382,7 +350,7 @@ mod tests {
       ..PostForm::default()
     };
 
-    let inserted_post = Post::create(&conn, &new_post).unwrap();
+    let inserted_post = Post::create(conn, &new_post).unwrap();
 
     let comment_form = CommentForm {
       content: "A test comment 32".into(),
@@ -391,7 +359,7 @@ mod tests {
       ..CommentForm::default()
     };
 
-    let inserted_comment = Comment::create(&conn, &comment_form).unwrap();
+    let inserted_comment = Comment::create(conn, &comment_form, None).unwrap();
 
     // sara reports
     let sara_report_form = CommentReportForm {
@@ -401,7 +369,7 @@ mod tests {
       reason: "from sara".into(),
     };
 
-    let inserted_sara_report = CommentReport::report(&conn, &sara_report_form).unwrap();
+    let inserted_sara_report = CommentReport::report(conn, &sara_report_form).unwrap();
 
     // jessica reports
     let jessica_report_form = CommentReportForm {
@@ -411,12 +379,12 @@ mod tests {
       reason: "from jessica".into(),
     };
 
-    let inserted_jessica_report = CommentReport::report(&conn, &jessica_report_form).unwrap();
+    let inserted_jessica_report = CommentReport::report(conn, &jessica_report_form).unwrap();
 
-    let agg = CommentAggregates::read(&conn, inserted_comment.id).unwrap();
+    let agg = CommentAggregates::read(conn, inserted_comment.id).unwrap();
 
     let read_jessica_report_view =
-      CommentReportView::read(&conn, inserted_jessica_report.id, inserted_timmy.id).unwrap();
+      CommentReportView::read(conn, inserted_jessica_report.id, inserted_timmy.id).unwrap();
     let expected_jessica_report_view = CommentReportView {
       comment_report: inserted_jessica_report.to_owned(),
       comment: inserted_comment.to_owned(),
@@ -434,6 +402,8 @@ mod tests {
         description: None,
         updated: None,
         banner: None,
+        hidden: false,
+        posting_restricted_to_mods: false,
         published: inserted_community.published,
       },
       creator: PersonSafe {
@@ -456,7 +426,7 @@ mod tests {
         matrix_user_id: None,
         ban_expires: None,
       },
-      comment_creator: PersonSafeAlias1 {
+      comment_creator: PersonSafe {
         id: inserted_timmy.id,
         name: inserted_timmy.name.to_owned(),
         display_name: None,
@@ -484,6 +454,7 @@ mod tests {
         upvotes: 0,
         downvotes: 0,
         published: agg.published,
+        child_count: 0,
       },
       my_vote: None,
       resolver: None,
@@ -515,7 +486,11 @@ mod tests {
     };
 
     // Do a batch read of timmys reports
-    let reports = CommentReportQueryBuilder::create(&conn, inserted_timmy.id, false)
+    let reports = CommentReportQuery::builder()
+      .conn(conn)
+      .my_person_id(inserted_timmy.id)
+      .admin(false)
+      .build()
       .list()
       .unwrap();
 
@@ -529,13 +504,13 @@ mod tests {
 
     // Make sure the counts are correct
     let report_count =
-      CommentReportView::get_report_count(&conn, inserted_timmy.id, false, None).unwrap();
+      CommentReportView::get_report_count(conn, inserted_timmy.id, false, None).unwrap();
     assert_eq!(2, report_count);
 
     // Try to resolve the report
-    CommentReport::resolve(&conn, inserted_jessica_report.id, inserted_timmy.id).unwrap();
+    CommentReport::resolve(conn, inserted_jessica_report.id, inserted_timmy.id).unwrap();
     let read_jessica_report_view_after_resolve =
-      CommentReportView::read(&conn, inserted_jessica_report.id, inserted_timmy.id).unwrap();
+      CommentReportView::read(conn, inserted_jessica_report.id, inserted_timmy.id).unwrap();
 
     let mut expected_jessica_report_view_after_resolve = expected_jessica_report_view;
     expected_jessica_report_view_after_resolve
@@ -549,7 +524,7 @@ mod tests {
       .updated = read_jessica_report_view_after_resolve
       .comment_report
       .updated;
-    expected_jessica_report_view_after_resolve.resolver = Some(PersonSafeAlias2 {
+    expected_jessica_report_view_after_resolve.resolver = Some(PersonSafe {
       id: inserted_timmy.id,
       name: inserted_timmy.name.to_owned(),
       display_name: None,
@@ -577,19 +552,24 @@ mod tests {
 
     // Do a batch read of timmys reports
     // It should only show saras, which is unresolved
-    let reports_after_resolve = CommentReportQueryBuilder::create(&conn, inserted_timmy.id, false)
+    let reports_after_resolve = CommentReportQuery::builder()
+      .conn(conn)
+      .my_person_id(inserted_timmy.id)
+      .admin(false)
+      .build()
       .list()
       .unwrap();
     assert_eq!(reports_after_resolve[0], expected_sara_report_view);
+    assert_eq!(reports_after_resolve.len(), 1);
 
     // Make sure the counts are correct
     let report_count_after_resolved =
-      CommentReportView::get_report_count(&conn, inserted_timmy.id, false, None).unwrap();
+      CommentReportView::get_report_count(conn, inserted_timmy.id, false, None).unwrap();
     assert_eq!(1, report_count_after_resolved);
 
-    Person::delete(&conn, inserted_timmy.id).unwrap();
-    Person::delete(&conn, inserted_sara.id).unwrap();
-    Person::delete(&conn, inserted_jessica.id).unwrap();
-    Community::delete(&conn, inserted_community.id).unwrap();
+    Person::delete(conn, inserted_timmy.id).unwrap();
+    Person::delete(conn, inserted_sara.id).unwrap();
+    Person::delete(conn, inserted_jessica.id).unwrap();
+    Community::delete(conn, inserted_community.id).unwrap();
   }
 }