]> Untitled Git - lemmy.git/commitdiff
Avoid using database views in federation code
authorFelix Ableitner <me@nutomic.com>
Fri, 3 Apr 2020 09:00:24 +0000 (11:00 +0200)
committerFelix Ableitner <me@nutomic.com>
Fri, 3 Apr 2020 09:00:24 +0000 (11:00 +0200)
docker/federation-test/nginx.conf
server/src/apub/community.rs
server/src/apub/post.rs
server/src/db/community.rs
server/src/db/post.rs

index 96fbf99746c667d7517ca2f3c09089325280995c..6dbe13b40892e4edec62fb2fcd861f7eee5f1ce4 100644 (file)
@@ -45,7 +45,7 @@ http {
          client_max_body_size 50M;
 
          location / {
-             proxy_pass http://lemmy_beta:8540;
+             proxy_pass http://lemmy_beta:8550;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header Host $host;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index 67cd99c492694bd410ac92600c83fcfbf327528e..37ba7c1007db3b13e2c2b99d3e865304a7ccfb2c 100644 (file)
@@ -1,5 +1,3 @@
-use crate::api::community::ListCommunities;
-use crate::api::{Oper, Perform};
 use crate::apub::puller::{fetch_remote_object, format_community_name};
 use crate::apub::{
   create_apub_response, get_apub_protocol_string, make_apub_endpoint, EndpointType, GroupExt,
@@ -8,7 +6,7 @@ use crate::convert_datetime;
 use crate::db::community::Community;
 use crate::db::community_view::{CommunityFollowerView, CommunityView};
 use crate::db::establish_unpooled_connection;
-use crate::db::post_view::{PostQueryBuilder, PostView};
+use crate::db::post::Post;
 use crate::settings::Settings;
 use activitystreams::actor::properties::ApActorProperties;
 use activitystreams::collection::OrderedCollection;
@@ -34,20 +32,10 @@ pub async fn get_apub_community_list(
   db: web::Data<Pool<ConnectionManager<PgConnection>>>,
 ) -> Result<HttpResponse<Body>, Error> {
   // TODO: implement pagination
-  let query = ListCommunities {
-    sort: "Hot".to_string(),
-    page: None,
-    limit: None,
-    auth: None,
-    local_only: Some(true),
-  };
-  let communities = Oper::new(query)
-    .perform(&db.get().unwrap())
-    .unwrap()
-    .communities
+  let communities = Community::list(&db.get().unwrap())?
     .iter()
     .map(|c| c.as_group())
-    .collect::<Result<Vec<GroupExt>, failure::Error>>()?;
+    .collect::<Result<Vec<GroupExt>, Error>>()?;
   let mut collection = UnorderedCollection::default();
   let oprops: &mut ObjectProperties = collection.as_mut();
   oprops.set_context_xsd_any_uri(context())?.set_id(format!(
@@ -63,7 +51,7 @@ pub async fn get_apub_community_list(
   Ok(create_apub_response(&collection))
 }
 
-impl CommunityView {
+impl Community {
   fn as_group(&self) -> Result<GroupExt, Error> {
     let base_url = make_apub_endpoint(EndpointType::Community, &self.name);
 
@@ -97,7 +85,9 @@ impl CommunityView {
 
     Ok(group.extend(actor_props))
   }
+}
 
+impl CommunityView {
   pub fn from_group(group: &GroupExt, domain: &str) -> Result<CommunityView, Error> {
     let followers_uri = &group.extension.get_followers().unwrap().to_string();
     let outbox_uri = &group.extension.get_outbox().to_string();
@@ -147,8 +137,7 @@ pub async fn get_apub_community_http(
   db: web::Data<Pool<ConnectionManager<PgConnection>>>,
 ) -> Result<HttpResponse<Body>, Error> {
   let community = Community::read_from_name(&&db.get()?, info.community_name.to_owned())?;
-  let community_view = CommunityView::read(&&db.get()?, community.id, None)?;
-  let c = community_view.as_group()?;
+  let c = community.as_group()?;
   Ok(create_apub_response(&c))
 }
 
@@ -184,10 +173,7 @@ pub async fn get_apub_community_outbox(
 
   let connection = establish_unpooled_connection();
   //As we are an object, we validated that the community id was valid
-  let community_posts: Vec<PostView> = PostQueryBuilder::create(&connection)
-    .for_community_id(community.id)
-    .list()
-    .unwrap();
+  let community_posts: Vec<Post> = Post::list_for_community(&connection, community.id)?;
 
   let mut collection = OrderedCollection::default();
   let oprops: &mut ObjectProperties = collection.as_mut();
index a9b50013c251508b60f43a272186f9a3ad4883a0..94f3b00e1b68f94e8f8ce757ea07f53357eb5e20 100644 (file)
@@ -1,4 +1,5 @@
 use crate::apub::{create_apub_response, make_apub_endpoint, EndpointType};
+use crate::db::post::Post;
 use crate::db::post_view::PostView;
 use crate::{convert_datetime, naive_now};
 use activitystreams::{object::properties::ObjectProperties, object::Page};
@@ -20,12 +21,11 @@ pub async fn get_apub_post(
   db: web::Data<Pool<ConnectionManager<PgConnection>>>,
 ) -> Result<HttpResponse<Body>, Error> {
   let id = info.post_id.parse::<i32>()?;
-  // TODO: shows error: missing field `user_name`
-  let post = PostView::read(&&db.get()?, id, None)?;
+  let post = Post::read(&&db.get()?, id)?;
   Ok(create_apub_response(&post.as_page()?))
 }
 
-impl PostView {
+impl Post {
   pub fn as_page(&self) -> Result<Page, Error> {
     let base_url = make_apub_endpoint(EndpointType::Post, &self.id.to_string());
     let mut page = Page::default();
@@ -59,7 +59,9 @@ impl PostView {
 
     Ok(page)
   }
+}
 
+impl PostView {
   pub fn from_page(page: &Page) -> Result<PostView, Error> {
     let oprops = &page.object_props;
     Ok(PostView {
index ff57822438531e8a651c331dcdc2501d36763417..08354d420a88b12c782c9ee98ddd2365767db7b4 100644 (file)
@@ -79,6 +79,11 @@ impl Community {
       .first::<Self>(conn)
   }
 
+  pub fn list(conn: &PgConnection) -> Result<Vec<Self>, Error> {
+    use crate::schema::community::dsl::*;
+    community.load::<Community>(conn)
+  }
+
   pub fn get_url(&self) -> String {
     format!("https://{}/c/{}", Settings::get().hostname, self.name)
   }
index bf9a9ad7354f6f99cb96ef52cca00b3e9b74d5e6..bd8d9e43a2fdcad6adca3822da28f0c2aab0c3e2 100644 (file)
@@ -43,6 +43,23 @@ pub struct PostForm {
   pub thumbnail_url: Option<String>,
 }
 
+impl Post {
+  pub fn read(conn: &PgConnection, post_id: i32) -> Result<Self, Error> {
+    use crate::schema::post::dsl::*;
+    post.filter(id.eq(post_id)).first::<Self>(conn)
+  }
+
+  pub fn list_for_community(
+    conn: &PgConnection,
+    the_community_id: i32,
+  ) -> Result<Vec<Self>, Error> {
+    use crate::schema::post::dsl::*;
+    post
+      .filter(community_id.eq(the_community_id))
+      .load::<Self>(conn)
+  }
+}
+
 impl Crud<PostForm> for Post {
   fn read(conn: &PgConnection, post_id: i32) -> Result<Self, Error> {
     use crate::schema::post::dsl::*;