Update to latest activitystreams #1

Merged
nutomic merged 2 commits from asonix/lemmy:federation into federation 2020-03-19 01:23:15 +00:00
7 changed files with 241 additions and 231 deletions

394
server/Cargo.lock generated vendored

File diff suppressed because it is too large Load diff

2
server/Cargo.toml vendored
View file

@ -9,7 +9,7 @@ diesel = { version = "1.4.2", features = ["postgres","chrono", "r2d2", "64-colum
diesel_migrations = "1.4.0" diesel_migrations = "1.4.0"
dotenv = "0.15.0" dotenv = "0.15.0"
bcrypt = "0.6.1" bcrypt = "0.6.1"
activitystreams = "0.5.0-alpha.7" activitystreams = "0.5.0-alpha.10"
chrono = { version = "0.4.7", features = ["serde"] } chrono = { version = "0.4.7", features = ["serde"] }
failure = "0.1.5" failure = "0.1.5"
serde_json = { version = "1.0.45", features = ["preserve_order"]} serde_json = { version = "1.0.45", features = ["preserve_order"]}

View file

@ -4,9 +4,12 @@ use crate::db::community::Community;
use crate::db::community_view::CommunityFollowerView; use crate::db::community_view::CommunityFollowerView;
use crate::db::establish_unpooled_connection; use crate::db::establish_unpooled_connection;
use crate::db::post_view::{PostQueryBuilder, PostView}; use crate::db::post_view::{PostQueryBuilder, PostView};
use activitystreams::collection::apub::OrderedCollection; use activitystreams::collection::OrderedCollection;
use activitystreams::{ use activitystreams::{
actor::apub::Group, collection::apub::UnorderedCollection, context, actor::{properties::ApActorProperties, Group},
collection::UnorderedCollection,
context,
ext::Extensible,
object::properties::ObjectProperties, object::properties::ObjectProperties,
}; };
use actix_web::body::Body; use actix_web::body::Body;
@ -50,13 +53,14 @@ pub async fn get_apub_community(
oprops.set_summary_xsd_string(d)?; oprops.set_summary_xsd_string(d)?;
} }
group let mut actor_props = ApActorProperties::default();
.ap_actor_props
actor_props
.set_inbox(format!("{}/inbox", &base_url))? .set_inbox(format!("{}/inbox", &base_url))?
.set_outbox(format!("{}/outbox", &base_url))? .set_outbox(format!("{}/outbox", &base_url))?
.set_followers(format!("{}/followers", &base_url))?; .set_followers(format!("{}/followers", &base_url))?;
Ok(create_apub_response(serde_json::to_string(&group)?)) Ok(create_apub_response(&group.extend(actor_props)))
} }
pub async fn get_apub_community_followers( pub async fn get_apub_community_followers(
@ -79,7 +83,7 @@ pub async fn get_apub_community_followers(
collection collection
.collection_props .collection_props
.set_total_items(community_followers.len() as u64)?; .set_total_items(community_followers.len() as u64)?;
Ok(create_apub_response(serde_json::to_string(&collection)?)) Ok(create_apub_response(&collection))
} }
pub async fn get_apub_community_outbox( pub async fn get_apub_community_outbox(
@ -111,5 +115,5 @@ pub async fn get_apub_community_outbox(
)? )?
.set_total_items(community_posts.len() as u64)?; .set_total_items(community_posts.len() as u64)?;
Ok(create_apub_response(serde_json::to_string(&collection)?)) Ok(create_apub_response(&collection))
} }

View file

@ -8,10 +8,13 @@ use actix_web::body::Body;
use actix_web::HttpResponse; use actix_web::HttpResponse;
use url::Url; use url::Url;
fn create_apub_response(json_data: String) -> HttpResponse<Body> { fn create_apub_response<T>(json: &T) -> HttpResponse<Body>
where
T: serde::ser::Serialize,
{
HttpResponse::Ok() HttpResponse::Ok()
.content_type("application/activity+json") .content_type("application/activity+json")
.body(json_data) .json(json)
} }
enum EndpointType { enum EndpointType {

View file

@ -1,7 +1,7 @@
use crate::apub::{create_apub_response, make_apub_endpoint, EndpointType}; use crate::apub::{create_apub_response, make_apub_endpoint, EndpointType};
use crate::convert_datetime; use crate::convert_datetime;
use crate::db::post_view::PostView; use crate::db::post_view::PostView;
use activitystreams::{object::apub::Page, object::properties::ObjectProperties}; use activitystreams::{object::properties::ObjectProperties, object::Page};
use actix_web::body::Body; use actix_web::body::Body;
use actix_web::web::Path; use actix_web::web::Path;
use actix_web::{web, HttpResponse}; use actix_web::{web, HttpResponse};
@ -22,9 +22,7 @@ pub async fn get_apub_post(
let id = info.post_id.parse::<i32>()?; let id = info.post_id.parse::<i32>()?;
// TODO: shows error: missing field `user_name` // TODO: shows error: missing field `user_name`
let post = PostView::read(&&db.get()?, id, None)?; let post = PostView::read(&&db.get()?, id, None)?;
Ok(create_apub_response(serde_json::to_string( Ok(create_apub_response(&post.as_page()?))
&post.as_page()?,
)?))
} }
impl PostView { impl PostView {

View file

@ -8,10 +8,11 @@ use crate::db::post_view::PostView;
use crate::naive_now; use crate::naive_now;
use crate::routes::nodeinfo::{NodeInfo, NodeInfoWellKnown}; use crate::routes::nodeinfo::{NodeInfo, NodeInfoWellKnown};
use crate::settings::Settings; use crate::settings::Settings;
use activitystreams::actor::apub::Group; use activitystreams::actor::{properties::ApActorProperties, Group};
use activitystreams::collection::apub::{OrderedCollection, UnorderedCollection}; use activitystreams::collection::{OrderedCollection, UnorderedCollection};
use activitystreams::object::apub::Page; use activitystreams::ext::Ext;
use activitystreams::object::ObjectBox; use activitystreams::object::ObjectBox;
use activitystreams::object::Page;
use failure::Error; use failure::Error;
use log::warn; use log::warn;
use serde::Deserialize; use serde::Deserialize;
@ -71,8 +72,9 @@ where
} }
pub fn get_remote_community_posts(identifier: &str) -> Result<GetPostsResponse, Error> { pub fn get_remote_community_posts(identifier: &str) -> Result<GetPostsResponse, Error> {
let community = fetch_remote_object::<Group>(&get_remote_community_uri(identifier))?; let community =
let outbox_uri = &community.ap_actor_props.get_outbox().to_string(); 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 outbox = fetch_remote_object::<OrderedCollection>(outbox_uri)?;
let items = outbox.collection_props.get_many_items_object_boxs(); let items = outbox.collection_props.get_many_items_object_boxs();
@ -125,13 +127,10 @@ pub fn get_remote_community_posts(identifier: &str) -> Result<GetPostsResponse,
} }
pub fn get_remote_community(identifier: &str) -> Result<GetCommunityResponse, failure::Error> { pub fn get_remote_community(identifier: &str) -> Result<GetCommunityResponse, failure::Error> {
let community = fetch_remote_object::<Group>(&get_remote_community_uri(identifier))?; let community =
let followers_uri = &community fetch_remote_object::<Ext<Group, ApActorProperties>>(&get_remote_community_uri(identifier))?;
.ap_actor_props let followers_uri = &community.extension.get_followers().unwrap().to_string();
.get_followers() let outbox_uri = &community.extension.get_outbox().to_string();
.unwrap()
.to_string();
let outbox_uri = &community.ap_actor_props.get_outbox().to_string();
let outbox = fetch_remote_object::<OrderedCollection>(outbox_uri)?; let outbox = fetch_remote_object::<OrderedCollection>(outbox_uri)?;
let followers = fetch_remote_object::<UnorderedCollection>(followers_uri)?; let followers = fetch_remote_object::<UnorderedCollection>(followers_uri)?;
// TODO: this is only for testing until we can call that function from GetPosts // TODO: this is only for testing until we can call that function from GetPosts
@ -146,26 +145,26 @@ pub fn get_remote_community(identifier: &str) -> Result<GetCommunityResponse, fa
id: 1337, //community.object_props.get_id() id: 1337, //community.object_props.get_id()
name: identifier.to_string(), name: identifier.to_string(),
title: community title: community
.object_props .as_ref()
.get_name_xsd_string() .get_name_xsd_string()
.unwrap() .unwrap()
.to_string(), .to_string(),
description: community description: community
.object_props .as_ref()
.get_summary_xsd_string() .get_summary_xsd_string()
.map(|s| s.to_string()), .map(|s| s.to_string()),
category_id: -1, category_id: -1,
creator_id: -1, //community.object_props.get_attributed_to_xsd_any_uri() creator_id: -1, //community.object_props.get_attributed_to_xsd_any_uri()
removed: false, removed: false,
published: community published: community
.object_props .as_ref()
.get_published() .get_published()
.unwrap() .unwrap()
.as_ref() .as_ref()
.naive_local() .naive_local()
.to_owned(), .to_owned(),
updated: community updated: community
.object_props .as_ref()
.get_updated() .get_updated()
.map(|u| u.as_ref().to_owned().naive_local()), .map(|u| u.as_ref().to_owned().naive_local()),
deleted: false, deleted: false,

View file

@ -1,7 +1,12 @@
use crate::apub::{create_apub_response, make_apub_endpoint, EndpointType}; use crate::apub::{create_apub_response, make_apub_endpoint, EndpointType};
use crate::convert_datetime; use crate::convert_datetime;
use crate::db::user::User_; use crate::db::user::User_;
use activitystreams::{actor::apub::Person, context, object::properties::ObjectProperties}; use activitystreams::{
actor::{properties::ApActorProperties, Person},
context,
ext::Extensible,
object::properties::ObjectProperties,
};
use actix_web::body::Body; use actix_web::body::Body;
use actix_web::web::Path; use actix_web::web::Path;
use actix_web::HttpResponse; use actix_web::HttpResponse;
@ -38,12 +43,13 @@ pub async fn get_apub_user(
oprops.set_name_xsd_string(i.to_owned())?; oprops.set_name_xsd_string(i.to_owned())?;
} }
person let mut actor_props = ApActorProperties::default();
.ap_actor_props
actor_props
.set_inbox(format!("{}/inbox", &base_url))? .set_inbox(format!("{}/inbox", &base_url))?
.set_outbox(format!("{}/outbox", &base_url))? .set_outbox(format!("{}/outbox", &base_url))?
.set_following(format!("{}/following", &base_url))? .set_following(format!("{}/following", &base_url))?
.set_liked(format!("{}/liked", &base_url))?; .set_liked(format!("{}/liked", &base_url))?;
Ok(create_apub_response(serde_json::to_string(&person)?)) Ok(create_apub_response(&person.extend(actor_props)))
} }