From 2a85cb666180ae80802d95e01e3dfa272b4fc837 Mon Sep 17 00:00:00 2001 From: asonix Date: Mon, 1 Feb 2021 19:02:15 -0600 Subject: [PATCH] Profiles: Expose submission visibility settings --- profiles/src/apub/actions/apub/note.rs | 1 + profiles/src/apub/actions/mod.rs | 12 +++++++++++- profiles/src/apub/actions/submission.rs | 9 ++++++++- profiles/src/store/mod.rs | 22 +++++++++++++++++++++- profiles/src/store/submission.rs | 3 +++ 5 files changed, 44 insertions(+), 3 deletions(-) diff --git a/profiles/src/apub/actions/apub/note.rs b/profiles/src/apub/actions/apub/note.rs index 10784d9..1e56fd0 100644 --- a/profiles/src/apub/actions/apub/note.rs +++ b/profiles/src/apub/actions/apub/note.rs @@ -414,6 +414,7 @@ pub(super) fn update_note( title_source: None, description, description_source: None, + visibility: Some(find_visibility(note)), published: Some(published.into()), removed_files: None, new_files: None, diff --git a/profiles/src/apub/actions/mod.rs b/profiles/src/apub/actions/mod.rs index 611269c..f53eff7 100644 --- a/profiles/src/apub/actions/mod.rs +++ b/profiles/src/apub/actions/mod.rs @@ -291,6 +291,7 @@ pub struct UpdateSubmission { title_source: Option, description: Option, description_source: Option, + visibility: Option, published: Option>, removed_files: Option>, new_files: Option>, @@ -298,7 +299,12 @@ pub struct UpdateSubmission { } impl UpdateSubmission { - pub fn from_text(submission_id: Uuid, title: String, description: Option) -> Self { + pub fn from_text( + submission_id: Uuid, + title: String, + description: Option, + visibility: Option, + ) -> Self { let title_source = if title.trim().is_empty() { None } else { @@ -319,6 +325,7 @@ impl UpdateSubmission { title_source, description: description_source.as_deref().map(|s| bbcode(s, |v| v)), description_source, + visibility, published: None, removed_files: None, new_files: None, @@ -333,6 +340,7 @@ impl UpdateSubmission { title_source: None, description: None, description_source: None, + visibility: None, published: None, removed_files: None, new_files: Some(vec![file_id]), @@ -347,6 +355,7 @@ impl UpdateSubmission { title_source: None, description: None, description_source: None, + visibility: None, published: None, removed_files: Some(vec![file_id]), new_files: None, @@ -361,6 +370,7 @@ impl UpdateSubmission { title_source: None, description: None, description_source: None, + visibility: None, published: Some(Utc::now()), removed_files: None, new_files: None, diff --git a/profiles/src/apub/actions/submission.rs b/profiles/src/apub/actions/submission.rs index a7d0c27..132a985 100644 --- a/profiles/src/apub/actions/submission.rs +++ b/profiles/src/apub/actions/submission.rs @@ -104,7 +104,14 @@ impl Action for UpdateSubmission { if let Some(description_source) = &self.description_source { changes.description_source(description_source); } - let submission = ctx.store.submissions.update(&changes)?; + if let Some(visibility) = self.visibility { + changes.visibility(visibility); + } + let submission = if changes.any_changes() { + ctx.store.submissions.update(&changes)? + } else { + submission + }; let mut removed_file_ids = HashSet::new(); let mut changes = submission.update_files(); diff --git a/profiles/src/store/mod.rs b/profiles/src/store/mod.rs index 8208d2f..5179e70 100644 --- a/profiles/src/store/mod.rs +++ b/profiles/src/store/mod.rs @@ -426,6 +426,7 @@ impl Submission { title_source: None, description: None, description_source: None, + visibility: None, published: self.published, } } @@ -748,6 +749,7 @@ pub struct SubmissionChanges { title_source: Option, description: Option, description_source: Option, + visibility: Option, published: Option>, } @@ -772,6 +774,11 @@ impl SubmissionChanges { self } + pub(crate) fn visibility(&mut self, visibility: Visibility) -> &mut Self { + self.visibility = Some(visibility); + self + } + pub(crate) fn publish(&mut self, time: Option>) -> &mut Self { if self.published.is_none() { self.published = time.or_else(|| Some(Utc::now())); @@ -780,7 +787,10 @@ impl SubmissionChanges { } pub(crate) fn any_changes(&self) -> bool { - self.title.is_some() || self.description.is_some() || self.published.is_some() + self.title.is_some() + || self.description.is_some() + || self.published.is_some() + || self.visibility.is_some() } } @@ -901,6 +911,16 @@ fn count( Ok(()) } +impl fmt::Display for Visibility { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Visibility::Public => write!(f, "Public"), + Visibility::Unlisted => write!(f, "Unlisted"), + Visibility::Followers => write!(f, "Followers"), + } + } +} + impl fmt::Display for OwnerSource { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { diff --git a/profiles/src/store/submission.rs b/profiles/src/store/submission.rs index db8c31b..012ade3 100644 --- a/profiles/src/store/submission.rs +++ b/profiles/src/store/submission.rs @@ -153,6 +153,9 @@ impl Store { if let Some(description_source) = &changes.description_source { stored_submission.description_source = Some(description_source.clone()); } + if let Some(visibility) = changes.visibility { + stored_submission.visibility = visibility; + } stored_submission.published = changes.published; stored_submission.updated_at = Utc::now();