diff options
author | Vika <vika@fireburn.ru> | 2021-09-27 17:10:54 +0300 |
---|---|---|
committer | Vika <vika@fireburn.ru> | 2021-09-27 17:10:54 +0300 |
commit | f894d1746b94d60cd22260b933948f4169ece9ae (patch) | |
tree | ba6343dade34182d81f1483a56685d17f4fe3ba4 /src/database/mod.rs | |
parent | 5d635d9e9ae466ca52d1923fafdc74487030e975 (diff) | |
download | kittybox-f894d1746b94d60cd22260b933948f4169ece9ae.tar.zst |
Implemented support for channels
Diffstat (limited to 'src/database/mod.rs')
-rw-r--r-- | src/database/mod.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/database/mod.rs b/src/database/mod.rs index a1f5861..0b97c24 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -122,6 +122,55 @@ impl StorageError { /// A special Result type for the Micropub backing storage. pub type Result<T> = std::result::Result<T, StorageError>; +pub fn filter_post(mut post: serde_json::Value, user: &'_ Option<String>) -> Option<serde_json::Value> { + if post["properties"]["deleted"][0].is_string() { + return Some(serde_json::json!({ + "type": post["type"], + "properties": { + "deleted": post["properties"]["deleted"] + } + })); + } + let empty_vec: Vec<serde_json::Value> = vec![]; + let author = post["properties"]["author"] + .as_array() + .unwrap_or(&empty_vec) + .iter() + .map(|i| i.as_str().unwrap().to_string()); + let visibility = post["properties"]["visibility"][0] + .as_str() + .unwrap_or("public"); + let mut audience = author.chain( + post["properties"]["audience"] + .as_array() + .unwrap_or(&empty_vec) + .iter() + .map(|i| i.as_str().unwrap().to_string()), + ); + if (visibility == "private" && !audience.any(|i| Some(i) == *user)) + || (visibility == "protected" && user.is_none()) + { + return None; + } + if post["properties"]["location"].is_array() { + let location_visibility = post["properties"]["location-visibility"][0] + .as_str() + .unwrap_or("private"); + let mut author = post["properties"]["author"] + .as_array() + .unwrap_or(&empty_vec) + .iter() + .map(|i| i.as_str().unwrap().to_string()); + if location_visibility == "private" && !author.any(|i| Some(i) == *user) { + post["properties"] + .as_object_mut() + .unwrap() + .remove("location"); + } + } + Some(post) +} + /// A storage backend for the Micropub server. /// /// Implementations should note that all methods listed on this trait MUST be fully atomic |