Consider the following #2
1 changed files with 106 additions and 100 deletions
|
@ -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<GetPostsResponse, Error> {
|
||||
let community =
|
||||
fetch_remote_object::<Ext<Group, ApActorProperties>>(&get_remote_community_uri(identifier))?;
|
||||
let outbox_uri = &community.extension.get_outbox().to_string();
|
||||
let outbox = fetch_remote_object::<OrderedCollection>(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<PostView> = items
|
||||
.unwrap()
|
||||
.map(|obox: &ObjectBox| {
|
||||
let page: Page = obox.clone().to_concrete::<Page>().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<String>,
|
||||
published: XsdDateTime,
|
||||
updated: Option<XsdDateTime>,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct ValidOutbox {
|
||||
#[allow(dead_code)]
|
||||
#[serde(rename = "type")]
|
||||
kind: OrderedCollectionType,
|
||||
|
||||
items: Vec<ValidPage>,
|
||||
total_items: i64,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
struct ValidPage {
|
||||
#[allow(dead_code)]
|
||||
#[serde(rename = "type")]
|
||||
kind: PageType,
|
||||
|
||||
name: String,
|
||||
url: Option<String>,
|
||||
content: Option<String>,
|
||||
published: XsdDateTime,
|
||||
updated: Option<XsdDateTime>,
|
||||
}
|
||||
|
||||
#[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<GetPostsResponse, Error> {
|
||||
let community = fetch_remote_object::<ValidCommunity>(&get_remote_community_uri(identifier))?;
|
||||
let outbox_uri = &community.outbox;
|
||||
|
||||
let outbox = fetch_remote_object::<ValidOutbox>(outbox_uri)?;
|
||||
|
||||
let posts: Vec<PostView> = 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<GetCommunityResponse, failure::Error> {
|
||||
let community =
|
||||
fetch_remote_object::<Ext<Group, ApActorProperties>>(&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::<OrderedCollection>(outbox_uri)?;
|
||||
let followers = fetch_remote_object::<UnorderedCollection>(followers_uri)?;
|
||||
let community = fetch_remote_object::<ValidCommunity>(&get_remote_community_uri(identifier))?;
|
||||
let outbox = fetch_remote_object::<ValidOutbox>(&community.outbox)?;
|
||||
let followers = fetch_remote_object::<ValidFollowers>(&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<GetCommunityResponse, fa
|
|||
// TODO: we need to merge id and name into a single thing (stuff like @user@instance.com)
|
||||
id: 1337, //community.object_props.get_id()
|
||||
name: identifier.to_string(),
|
||||
title: community
|
||||
.as_ref()
|
||||
.get_name_xsd_string()
|
||||
.unwrap()
|
||||
.to_string(),
|
||||
description: community
|
||||
.as_ref()
|
||||
.get_summary_xsd_string()
|
||||
.map(|s| s.to_string()),
|
||||
title: community.name,
|
||||
description: community.summary,
|
||||
category_id: -1,
|
||||
creator_id: -1, //community.object_props.get_attributed_to_xsd_any_uri()
|
||||
removed: false,
|
||||
published: community
|
||||
.as_ref()
|
||||
.get_published()
|
||||
.unwrap()
|
||||
.as_ref()
|
||||
.naive_local()
|
||||
.to_owned(),
|
||||
updated: community
|
||||
.as_ref()
|
||||
.get_updated()
|
||||
.map(|u| u.as_ref().to_owned().naive_local()),
|
||||
published: community.published.as_datetime().naive_local(),
|
||||
updated: community.updated.map(|u| u.as_datetime().naive_local()),
|
||||
deleted: false,
|
||||
nsfw: false,
|
||||
creator_name: "".to_string(),
|
||||
creator_avatar: None,
|
||||
category_name: "".to_string(),
|
||||
number_of_subscribers: *followers
|
||||
.collection_props
|
||||
.get_total_items()
|
||||
.unwrap()
|
||||
.as_ref() as i64, // TODO: need to use the same type
|
||||
number_of_posts: *outbox.collection_props.get_total_items().unwrap().as_ref() as i64,
|
||||
number_of_subscribers: followers.total_items,
|
||||
number_of_posts: outbox.total_items,
|
||||
number_of_comments: -1,
|
||||
hot_rank: -1,
|
||||
user_id: None,
|
||||
|
|
Reference in a new issue