]> Untitled Git - lemmy.git/commitdiff
Move apub related code from websocket into api package
authorFelix Ableitner <me@nutomic.com>
Sat, 14 Mar 2020 12:15:23 +0000 (13:15 +0100)
committerFelix Ableitner <me@nutomic.com>
Sat, 14 Mar 2020 12:15:23 +0000 (13:15 +0100)
server/src/api/community.rs
server/src/api/post.rs
server/src/apub/puller.rs
server/src/websocket/server.rs

index 7d5f8d613dc9e095dbfc693c0f99bf565f02b95d..0f104c2d6afb709b966befcd715e88cb08016958 100644 (file)
@@ -1,4 +1,6 @@
 use super::*;
+use crate::apub::puller::{get_all_communities, get_remote_community};
+use crate::settings::Settings;
 use diesel::PgConnection;
 use std::str::FromStr;
 
@@ -117,6 +119,13 @@ impl Perform<GetCommunityResponse> for Oper<GetCommunity> {
   fn perform(&self, conn: &PgConnection) -> Result<GetCommunityResponse, Error> {
     let data: &GetCommunity = &self.data;
 
+    if data.name.is_some()
+      && Settings::get().federation_enabled
+      && data.name.as_ref().unwrap().contains('@')
+    {
+      return get_remote_community(data.name.as_ref().unwrap());
+    }
+
     let user_id: Option<i32> = match &data.auth {
       Some(auth) => match Claims::decode(&auth) {
         Ok(claims) => {
@@ -333,6 +342,12 @@ impl Perform<ListCommunitiesResponse> for Oper<ListCommunities> {
   fn perform(&self, conn: &PgConnection) -> Result<ListCommunitiesResponse, Error> {
     let data: &ListCommunities = &self.data;
 
+    if Settings::get().federation_enabled {
+      return Ok(ListCommunitiesResponse {
+        communities: get_all_communities()?,
+      });
+    }
+
     let user_claims: Option<Claims> = match &data.auth {
       Some(auth) => match Claims::decode(&auth) {
         Ok(claims) => Some(claims.claims),
index cefa5b076fc237b27ac7202cfdf71866978f54f3..e19d4ee9655f004d30270f3ec0e3eec8944143f1 100644 (file)
@@ -1,4 +1,5 @@
 use super::*;
+use crate::settings::Settings;
 use diesel::PgConnection;
 use std::str::FromStr;
 
@@ -220,6 +221,12 @@ impl Perform<GetPostsResponse> for Oper<GetPosts> {
   fn perform(&self, conn: &PgConnection) -> Result<GetPostsResponse, Error> {
     let data: &GetPosts = &self.data;
 
+    if Settings::get().federation_enabled {
+      dbg!(&data);
+      // TODO: intercept here (but the type is wrong)
+      //get_remote_community_posts(get_posts.community_id.unwrap())
+    }
+
     let user_claims: Option<Claims> = match &data.auth {
       Some(auth) => match Claims::decode(&auth) {
         Ok(claims) => Some(claims.claims),
index 941fbc3fad3b5baa917f59ce013d8c7dc6021da9..edadb7bf530458bf8ad618ba2a3d553d3bfadfb2 100644 (file)
@@ -26,14 +26,14 @@ fn fetch_communities_from_instance(domain: &str) -> Result<Vec<CommunityView>, E
 }
 
 // TODO: this should be cached or stored in the database
-fn get_remote_community_uri(identifier: String) -> String {
+fn get_remote_community_uri(identifier: &str) -> String {
   let x: Vec<&str> = identifier.split('@').collect();
   let name = x[0].replace("!", "");
   let instance = x[1];
   format!("http://{}/federation/c/{}", instance, name)
 }
 
-pub fn get_remote_community_posts(identifier: String) -> Result<GetPostsResponse, Error> {
+pub fn get_remote_community_posts(identifier: &str) -> Result<GetPostsResponse, Error> {
   let community: Group = reqwest::get(&get_remote_community_uri(identifier))?.json()?;
   let outbox_uri = &community.ap_actor_props.get_outbox().to_string();
   let outbox: OrderedCollection = reqwest::get(outbox_uri)?.json()?;
@@ -42,8 +42,8 @@ pub fn get_remote_community_posts(identifier: String) -> Result<GetPostsResponse
   unimplemented!()
 }
 
-pub fn get_remote_community(identifier: String) -> Result<GetCommunityResponse, failure::Error> {
-  let community: Group = reqwest::get(&get_remote_community_uri(identifier.clone()))?.json()?;
+pub fn get_remote_community(identifier: &str) -> Result<GetCommunityResponse, failure::Error> {
+  let community: Group = reqwest::get(&get_remote_community_uri(identifier))?.json()?;
   let followers_uri = &community
     .ap_actor_props
     .get_followers()
@@ -62,7 +62,7 @@ pub fn get_remote_community(identifier: String) -> Result<GetCommunityResponse,
     community: CommunityView {
       // TODO: we need to merge id and name into a single thing (stuff like @user@instance.com)
       id: 1337, //community.object_props.get_id()
-      name: identifier,
+      name: identifier.to_string(),
       title: community
         .object_props
         .get_name_xsd_string()
index 21588a5884d88bc512551614abeb6d9facba4ad4..8a8ccca0301b9798857437459f9a309eed43b4cc 100644 (file)
@@ -20,7 +20,6 @@ use crate::api::post::*;
 use crate::api::site::*;
 use crate::api::user::*;
 use crate::api::*;
-use crate::apub::puller::*;
 use crate::websocket::UserOperation;
 use crate::Settings;
 
@@ -502,9 +501,6 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result<Str
 
   let user_operation: UserOperation = UserOperation::from_str(&op)?;
 
-  // TODO: none of the chat messages are going to work if stuff is submitted via http api,
-  //       need to move that handling elsewhere
-
   // A DDOS check
   chat.check_rate_limit_message(msg.id, false)?;
 
@@ -552,21 +548,7 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result<Str
     UserOperation::GetCommunity => {
       let get_community: GetCommunity = serde_json::from_str(data)?;
 
-      let mut res = if Settings::get().federation_enabled {
-        if let Some(community_name) = get_community.name.to_owned() {
-          if community_name.contains('@') {
-            // TODO: need to support sort, filter etc for remote communities
-            // TODO: need to to this for http api as well
-            get_remote_community(community_name)?
-          } else {
-            Oper::new(get_community).perform(&conn)?
-          }
-        } else {
-          Oper::new(get_community).perform(&conn)?
-        }
-      } else {
-        Oper::new(get_community).perform(&conn)?
-      };
+      let mut res = Oper::new(get_community).perform(&conn)?;
 
       let community_id = res.community.id;
 
@@ -581,13 +563,7 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result<Str
       to_json_string(&user_operation, &res)
     }
     UserOperation::ListCommunities => {
-      if Settings::get().federation_enabled {
-        let res = get_all_communities()?;
-        let val = ListCommunitiesResponse { communities: res };
-        to_json_string(&user_operation, &val)
-      } else {
-        do_user_operation::<ListCommunities, ListCommunitiesResponse>(user_operation, data, &conn)
-      }
+      do_user_operation::<ListCommunities, ListCommunitiesResponse>(user_operation, data, &conn)
     }
     UserOperation::CreateCommunity => {
       chat.check_rate_limit_register(msg.id, true)?;
@@ -648,9 +624,7 @@ fn parse_json_message(chat: &mut ChatServer, msg: StandardMessage) -> Result<Str
     }
     UserOperation::GetPosts => {
       let get_posts: GetPosts = serde_json::from_str(data)?;
-      dbg!(&get_posts);
-      // TODO: intercept here (but the type is wrong)
-      //get_remote_community_posts(get_posts.community_id.unwrap())
+
       if get_posts.community_id.is_none() {
         // 0 is the "all" community
         chat.join_community_room(0, msg.id);