Fix federated image update duplication for submissions

This commit is contained in:
asonix 2021-01-18 11:21:41 -06:00
parent 77abf536f6
commit f6f603324a
4 changed files with 46 additions and 21 deletions

View file

@ -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),
})))
}

View file

@ -260,6 +260,7 @@ pub struct UpdateSubmission {
published: Option<DateTime<Utc>>,
removed_files: Option<Vec<Uuid>>,
new_files: Option<Vec<Uuid>>,
only_files: Option<Vec<Uuid>>,
}
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,
}
}
}

View file

@ -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<Option<Box<dyn Outbound + Send>>, 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();

View file

@ -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<Uuid>,
files: Vec<Uuid>,
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
}
}