diff options
author | Felix <me@nutomic.com> | 2020-03-12 01:01:25 +0100 |
---|---|---|
committer | Felix <me@nutomic.com> | 2020-03-12 01:01:25 +0100 |
commit | 54172bd322c5aef4ff7243a3ece316c8bbf80c2c (patch) | |
tree | 8d2bced971aa9fde57262e654b57061f751cb8eb /server/src/apub/community.rs | |
parent | 8867fa1d52967c3755eabf677654c3bb04b0fd67 (diff) |
updated to activitystreams 0.4.0-alpha.3
Diffstat (limited to 'server/src/apub/community.rs')
-rw-r--r-- | server/src/apub/community.rs | 88 |
1 files changed, 52 insertions, 36 deletions
diff --git a/server/src/apub/community.rs b/server/src/apub/community.rs index 877534b3..bbb9da6e 100644 --- a/server/src/apub/community.rs +++ b/server/src/apub/community.rs @@ -1,54 +1,64 @@ -use crate::apub::group_wrapper::GroupHelper; use crate::apub::make_apub_endpoint; +use crate::convert_datetime; use crate::db::community::Community; use crate::db::community_view::CommunityFollowerView; use crate::db::establish_unpooled_connection; -use activitypub::{actor::Group, collection::UnorderedCollection, context}; +use activitystreams::{ + actor::apub::Group, collection::apub::UnorderedCollection, context, + object::properties::ObjectProperties, +}; use actix_web::body::Body; use actix_web::web::Path; use actix_web::HttpResponse; +use failure::Error; use serde::Deserialize; -use serde_json::{Value}; impl Community { - pub fn as_group(&self) -> Group { + pub fn as_group(&self) -> Result<Group, Error> { let base_url = make_apub_endpoint("c", &self.id); let mut group = Group::default(); - - group.object_props.set_context_object(context()).ok(); - Group::set_id(&mut group, &base_url); - - Group::set_title(&mut group, &self.title); - Group::set_published(&mut group, self.published); - Group::set_updated(&mut group, self.updated); - Group::set_creator_id(&mut group, make_apub_endpoint("u", &self.creator_id)); - - Group::set_description(&mut group, &self.description); - - group.ap_actor_props.inbox = Value::String(format!("{}/inbox", &base_url)); - group.ap_actor_props.outbox = Value::String(format!("{}/outbox", &base_url)); - group.ap_actor_props.followers = Some(Value::String(format!("{}/followers", &base_url))); + let oprops: &mut ObjectProperties = group.as_mut(); + + oprops + .set_context_xsd_any_uri(context())? + .set_id(base_url.to_owned())? + .set_name_xsd_string(self.title.to_owned())? + .set_published(convert_datetime(self.published))? + .set_attributed_to_xsd_any_uri(make_apub_endpoint("u", &self.creator_id))?; + + if let Some(u) = self.updated.to_owned() { + oprops.set_updated(convert_datetime(u))?; + } + if let Some(d) = self.description.to_owned() { + oprops.set_summary_xsd_string(d)?; + } group + .ap_actor_props + .set_inbox(format!("{}/inbox", &base_url))? + .set_outbox(format!("{}/outbox", &base_url))? + .set_followers(format!("{}/followers", &base_url))?; + + Ok(group) } - pub fn followers_as_collection(&self) -> UnorderedCollection { + pub fn followers_as_collection(&self) -> Result<UnorderedCollection, Error> { let base_url = make_apub_endpoint("c", &self.name); - let mut collection = UnorderedCollection::default(); - collection.object_props.set_context_object(context()).ok(); - collection.object_props.set_id_string(base_url).ok(); - let connection = establish_unpooled_connection(); //As we are an object, we validated that the community id was valid let community_followers = CommunityFollowerView::for_community(&connection, self.id).unwrap(); + let mut collection = UnorderedCollection::default(); + let oprops: &mut ObjectProperties = collection.as_mut(); + oprops + .set_context_xsd_any_uri(context())? + .set_id(base_url)?; collection .collection_props - .set_total_items_u64(community_followers.len() as u64) - .unwrap(); - collection + .set_total_items(community_followers.len() as u64)?; + Ok(collection) } } @@ -57,26 +67,32 @@ pub struct CommunityQuery { community_name: String, } -pub async fn get_apub_community(info: Path<CommunityQuery>) -> HttpResponse<Body> { +pub async fn get_apub_community(info: Path<CommunityQuery>) -> Result<HttpResponse<Body>, Error> { let connection = establish_unpooled_connection(); if let Ok(community) = Community::read_from_name(&connection, info.community_name.to_owned()) { - HttpResponse::Ok() - .content_type("application/activity+json") - .body(serde_json::to_string(&community.as_group()).unwrap()) + Ok( + HttpResponse::Ok() + .content_type("application/activity+json") + .body(serde_json::to_string(&community.as_group()?).unwrap()), + ) } else { - HttpResponse::NotFound().finish() + Ok(HttpResponse::NotFound().finish()) } } -pub async fn get_apub_community_followers(info: Path<CommunityQuery>) -> HttpResponse<Body> { +pub async fn get_apub_community_followers( + info: Path<CommunityQuery>, +) -> Result<HttpResponse<Body>, Error> { let connection = establish_unpooled_connection(); if let Ok(community) = Community::read_from_name(&connection, info.community_name.to_owned()) { - HttpResponse::Ok() - .content_type("application/activity+json") - .body(serde_json::to_string(&community.followers_as_collection()).unwrap()) + Ok( + HttpResponse::Ok() + .content_type("application/activity+json") + .body(serde_json::to_string(&community.followers_as_collection()?).unwrap()), + ) } else { - HttpResponse::NotFound().finish() + Ok(HttpResponse::NotFound().finish()) } } |