Delete notifications when deleting comments (#499)
* Implement find_for_comment for notifications * Delete notifications when deleting a comment This should tackle #463 * Apply rustfmt * Implement `find_for_mention` and remove order by from `find_for_comment` There is no need to order the notifications * Delete notifications for mentions * Fix notifications for comments and mentions
This commit is contained in:
		
							parent
							
								
									f0d6b9d1e8
								
							
						
					
					
						commit
						c7ee779f51
					
				| @ -330,9 +330,17 @@ impl<'a> Deletable<Connection, Delete> for Comment { | |||||||
|         act.object_props |         act.object_props | ||||||
|             .set_to_link_vec(vec![Id::new(PUBLIC_VISIBILTY)])?; |             .set_to_link_vec(vec![Id::new(PUBLIC_VISIBILTY)])?; | ||||||
| 
 | 
 | ||||||
|         for m in Mention::list_for_comment(&conn, self.id)? { |         for m in Mention::list_for_comment(conn, self.id)? { | ||||||
|  |             for n in Notification::find_for_mention(conn, &m)? { | ||||||
|  |                 n.delete(conn)?; | ||||||
|  |             } | ||||||
|             m.delete(conn)?; |             m.delete(conn)?; | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         for n in Notification::find_for_comment(conn, &self)? { | ||||||
|  |             n.delete(conn)?; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         diesel::update(comments::table) |         diesel::update(comments::table) | ||||||
|             .filter(comments::in_response_to_id.eq(self.id)) |             .filter(comments::in_response_to_id.eq(self.id)) | ||||||
|             .set(comments::in_response_to_id.eq(self.in_response_to_id)) |             .set(comments::in_response_to_id.eq(self.in_response_to_id)) | ||||||
|  | |||||||
| @ -59,7 +59,7 @@ fn get_rocket_config() -> Result<RocketConfig, RocketError> { | |||||||
| pub struct LogoConfig { | pub struct LogoConfig { | ||||||
|     pub main: String, |     pub main: String, | ||||||
|     pub favicon: String, |     pub favicon: String, | ||||||
|     pub other: Vec<Icon> //url, size, type
 |     pub other: Vec<Icon>, //url, size, type
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Serialize)] | #[derive(Serialize)] | ||||||
| @ -82,14 +82,12 @@ impl Icon { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| impl Default for LogoConfig { | impl Default for LogoConfig { | ||||||
|     fn default() -> Self { |     fn default() -> Self { | ||||||
|         let to_icon = |(src, sizes, image_type): &(&str, Option<&str>, Option<&str>)| Icon { |         let to_icon = |(src, sizes, image_type): &(&str, Option<&str>, Option<&str>)| Icon { | ||||||
|             src: str::to_owned(src), |             src: str::to_owned(src), | ||||||
|             sizes: sizes.map(str::to_owned), |             sizes: sizes.map(str::to_owned), | ||||||
|             image_type: image_type.map(str::to_owned) |             image_type: image_type.map(str::to_owned), | ||||||
|         }; |         }; | ||||||
|         let icons = [ |         let icons = [ | ||||||
|             ( |             ( | ||||||
| @ -132,29 +130,34 @@ impl Default for LogoConfig { | |||||||
|                 Some("512x512"), |                 Some("512x512"), | ||||||
|                 Some("image/png"), |                 Some("image/png"), | ||||||
|             ), |             ), | ||||||
|             ( |             ("icons/trwnh/feather/plumeFeather.svg", None, None), | ||||||
|                 "icons/trwnh/feather/plumeFeather.svg", |         ] | ||||||
|                 None, |         .iter() | ||||||
|                 None, |         .map(to_icon) | ||||||
|             ) |         .collect(); | ||||||
|         ].iter().map(to_icon).collect(); |  | ||||||
| 
 | 
 | ||||||
|         let custom_main = var("PLUME_LOGO").ok(); |         let custom_main = var("PLUME_LOGO").ok(); | ||||||
|         let custom_favicon = var("PLUME_LOGO_FAVICON").ok().or_else(|| custom_main.clone()); |         let custom_favicon = var("PLUME_LOGO_FAVICON") | ||||||
|  |             .ok() | ||||||
|  |             .or_else(|| custom_main.clone()); | ||||||
|         let other = if let Some(main) = custom_main.clone() { |         let other = if let Some(main) = custom_main.clone() { | ||||||
|             let ext = |path: &str| match path.rsplitn(2, '.').next() { |             let ext = |path: &str| match path.rsplitn(2, '.').next() { | ||||||
|                 Some("png") => Some("image/png".to_owned()), |                 Some("png") => Some("image/png".to_owned()), | ||||||
|                 Some("jpg")| Some("jpeg") => Some("image/jpeg".to_owned()), |                 Some("jpg") | Some("jpeg") => Some("image/jpeg".to_owned()), | ||||||
|                 Some("svg") => Some("image/svg+xml".to_owned()), |                 Some("svg") => Some("image/svg+xml".to_owned()), | ||||||
|                 Some("webp") => Some("image/webp".to_owned()), |                 Some("webp") => Some("image/webp".to_owned()), | ||||||
|                 _ => None, |                 _ => None, | ||||||
|             }; |             }; | ||||||
|             let mut custom_icons = env::vars() |             let mut custom_icons = env::vars() | ||||||
|                 .filter_map(|(var, val)| if var.starts_with("PLUME_LOGO_") { |                 .filter_map(|(var, val)| { | ||||||
|  |                     if var.starts_with("PLUME_LOGO_") { | ||||||
|                         Some((var[11..].to_owned(), val)) |                         Some((var[11..].to_owned(), val)) | ||||||
|                 } else { None }) |                     } else { | ||||||
|                 .filter_map(|(var, val)| var.parse::<u64>().ok().map(|var| (var,val))) |                         None | ||||||
|                 .map(|(dim,src)| Icon { |                     } | ||||||
|  |                 }) | ||||||
|  |                 .filter_map(|(var, val)| var.parse::<u64>().ok().map(|var| (var, val))) | ||||||
|  |                 .map(|(dim, src)| Icon { | ||||||
|                     image_type: ext(&src), |                     image_type: ext(&src), | ||||||
|                     src, |                     src, | ||||||
|                     sizes: Some(format!("{}x{}", dim, dim)), |                     sizes: Some(format!("{}x{}", dim, dim)), | ||||||
| @ -171,8 +174,11 @@ impl Default for LogoConfig { | |||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         LogoConfig { |         LogoConfig { | ||||||
|             main: custom_main.unwrap_or_else(|| "icons/trwnh/feather/plumeFeather256.png".to_owned()), |             main: custom_main | ||||||
|             favicon: custom_favicon.unwrap_or_else(|| "icons/trwnh/feather-filled/plumeFeatherFilled64.png".to_owned()), |                 .unwrap_or_else(|| "icons/trwnh/feather/plumeFeather256.png".to_owned()), | ||||||
|  |             favicon: custom_favicon.unwrap_or_else(|| { | ||||||
|  |                 "icons/trwnh/feather-filled/plumeFeatherFilled64.png".to_owned() | ||||||
|  |             }), | ||||||
|             other, |             other, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -48,6 +48,22 @@ impl Notification { | |||||||
|             .map_err(Error::from) |             .map_err(Error::from) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     pub fn find_for_mention(conn: &Connection, mention: &Mention) -> Result<Vec<Notification>> { | ||||||
|  |         notifications::table | ||||||
|  |             .filter(notifications::kind.eq(notification_kind::MENTION)) | ||||||
|  |             .filter(notifications::object_id.eq(mention.id)) | ||||||
|  |             .load::<Notification>(conn) | ||||||
|  |             .map_err(Error::from) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn find_for_comment(conn: &Connection, comment: &Comment) -> Result<Vec<Notification>> { | ||||||
|  |         notifications::table | ||||||
|  |             .filter(notifications::kind.eq(notification_kind::COMMENT)) | ||||||
|  |             .filter(notifications::object_id.eq(comment.id)) | ||||||
|  |             .load::<Notification>(conn) | ||||||
|  |             .map_err(Error::from) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     pub fn count_for_user(conn: &Connection, user: &User) -> Result<i64> { |     pub fn count_for_user(conn: &Connection, user: &User) -> Result<i64> { | ||||||
|         notifications::table |         notifications::table | ||||||
|             .filter(notifications::user_id.eq(user.id)) |             .filter(notifications::user_id.eq(user.id)) | ||||||
|  | |||||||
| @ -7,7 +7,11 @@ use validator::Validate; | |||||||
| use std::time::Duration; | use std::time::Duration; | ||||||
| 
 | 
 | ||||||
| use plume_common::{ | use plume_common::{ | ||||||
|     activity_pub::{broadcast, inbox::Deletable, ActivityStream, ApRequest}, |     activity_pub::{ | ||||||
|  |         broadcast, | ||||||
|  |         inbox::{Deletable, Notify}, | ||||||
|  |         ActivityStream, ApRequest, | ||||||
|  |     }, | ||||||
|     utils, |     utils, | ||||||
| }; | }; | ||||||
| use plume_models::{ | use plume_models::{ | ||||||
| @ -60,6 +64,7 @@ pub fn create( | |||||||
|                 }, |                 }, | ||||||
|             ) |             ) | ||||||
|             .expect("comments::create: insert error"); |             .expect("comments::create: insert error"); | ||||||
|  |             comm.notify(&*conn).expect("comments::create: notify error"); | ||||||
|             let new_comment = comm |             let new_comment = comm | ||||||
|                 .create_activity(&*conn) |                 .create_activity(&*conn) | ||||||
|                 .expect("comments::create: activity error"); |                 .expect("comments::create: activity error"); | ||||||
| @ -70,8 +75,8 @@ pub fn create( | |||||||
|                     &*conn, |                     &*conn, | ||||||
|                     &Mention::build_activity(&*conn, &ment) |                     &Mention::build_activity(&*conn, &ment) | ||||||
|                         .expect("comments::create: build mention error"), |                         .expect("comments::create: build mention error"), | ||||||
|                     post.id, |                     comm.id, | ||||||
|                     true, |                     false, | ||||||
|                     true, |                     true, | ||||||
|                 ) |                 ) | ||||||
|                 .expect("comments::create: mention save error"); |                 .expect("comments::create: mention save error"); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user