X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fdb_schema%2Fsrc%2Fimpls%2Fcomment.rs;h=5346343264036523d86359132183463de95a0b01;hb=92568956353f21649ed9aff68b42699c9d036f30;hp=21dc6c26b9f2fc9d4b7170398f2655fde5de09c8;hpb=a610211557a15c00f9591e0515c781d46c26890f;p=lemmy.git diff --git a/crates/db_schema/src/impls/comment.rs b/crates/db_schema/src/impls/comment.rs index 21dc6c26..53463432 100644 --- a/crates/db_schema/src/impls/comment.rs +++ b/crates/db_schema/src/impls/comment.rs @@ -10,8 +10,8 @@ use crate::{ CommentSavedForm, CommentUpdateForm, }, - traits::{Crud, DeleteableOrRemoveable, Likeable, Saveable}, - utils::{get_conn, naive_now, DbPool}, + traits::{Crud, Likeable, Saveable}, + utils::{get_conn, naive_now, DbPool, DELETED_REPLACEMENT_TEXT}, }; use diesel::{ dsl::{insert_into, sql_query}, @@ -25,13 +25,14 @@ use url::Url; impl Comment { pub async fn permadelete_for_creator( - pool: &DbPool, + pool: &mut DbPool<'_>, for_creator_id: PersonId, ) -> Result, Error> { let conn = &mut get_conn(pool).await?; + diesel::update(comment.filter(creator_id.eq(for_creator_id))) .set(( - content.eq("*Permananently Deleted*"), + content.eq(DELETED_REPLACEMENT_TEXT), deleted.eq(true), updated.eq(naive_now()), )) @@ -40,7 +41,7 @@ impl Comment { } pub async fn update_removed_for_creator( - pool: &DbPool, + pool: &mut DbPool<'_>, for_creator_id: PersonId, new_removed: bool, ) -> Result, Error> { @@ -52,7 +53,7 @@ impl Comment { } pub async fn create( - pool: &DbPool, + pool: &mut DbPool<'_>, comment_form: &CommentInsertForm, parent_path: Option<&Ltree>, ) -> Result { @@ -98,9 +99,12 @@ impl Comment { // left join comment c2 on c2.path <@ c.path and c2.path != c.path // group by c.id - let top_parent = format!("0.{}", parent_path.0.split('.').collect::>()[1]); - let update_child_count_stmt = format!( - " + let parent_id = parent_path.0.split('.').nth(1); + + if let Some(parent_id) = parent_id { + let top_parent = format!("0.{}", parent_id); + let update_child_count_stmt = format!( + " update comment_aggregates ca set child_count = c.child_count from ( select c.id, c.path, count(c2.id) as child_count from comment c @@ -109,16 +113,20 @@ from ( group by c.id ) as c where ca.comment_id = c.id" - ); + ); - sql_query(update_child_count_stmt).execute(conn).await?; + sql_query(update_child_count_stmt).execute(conn).await?; + } } updated_comment } else { inserted_comment } } - pub async fn read_from_apub_id(pool: &DbPool, object_id: Url) -> Result, Error> { + pub async fn read_from_apub_id( + pool: &mut DbPool<'_>, + object_id: Url, + ) -> Result, Error> { let conn = &mut get_conn(pool).await?; let object_id: DbUrl = object_id.into(); Ok( @@ -135,10 +143,8 @@ where ca.comment_id = c.id" let mut ltree_split: Vec<&str> = self.path.0.split('.').collect(); ltree_split.remove(0); // The first is always 0 if ltree_split.len() > 1 { - ltree_split[ltree_split.len() - 2] - .parse::() - .map(CommentId) - .ok() + let parent_comment_id = ltree_split.get(ltree_split.len() - 2); + parent_comment_id.and_then(|p| p.parse::().map(CommentId).ok()) } else { None } @@ -150,23 +156,23 @@ impl Crud for Comment { type InsertForm = CommentInsertForm; type UpdateForm = CommentUpdateForm; type IdType = CommentId; - async fn read(pool: &DbPool, comment_id: CommentId) -> Result { + async fn read(pool: &mut DbPool<'_>, comment_id: CommentId) -> Result { let conn = &mut get_conn(pool).await?; comment.find(comment_id).first::(conn).await } - async fn delete(pool: &DbPool, comment_id: CommentId) -> Result { + async fn delete(pool: &mut DbPool<'_>, comment_id: CommentId) -> Result { let conn = &mut get_conn(pool).await?; diesel::delete(comment.find(comment_id)).execute(conn).await } /// This is unimplemented, use [[Comment::create]] - async fn create(_pool: &DbPool, _comment_form: &Self::InsertForm) -> Result { + async fn create(_pool: &mut DbPool<'_>, _comment_form: &Self::InsertForm) -> Result { unimplemented!(); } async fn update( - pool: &DbPool, + pool: &mut DbPool<'_>, comment_id: CommentId, comment_form: &Self::UpdateForm, ) -> Result { @@ -182,7 +188,7 @@ impl Crud for Comment { impl Likeable for CommentLike { type Form = CommentLikeForm; type IdType = CommentId; - async fn like(pool: &DbPool, comment_like_form: &CommentLikeForm) -> Result { + async fn like(pool: &mut DbPool<'_>, comment_like_form: &CommentLikeForm) -> Result { use crate::schema::comment_like::dsl::{comment_id, comment_like, person_id}; let conn = &mut get_conn(pool).await?; insert_into(comment_like) @@ -194,7 +200,7 @@ impl Likeable for CommentLike { .await } async fn remove( - pool: &DbPool, + pool: &mut DbPool<'_>, person_id_: PersonId, comment_id_: CommentId, ) -> Result { @@ -213,7 +219,10 @@ impl Likeable for CommentLike { #[async_trait] impl Saveable for CommentSaved { type Form = CommentSavedForm; - async fn save(pool: &DbPool, comment_saved_form: &CommentSavedForm) -> Result { + async fn save( + pool: &mut DbPool<'_>, + comment_saved_form: &CommentSavedForm, + ) -> Result { use crate::schema::comment_saved::dsl::{comment_id, comment_saved, person_id}; let conn = &mut get_conn(pool).await?; insert_into(comment_saved) @@ -224,7 +233,10 @@ impl Saveable for CommentSaved { .get_result::(conn) .await } - async fn unsave(pool: &DbPool, comment_saved_form: &CommentSavedForm) -> Result { + async fn unsave( + pool: &mut DbPool<'_>, + comment_saved_form: &CommentSavedForm, + ) -> Result { use crate::schema::comment_saved::dsl::{comment_id, comment_saved, person_id}; let conn = &mut get_conn(pool).await?; diesel::delete( @@ -237,15 +249,11 @@ impl Saveable for CommentSaved { } } -impl DeleteableOrRemoveable for Comment { - fn blank_out_deleted_or_removed_info(mut self) -> Self { - self.content = String::new(); - self - } -} - #[cfg(test)] mod tests { + #![allow(clippy::unwrap_used)] + #![allow(clippy::indexing_slicing)] + use crate::{ newtypes::LanguageId, source::{ @@ -273,8 +281,11 @@ mod tests { #[serial] async fn test_crud() { let pool = &build_db_pool_for_tests().await; + let pool = &mut pool.into(); - let inserted_instance = Instance::create(pool, "my_domain.tld").await.unwrap(); + let inserted_instance = Instance::read_or_create(pool, "my_domain.tld".to_string()) + .await + .unwrap(); let new_person = PersonInsertForm::builder() .name("terry".into())