Set visibility to direct for incoming notes with single local recipient
This commit is contained in:
parent
4f5930dcf1
commit
3b5ec45991
1 changed files with 47 additions and 1 deletions
|
@ -80,6 +80,19 @@ fn parse_object_id(
|
||||||
Ok(object_uuid)
|
Ok(object_uuid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_array(value: &Value) -> Result<Vec<String>, ValidationError> {
|
||||||
|
let result = match value {
|
||||||
|
Value::String(string) => vec![string.to_string()],
|
||||||
|
Value::Array(array) => {
|
||||||
|
array.into_iter()
|
||||||
|
.filter_map(|val| val.as_str().map(|s| s.to_string()))
|
||||||
|
.collect()
|
||||||
|
},
|
||||||
|
_ => return Err(ValidationError("invalid attribute value")),
|
||||||
|
};
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
|
||||||
async fn get_or_fetch_profile_by_actor_id(
|
async fn get_or_fetch_profile_by_actor_id(
|
||||||
db_client: &impl GenericClient,
|
db_client: &impl GenericClient,
|
||||||
instance: &Instance,
|
instance: &Instance,
|
||||||
|
@ -214,10 +227,24 @@ pub async fn process_note(
|
||||||
},
|
},
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
let visibility = match object.to {
|
||||||
|
Some(value) => {
|
||||||
|
let recipients = parse_array(&value)?;
|
||||||
|
if recipients.len() == 1 &&
|
||||||
|
parse_actor_id(&instance.url(), &recipients[0]).is_ok()
|
||||||
|
{
|
||||||
|
// Single local recipient
|
||||||
|
Visibility::Direct
|
||||||
|
} else {
|
||||||
|
Visibility::Public
|
||||||
|
}
|
||||||
|
},
|
||||||
|
None => Visibility::Public,
|
||||||
|
};
|
||||||
let post_data = PostCreateData {
|
let post_data = PostCreateData {
|
||||||
content,
|
content,
|
||||||
in_reply_to_id,
|
in_reply_to_id,
|
||||||
visibility: Visibility::Public,
|
visibility,
|
||||||
attachments: attachments,
|
attachments: attachments,
|
||||||
mentions: mentions,
|
mentions: mentions,
|
||||||
object_id: Some(object.id),
|
object_id: Some(object.id),
|
||||||
|
@ -381,6 +408,7 @@ pub async fn receive_activity(
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use serde_json::json;
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
const INSTANCE_URL: &str = "https://example.org";
|
const INSTANCE_URL: &str = "https://example.org";
|
||||||
|
@ -426,4 +454,22 @@ mod tests {
|
||||||
let error = parse_object_id(INSTANCE_URL, object_id).unwrap_err();
|
let error = parse_object_id(INSTANCE_URL, object_id).unwrap_err();
|
||||||
assert_eq!(error.to_string(), "invalid object ID");
|
assert_eq!(error.to_string(), "invalid object ID");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_array_with_string() {
|
||||||
|
let value = json!("test");
|
||||||
|
assert_eq!(
|
||||||
|
parse_array(&value).unwrap(),
|
||||||
|
vec!["test".to_string()],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_parse_array_with_array() {
|
||||||
|
let value = json!(["test1", "test2"]);
|
||||||
|
assert_eq!(
|
||||||
|
parse_array(&value).unwrap(),
|
||||||
|
vec!["test1".to_string(), "test2".to_string()],
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue