69 lines
1.8 KiB
Rust
69 lines
1.8 KiB
Rust
use crate::{
|
|
database::Database,
|
|
http::{http_get_user, http_post_user_inbox, webfinger},
|
|
objects::{person::DbUser, post::DbPost},
|
|
utils::generate_object_id,
|
|
};
|
|
use activitypub_federation::config::{ApubMiddleware, FederationConfig};
|
|
use axum::{
|
|
routing::{get, post},
|
|
Router,
|
|
};
|
|
use error::Error;
|
|
use std::{
|
|
net::ToSocketAddrs,
|
|
sync::{Arc, Mutex},
|
|
};
|
|
use tracing::log::{info, LevelFilter};
|
|
|
|
mod activities;
|
|
mod database;
|
|
mod error;
|
|
#[allow(clippy::diverging_sub_expression, clippy::items_after_statements)]
|
|
mod http;
|
|
mod objects;
|
|
mod utils;
|
|
|
|
const DOMAIN: &str = "example.com";
|
|
const LOCAL_USER_NAME: &str = "alison";
|
|
const BIND_ADDRESS: &str = "localhost:8003";
|
|
|
|
#[actix_rt::main]
|
|
async fn main() -> Result<(), Error> {
|
|
env_logger::builder()
|
|
.filter_level(LevelFilter::Warn)
|
|
.filter_module("activitypub_federation", LevelFilter::Info)
|
|
.filter_module("live_federation", LevelFilter::Info)
|
|
.format_timestamp(None)
|
|
.init();
|
|
|
|
info!("Setup local user and database");
|
|
let local_user = DbUser::new(DOMAIN, LOCAL_USER_NAME)?;
|
|
let database = Arc::new(Database {
|
|
users: Mutex::new(vec![local_user]),
|
|
});
|
|
|
|
info!("Setup configuration");
|
|
let config = FederationConfig::builder()
|
|
.domain(DOMAIN)
|
|
.app_data(database)
|
|
.build()?;
|
|
|
|
info!("Listen with HTTP server on {BIND_ADDRESS}");
|
|
let config = config.clone();
|
|
let app = Router::new()
|
|
.route("/:user", get(http_get_user))
|
|
.route("/:user/inbox", post(http_post_user_inbox))
|
|
.route("/.well-known/webfinger", get(webfinger))
|
|
.layer(ApubMiddleware::new(config));
|
|
|
|
let addr = BIND_ADDRESS
|
|
.to_socket_addrs()?
|
|
.next()
|
|
.expect("Failed to lookup domain name");
|
|
axum::Server::bind(&addr)
|
|
.serve(app.into_make_service())
|
|
.await?;
|
|
|
|
Ok(())
|
|
}
|