summaryrefslogtreecommitdiffstats
path: root/server/src/apub/group_wrapper.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/apub/group_wrapper.rs')
-rw-r--r--server/src/apub/group_wrapper.rs91
1 files changed, 91 insertions, 0 deletions
diff --git a/server/src/apub/group_wrapper.rs b/server/src/apub/group_wrapper.rs
new file mode 100644
index 00000000..dd140df2
--- /dev/null
+++ b/server/src/apub/group_wrapper.rs
@@ -0,0 +1,91 @@
+use crate::to_datetime_utc;
+use activitypub::actor::Group;
+use chrono::{DateTime, NaiveDateTime};
+use failure::Error;
+use serde_json::Value;
+
+pub trait GroupHelper {
+ // TODO: id really needs to be a url
+ fn set_id(group: &mut Group, id: i32);
+ fn get_id(group: &Group) -> Result<i32, Error>;
+
+ fn set_title(group: &mut Group, title: &str);
+ fn get_title(group: &Group) -> Result<String, Error>;
+
+ fn set_description(group: &mut Group, description: &Option<String>);
+ fn get_description(group: &Group) -> Result<Option<String>, Error>;
+
+ // TODO: also needs to be changed to url
+ fn set_creator_id(group: &mut Group, creator_id: i32);
+ fn get_creator_id(group: &Group) -> Result<i32, Error>;
+
+ fn set_published(group: &mut Group, published: NaiveDateTime);
+ fn get_published(group: &Group) -> Result<NaiveDateTime, Error>;
+
+ fn set_updated(group: &mut Group, updated: Option<NaiveDateTime>);
+ fn get_updated(group: &Group) -> Result<Option<NaiveDateTime>, Error>;
+}
+
+// TODO: something is crashing and not reporting the error
+impl GroupHelper for Group {
+ fn set_id(group: &mut Group, id: i32) {
+ group.object_props.id = Some(Value::String(id.to_string()));
+ }
+ fn get_id(group: &Group) -> Result<i32, Error> {
+ Ok(get_string_value(group.clone().object_props.id).parse::<i32>()?)
+ }
+
+ fn set_title(group: &mut Group, title: &str) {
+ group.object_props.name = Some(Value::String(title.to_string()));
+ }
+ fn get_title(group: &Group) -> Result<String, Error> {
+ Ok(get_string_value(group.to_owned().object_props.name))
+ }
+
+ fn set_description(group: &mut Group, description: &Option<String>) {
+ group.object_props.summary = description.as_ref().map(|d| Value::String(d.to_string()));
+ }
+ fn get_description(group: &Group) -> Result<Option<String>, Error> {
+ Ok(get_string_value_opt(group.to_owned().object_props.summary))
+ }
+
+ fn set_creator_id(group: &mut Group, creator_id: i32) {
+ group.object_props.attributed_to = Some(Value::String(creator_id.to_string()));
+ }
+ fn get_creator_id(group: &Group) -> Result<i32, Error> {
+ Ok(get_string_value(group.clone().object_props.attributed_to).parse::<i32>()?)
+ }
+
+ fn set_published(group: &mut Group, published: NaiveDateTime) {
+ group.object_props.published = Some(Value::String(to_datetime_utc(published).to_string()))
+ }
+ fn get_published(group: &Group) -> Result<NaiveDateTime, Error> {
+ let str = get_string_value(group.to_owned().object_props.published);
+ // TODO: no idea which date format
+ let date = DateTime::parse_from_rfc2822(&str)?;
+ Ok(date.naive_local())
+ }
+
+ fn set_updated(group: &mut Group, updated: Option<NaiveDateTime>) {
+ group.object_props.updated = updated.map(|u| Value::String(u.to_string()));
+ }
+ fn get_updated(group: &Group) -> Result<Option<NaiveDateTime>, Error> {
+ let str = get_string_value_opt(group.to_owned().object_props.updated);
+ match str {
+ Some(s) => Ok(Some(DateTime::parse_from_rfc2822(&s)?.naive_local())),
+ None => Ok(None),
+ }
+ }
+}
+
+fn get_string_value_opt(value: Option<Value>) -> Option<String> {
+ value
+ .as_ref()
+ .map(Value::as_str)
+ .flatten()
+ .map(str::to_string)
+}
+
+fn get_string_value(value: Option<Value>) -> String {
+ get_string_value_opt(value).unwrap()
+}