From f6f603324abb34ad9940f5ae8cbc02d460b6a1e2 Mon Sep 17 00:00:00 2001 From: asonix Date: Mon, 18 Jan 2021 11:21:41 -0600 Subject: [PATCH] Fix federated image update duplication for submissions --- profiles/src/apub/actions/apub/note.rs | 12 ++----- profiles/src/apub/actions/mod.rs | 5 +++ profiles/src/apub/actions/submission.rs | 42 ++++++++++++++++++++----- profiles/src/store/mod.rs | 8 ++--- 4 files changed, 46 insertions(+), 21 deletions(-) diff --git a/profiles/src/apub/actions/apub/note.rs b/profiles/src/apub/actions/apub/note.rs index bff338d..a054bde 100644 --- a/profiles/src/apub/actions/apub/note.rs +++ b/profiles/src/apub/actions/apub/note.rs @@ -405,20 +405,14 @@ pub(super) fn update_note( return Ok(Err(RecoverableError::MissingImages(missing_files))); } - let mut removed_files = vec![]; - for file in submission.files() { - if !existing_files.contains(file) { - removed_files.push(*file); - } - } - Ok(Ok(Box::new(UpdateSubmission { submission_id, title, description, published: Some(published.into()), - removed_files: Some(removed_files), - new_files: Some(existing_files), + removed_files: None, + new_files: None, + only_files: Some(existing_files), }))) } diff --git a/profiles/src/apub/actions/mod.rs b/profiles/src/apub/actions/mod.rs index 2ccd633..654391c 100644 --- a/profiles/src/apub/actions/mod.rs +++ b/profiles/src/apub/actions/mod.rs @@ -260,6 +260,7 @@ pub struct UpdateSubmission { published: Option>, removed_files: Option>, new_files: Option>, + only_files: Option>, } impl UpdateSubmission { @@ -271,6 +272,7 @@ impl UpdateSubmission { published: None, removed_files: None, new_files: None, + only_files: None, } } @@ -282,6 +284,7 @@ impl UpdateSubmission { published: None, removed_files: None, new_files: Some(vec![file_id]), + only_files: None, } } @@ -293,6 +296,7 @@ impl UpdateSubmission { published: None, removed_files: Some(vec![file_id]), new_files: None, + only_files: None, } } @@ -304,6 +308,7 @@ impl UpdateSubmission { published: Some(Utc::now()), removed_files: None, new_files: None, + only_files: None, } } } diff --git a/profiles/src/apub/actions/submission.rs b/profiles/src/apub/actions/submission.rs index 9fdff33..48f2d2d 100644 --- a/profiles/src/apub/actions/submission.rs +++ b/profiles/src/apub/actions/submission.rs @@ -2,6 +2,7 @@ use crate::{ apub::actions::{CreateSubmission, DeleteComment, DeleteSubmission, UpdateSubmission}, Action, Context, Error, Outbound, Required, }; +use std::collections::HashSet; impl Action for CreateSubmission { fn perform(&self, ctx: &Context) -> Result>, Error> { @@ -98,23 +99,50 @@ impl Action for UpdateSubmission { } let submission = ctx.store.submissions.update(&changes)?; + let mut removed_file_ids = HashSet::new(); let mut changes = submission.update_files(); - if let Some(removed) = &self.removed_files { - for file in removed { + if let Some(files) = &self.only_files { + for file in submission.files() { if let Ok(Some(file)) = ctx.store.files.by_id(*file) { changes.delete_file(&file); - ctx.spawner.purge_file(file.id()); + removed_file_ids.insert(file.id()); } } - } - if let Some(new) = &self.new_files { - for file in new { + + for file in files { if let Ok(Some(file)) = ctx.store.files.by_id(*file) { changes.add_file(&file); + removed_file_ids.remove(&file.id()); + } + } + } else { + if let Some(removed) = &self.removed_files { + for file in removed { + if let Ok(Some(file)) = ctx.store.files.by_id(*file) { + changes.delete_file(&file); + removed_file_ids.insert(file.id()); + } + } + } + if let Some(new) = &self.new_files { + for file in new { + if let Ok(Some(file)) = ctx.store.files.by_id(*file) { + changes.add_file(&file); + removed_file_ids.remove(&file.id()); + } } } } - ctx.store.submissions.update_files(&changes)?; + + for file_id in removed_file_ids { + ctx.spawner.purge_file(file_id); + } + + let submission = if changes.any_changes() { + ctx.store.submissions.update_files(&changes)? + } else { + submission + }; let newly_published = !initial_published && submission.published().is_some(); let profile_id = submission.profile_id(); diff --git a/profiles/src/store/mod.rs b/profiles/src/store/mod.rs index cec43ff..9b89360 100644 --- a/profiles/src/store/mod.rs +++ b/profiles/src/store/mod.rs @@ -415,8 +415,8 @@ impl Submission { pub fn update_files(&self) -> SubmissionFileChanges { SubmissionFileChanges { id: self.id, + original_files: self.files.clone(), files: self.files.clone(), - changed: false, } } @@ -726,25 +726,23 @@ impl SubmissionChanges { #[derive(Debug)] pub struct SubmissionFileChanges { id: Uuid, + original_files: Vec, files: Vec, - changed: bool, } impl SubmissionFileChanges { pub fn add_file(&mut self, file: &File) -> &mut Self { self.files.push(file.id); - self.changed = true; self } pub fn delete_file(&mut self, file: &File) -> &mut Self { self.files.retain(|id| *id != file.id); - self.changed = true; self } pub(crate) fn any_changes(&self) -> bool { - self.changed + self.original_files != self.files } }