summaryrefslogtreecommitdiffstats
path: root/server/src/apub/inbox.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/apub/inbox.rs')
-rw-r--r--server/src/apub/inbox.rs85
1 files changed, 73 insertions, 12 deletions
diff --git a/server/src/apub/inbox.rs b/server/src/apub/inbox.rs
index 8b6504a7..cc844224 100644
--- a/server/src/apub/inbox.rs
+++ b/server/src/apub/inbox.rs
@@ -1,27 +1,88 @@
use crate::db::post::{Post, PostForm};
use crate::db::Crud;
-use activitystreams::activity::Create;
use activitystreams::object::Page;
+use activitystreams::{
+ object::{Object, ObjectBox},
+ primitives::XsdAnyUri,
+ Base, BaseBox, PropRefs,
+};
use actix_web::{web, HttpResponse};
use diesel::r2d2::{ConnectionManager, Pool};
use diesel::PgConnection;
use failure::Error;
+use std::collections::HashMap;
// TODO: need a proper actor that has this inbox
-pub async fn create_inbox(
- create: web::Json<Create>,
+pub async fn inbox(
+ input: web::Json<AcceptedObjects>,
db: web::Data<Pool<ConnectionManager<PgConnection>>>,
) -> Result<HttpResponse, Error> {
- let page = create
- .create_props
- .get_object_base_box()
- .unwrap()
- .to_owned()
- .to_concrete::<Page>()?;
- let post = PostForm::from_page(&page, &db.get().unwrap())?;
- Post::create(&db.get().unwrap(), &post)?;
+ let input = input.into_inner();
+ let conn = &db.get().unwrap();
+ match input.kind {
+ ValidTypes::Create => handle_create(&input, conn),
+ ValidTypes::Update => handle_update(&input, conn),
+ }
+}
+
+fn handle_create(create: &AcceptedObjects, conn: &PgConnection) -> Result<HttpResponse, Error> {
+ let page = create.object.to_owned().to_concrete::<Page>()?;
+ let post = PostForm::from_page(&page, conn)?;
+ Post::create(conn, &post)?;
+ // TODO: send the new post out via websocket
+ Ok(HttpResponse::Ok().finish())
+}
+
+fn handle_update(update: &AcceptedObjects, conn: &PgConnection) -> Result<HttpResponse, Error> {
+ let page = update.object.to_owned().to_concrete::<Page>()?;
+ let post = PostForm::from_page(&page, conn)?;
+ let id = Post::read_from_apub_id(conn, &post.ap_id)?.id;
+ Post::update(conn, id, &post)?;
// TODO: send the new post out via websocket
- dbg!(&post);
Ok(HttpResponse::Ok().finish())
}
+
+#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
+#[serde(rename_all = "camelCase")]
+pub struct AcceptedObjects {
+ pub id: XsdAnyUri,
+
+ #[serde(rename = "type")]
+ pub kind: ValidTypes,
+
+ pub actor: XsdAnyUri,
+
+ pub object: BaseBox,
+
+ #[serde(flatten)]
+ ext: HashMap<String, serde_json::Value>,
+}
+
+#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd, serde::Deserialize, serde::Serialize)]
+#[serde(rename_all = "PascalCase")]
+pub enum ValidTypes {
+ Create,
+ Update,
+}
+
+#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
+#[serde(untagged)]
+#[serde(rename_all = "camelCase")]
+pub enum ValidObjects {
+ Id(XsdAnyUri),
+ Object(AnyExistingObject),
+}
+
+#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize, PropRefs)]
+#[serde(rename_all = "camelCase")]
+#[prop_refs(Object)]
+pub struct AnyExistingObject {
+ pub id: XsdAnyUri,
+
+ #[serde(rename = "type")]
+ pub kind: String,
+
+ #[serde(flatten)]
+ ext: HashMap<String, serde_json::Value>,
+}