2020-04-15 18:12:25 +00:00
|
|
|
use crate::apub::activities::accept_follow;
|
|
|
|
use crate::apub::fetcher::fetch_remote_user;
|
|
|
|
use crate::db::community::{Community, CommunityFollower, CommunityFollowerForm};
|
|
|
|
use crate::db::Followable;
|
|
|
|
use activitystreams::activity::Follow;
|
|
|
|
use actix_web::{web, HttpResponse};
|
|
|
|
use diesel::r2d2::{ConnectionManager, Pool};
|
|
|
|
use diesel::PgConnection;
|
|
|
|
use failure::Error;
|
2020-04-17 14:55:28 +00:00
|
|
|
use log::debug;
|
|
|
|
use serde::Deserialize;
|
2020-04-15 18:12:25 +00:00
|
|
|
use url::Url;
|
|
|
|
|
|
|
|
#[serde(untagged)]
|
2020-04-17 14:55:28 +00:00
|
|
|
#[derive(Deserialize, Debug)]
|
2020-04-15 18:12:25 +00:00
|
|
|
pub enum CommunityAcceptedObjects {
|
|
|
|
Follow(Follow),
|
|
|
|
}
|
|
|
|
|
2020-04-17 14:55:28 +00:00
|
|
|
#[derive(Deserialize)]
|
|
|
|
pub struct Params {
|
|
|
|
community_name: String,
|
|
|
|
}
|
|
|
|
|
2020-04-15 18:12:25 +00:00
|
|
|
pub async fn community_inbox(
|
|
|
|
input: web::Json<CommunityAcceptedObjects>,
|
2020-04-17 14:55:28 +00:00
|
|
|
params: web::Query<Params>,
|
2020-04-15 18:12:25 +00:00
|
|
|
db: web::Data<Pool<ConnectionManager<PgConnection>>>,
|
|
|
|
) -> Result<HttpResponse, Error> {
|
|
|
|
let input = input.into_inner();
|
|
|
|
let conn = &db.get().unwrap();
|
2020-04-17 14:55:28 +00:00
|
|
|
debug!(
|
|
|
|
"Community {} received activity {:?}",
|
|
|
|
¶ms.community_name, &input
|
|
|
|
);
|
2020-04-15 18:12:25 +00:00
|
|
|
match input {
|
|
|
|
CommunityAcceptedObjects::Follow(f) => handle_follow(&f, conn),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn handle_follow(follow: &Follow, conn: &PgConnection) -> Result<HttpResponse, Error> {
|
|
|
|
// TODO: make sure this is a local community
|
|
|
|
let community_uri = follow
|
|
|
|
.follow_props
|
|
|
|
.get_object_xsd_any_uri()
|
|
|
|
.unwrap()
|
|
|
|
.to_string();
|
|
|
|
let community = Community::read_from_actor_id(conn, &community_uri)?;
|
|
|
|
let user_uri = follow
|
|
|
|
.follow_props
|
|
|
|
.get_actor_xsd_any_uri()
|
|
|
|
.unwrap()
|
|
|
|
.to_string();
|
|
|
|
let user = fetch_remote_user(&Url::parse(&user_uri)?, conn)?;
|
|
|
|
let community_follower_form = CommunityFollowerForm {
|
|
|
|
community_id: community.id,
|
|
|
|
user_id: user.id,
|
|
|
|
};
|
|
|
|
CommunityFollower::follow(&conn, &community_follower_form)?;
|
|
|
|
accept_follow(&follow)?;
|
|
|
|
Ok(HttpResponse::Ok().finish())
|
|
|
|
}
|