diff --git a/server/src/apub/puller.rs b/server/src/apub/puller.rs index bdcb9ab..ee81b54 100644 --- a/server/src/apub/puller.rs +++ b/server/src/apub/puller.rs @@ -8,11 +8,10 @@ use crate::db::post_view::PostView; use crate::naive_now; use crate::routes::nodeinfo::{NodeInfo, NodeInfoWellKnown}; use crate::settings::Settings; -use activitystreams::actor::{properties::ApActorProperties, Group}; -use activitystreams::collection::{OrderedCollection, UnorderedCollection}; -use activitystreams::ext::Ext; -use activitystreams::object::ObjectBox; -use activitystreams::object::Page; +use activitystreams::actor::kind::GroupType; +use activitystreams::collection::kind::{CollectionType, OrderedCollectionType}; +use activitystreams::object::kind::PageType; +use activitystreams::primitives::XsdDateTime; use failure::Error; use log::warn; use serde::Deserialize; @@ -70,82 +69,109 @@ where Ok(x) } -pub fn get_remote_community_posts(identifier: &str) -> Result { - let community = - fetch_remote_object::>(&get_remote_community_uri(identifier))?; - let outbox_uri = &community.extension.get_outbox().to_string(); - let outbox = fetch_remote_object::(outbox_uri)?; - let items = outbox.collection_props.get_many_items_object_boxs(); +#[derive(serde::Deserialize)] +struct ValidCommunity { + #[allow(dead_code)] + #[serde(rename = "type")] + kind: GroupType, - let posts: Vec = items - .unwrap() - .map(|obox: &ObjectBox| { - let page: Page = obox.clone().to_concrete::().unwrap(); - PostView { - id: -1, - name: page.object_props.get_name_xsd_string().unwrap().to_string(), - url: page - .object_props - .get_url_xsd_any_uri() - .map(|u| u.to_string()), - body: page - .object_props - .get_content_xsd_string() - .map(|c| c.to_string()), - creator_id: -1, - community_id: -1, - removed: false, - locked: false, - published: page - .object_props - .get_published() - .unwrap() - .as_ref() - .naive_local() - .to_owned(), - updated: page - .object_props - .get_updated() - .map(|u| u.as_ref().to_owned().naive_local()), - deleted: false, - nsfw: false, - stickied: false, - embed_title: None, - embed_description: None, - embed_html: None, - thumbnail_url: None, - banned: false, - banned_from_community: false, - creator_name: "".to_string(), - creator_avatar: None, - community_name: "".to_string(), - community_removed: false, - community_deleted: false, - community_nsfw: false, - number_of_comments: -1, - score: -1, - upvotes: -1, - downvotes: -1, - hot_rank: -1, - newest_activity_time: naive_now(), - user_id: None, - my_vote: None, - subscribed: None, - read: None, - saved: None, - } + followers: String, + outbox: String, + name: String, + summary: Option, + published: XsdDateTime, + updated: Option, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct ValidOutbox { + #[allow(dead_code)] + #[serde(rename = "type")] + kind: OrderedCollectionType, + + items: Vec, + total_items: i64, +} + +#[derive(serde::Deserialize)] +struct ValidPage { + #[allow(dead_code)] + #[serde(rename = "type")] + kind: PageType, + + name: String, + url: Option, + content: Option, + published: XsdDateTime, + updated: Option, +} + +#[derive(serde::Deserialize)] +#[serde(rename_all = "camelCase")] +struct ValidFollowers { + #[allow(dead_code)] + #[serde(rename = "type")] + kind: CollectionType, + + total_items: i64, +} + +pub fn get_remote_community_posts(identifier: &str) -> Result { + let community = fetch_remote_object::(&get_remote_community_uri(identifier))?; + let outbox_uri = &community.outbox; + + let outbox = fetch_remote_object::(outbox_uri)?; + + let posts: Vec = outbox + .items + .into_iter() + .map(|page| PostView { + id: -1, + name: page.name, + url: page.url, + body: page.content, + creator_id: -1, + community_id: -1, + removed: false, + locked: false, + published: page.published.as_datetime().naive_local(), + updated: page.updated.map(|u| u.as_ref().naive_local()), + deleted: false, + nsfw: false, + stickied: false, + embed_title: None, + embed_description: None, + embed_html: None, + thumbnail_url: None, + banned: false, + banned_from_community: false, + creator_name: "".to_string(), + creator_avatar: None, + community_name: "".to_string(), + community_removed: false, + community_deleted: false, + community_nsfw: false, + number_of_comments: -1, + score: -1, + upvotes: -1, + downvotes: -1, + hot_rank: -1, + newest_activity_time: naive_now(), + user_id: None, + my_vote: None, + subscribed: None, + read: None, + saved: None, }) .collect(); Ok(GetPostsResponse { posts }) } pub fn get_remote_community(identifier: &str) -> Result { - let community = - fetch_remote_object::>(&get_remote_community_uri(identifier))?; - let followers_uri = &community.extension.get_followers().unwrap().to_string(); - let outbox_uri = &community.extension.get_outbox().to_string(); - let outbox = fetch_remote_object::(outbox_uri)?; - let followers = fetch_remote_object::(followers_uri)?; + let community = fetch_remote_object::(&get_remote_community_uri(identifier))?; + let outbox = fetch_remote_object::(&community.outbox)?; + let followers = fetch_remote_object::(&community.followers)?; // TODO: this is only for testing until we can call that function from GetPosts // (once string ids are supported) //dbg!(get_remote_community_posts(identifier)?); @@ -157,40 +183,20 @@ pub fn get_remote_community(identifier: &str) -> Result