--- /dev/null
+{
+ "@context":"https://www.w3.org/ns/activitystreams",
+ "id":"https://mastodon.madrid/users/felix#likes/212340",
+ "type":"Like",
+ "actor":"https://mastodon.madrid/users/felix",
+ "object":"https://ds9.lemmy.ml/post/147"
+}
--- /dev/null
+{
+ "@context":"https://www.w3.org/ns/activitystreams",
+ "id":"https://mastodon.madrid/users/felix#likes/212341/undo",
+ "type":"Undo",
+ "actor":"https://mastodon.madrid/users/felix",
+ "object": {
+ "id":"https://mastodon.madrid/users/felix#likes/212341",
+ "type":"Like",
+ "actor":"https://mastodon.madrid/users/felix",
+ "object":"https://ds9.lemmy.ml/post/147"
+ }
+}
\ No newline at end of file
.await??
.into();
- let object = Vote::new(object, actor, &community, kind.clone(), context)?;
+ let object = Vote::new(object, actor, kind.clone(), context)?;
let id = generate_activity_id(
UndoType::Undo,
&context.settings().get_protocol_and_hostname(),
)?;
let undo_vote = UndoVote {
actor: ObjectId::new(actor.actor_id()),
- to: vec![community.actor_id()],
object,
cc: vec![public()],
kind: UndoType::Undo,
pub(in crate::activities::voting) fn new(
object: &PostOrComment,
actor: &ApubPerson,
- community: &ApubCommunity,
kind: VoteType,
context: &LemmyContext,
) -> Result<Vote, LemmyError> {
Ok(Vote {
actor: ObjectId::new(actor.actor_id()),
- to: vec![community.actor_id()],
object: ObjectId::new(object.ap_id()),
cc: vec![public()],
kind: kind.clone(),
})
.await??
.into();
- let vote = Vote::new(object, actor, &community, kind, context)?;
+ let vote = Vote::new(object, actor, kind, context)?;
let activity = AnnouncableActivities::Vote(vote);
send_activity_in_community(activity, actor, &community, vec![], context).await
}
}
}
+
+#[cfg(test)]
+mod tests {
+ use crate::{
+ activity_lists::{GroupInboxActivities, PersonInboxActivities, SiteInboxActivities},
+ protocol::tests::test_parse_lemmy_item,
+ };
+
+ #[test]
+ fn test_group_inbox() {
+ test_parse_lemmy_item::<GroupInboxActivities>("assets/lemmy/activities/following/follow.json")
+ .unwrap();
+ test_parse_lemmy_item::<GroupInboxActivities>(
+ "assets/lemmy/activities/create_or_update/create_note.json",
+ )
+ .unwrap();
+ }
+
+ #[test]
+ fn test_person_inbox() {
+ test_parse_lemmy_item::<PersonInboxActivities>("assets/lemmy/activities/following/accept.json")
+ .unwrap();
+ test_parse_lemmy_item::<PersonInboxActivities>(
+ "assets/lemmy/activities/create_or_update/create_note.json",
+ )
+ .unwrap();
+ test_parse_lemmy_item::<PersonInboxActivities>(
+ "assets/lemmy/activities/create_or_update/create_private_message.json",
+ )
+ .unwrap();
+ }
+
+ #[test]
+ fn test_site_inbox() {
+ test_parse_lemmy_item::<SiteInboxActivities>(
+ "assets/lemmy/activities/deletion/delete_user.json",
+ )
+ .unwrap();
+ }
+}
for<'de2> <ActorT as ApubObject>::ApubType: serde::Deserialize<'de2>,
{
let activity_value: Value = serde_json::from_str(&payload)?;
+ debug!("Received activity {:#}", payload.as_str());
let activity: Activity = serde_json::from_value(activity_value.clone())?;
// Log the activity, so we avoid receiving and parsing it twice.
let insert = insert_activity(activity.id(), activity_value, false, true, context.pool()).await?;
test_json::<Delete>("assets/mastodon/activities/delete.json").unwrap();
test_json::<FollowCommunity>("assets/mastodon/activities/follow.json").unwrap();
test_json::<UndoFollowCommunity>("assets/mastodon/activities/undo_follow.json").unwrap();
+ test_json::<Vote>("assets/mastodon/activities/like_page.json").unwrap();
+ test_json::<UndoVote>("assets/mastodon/activities/undo_like_page.json").unwrap();
}
#[test]
#[serde(rename_all = "camelCase")]
pub struct UndoVote {
pub(crate) actor: ObjectId<ApubPerson>,
- #[serde(deserialize_with = "deserialize_one_or_many")]
- pub(crate) to: Vec<Url>,
pub(crate) object: Vote,
- #[serde(deserialize_with = "deserialize_one_or_many")]
+ #[serde(deserialize_with = "deserialize_one_or_many", default)]
pub(crate) cc: Vec<Url>,
#[serde(rename = "type")]
pub(crate) kind: UndoType,
#[serde(rename_all = "camelCase")]
pub struct Vote {
pub(crate) actor: ObjectId<ApubPerson>,
- #[serde(deserialize_with = "deserialize_one_or_many")]
- pub(crate) to: Vec<Url>,
pub(crate) object: ObjectId<PostOrComment>,
- #[serde(deserialize_with = "deserialize_one_or_many")]
+ #[serde(deserialize_with = "deserialize_one_or_many", default)]
pub(crate) cc: Vec<Url>,
#[serde(rename = "type")]
pub(crate) kind: VoteType,