actix-web-example: add inbox

This commit is contained in:
Aode (lion) 2021-11-19 17:17:55 -06:00
parent fe7e417e40
commit fba736e7f7

View file

@ -1,17 +1,23 @@
use actix_web::{middleware::Logger, web, App, HttpServer, ResponseError};
use apub_actix_web::{
serve_objects, RepoFactory, SignatureConfig, Verifier, VerifierFactory, VerifyError,
inbox, serve_objects, RepoFactory, SignatureConfig, Verifier, VerifierFactory, VerifyError,
};
use apub_core::{
deref::{Dereference, Repo},
ingest::Ingest,
};
use apub_core::deref::{Dereference, Repo};
use apub_rustcrypto::{RsaVerifier, RustcryptoError};
use dashmap::DashMap;
use example_types::{object_id, Note, NoteType, ObjectId};
use std::future::{ready, Ready};
use example_types::{AcceptedActivity, ActivityType, ObjectId};
use std::{
future::{ready, Ready},
sync::Arc,
};
use url::Url;
#[derive(Clone, Default)]
struct MemoryRepo {
inner: DashMap<Url, serde_json::Value>,
inner: Arc<DashMap<Url, serde_json::Value>>,
}
#[derive(Debug, thiserror::Error)]
@ -102,6 +108,20 @@ where
}
}
impl<'a> Ingest<'a, AcceptedActivity, ()> for MemoryRepo {
type Error = serde_json::Error;
type Future = Ready<Result<(), Self::Error>>;
fn ingest(
&'a self,
_authority: Option<Url>,
activity: AcceptedActivity,
_metadata: (),
) -> Self::Future {
ready(self.insert(activity.id().clone(), &activity))
}
}
#[actix_web::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
if std::env::var("RUST_LOG").is_ok() {
@ -113,30 +133,30 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
};
let repo = MemoryRepo::default();
let id = object_id("http://localhost:8008/notes/asdf".parse()?);
repo.insert(
id.clone(),
&Note {
id,
kind: NoteType::Note,
content: String::from("hi"),
},
)?;
let verifier = repo.clone();
let ingest = repo.clone();
let config = SignatureConfig::default();
HttpServer::new(move || {
App::new()
.wrap(Logger::default())
.service(
web::scope("/notes").configure(serve_objects::<ObjectId<NoteType>, _, _>(
repo.clone(),
verifier.clone(),
config.clone(),
"http://localhost:8008".to_string(),
false,
)),
)
.service(web::scope("/shared_inbox").configure(inbox(
ingest.clone(),
verifier.clone(),
config.clone(),
false,
)))
.service(web::scope("/activities").configure(serve_objects::<
ObjectId<ActivityType>,
_,
_,
>(
repo.clone(),
verifier.clone(),
config.clone(),
"http://localhost:8008".to_string(),
false,
)))
})
.bind("127.0.0.1:8008")?
.run()