From: Felix Ableitner Date: Fri, 3 Apr 2020 09:00:24 +0000 (+0200) Subject: Avoid using database views in federation code X-Git-Url: http://these/git/ui/assets/%7BsortingHelpUrl%7D?a=commitdiff_plain;h=c16458b728396970fd5727566ed43d866dd04ee5;p=lemmy.git Avoid using database views in federation code --- diff --git a/docker/federation-test/nginx.conf b/docker/federation-test/nginx.conf index 96fbf997..6dbe13b4 100644 --- a/docker/federation-test/nginx.conf +++ b/docker/federation-test/nginx.conf @@ -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; diff --git a/server/src/apub/community.rs b/server/src/apub/community.rs index 67cd99c4..37ba7c10 100644 --- a/server/src/apub/community.rs +++ b/server/src/apub/community.rs @@ -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>>, ) -> Result, 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::, failure::Error>>()?; + .collect::, 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 { 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 { 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>>, ) -> Result, 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 = PostQueryBuilder::create(&connection) - .for_community_id(community.id) - .list() - .unwrap(); + let community_posts: Vec = Post::list_for_community(&connection, community.id)?; let mut collection = OrderedCollection::default(); let oprops: &mut ObjectProperties = collection.as_mut(); diff --git a/server/src/apub/post.rs b/server/src/apub/post.rs index a9b50013..94f3b00e 100644 --- a/server/src/apub/post.rs +++ b/server/src/apub/post.rs @@ -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>>, ) -> Result, Error> { let id = info.post_id.parse::()?; - // 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 { 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 { let oprops = &page.object_props; Ok(PostView { diff --git a/server/src/db/community.rs b/server/src/db/community.rs index ff578224..08354d42 100644 --- a/server/src/db/community.rs +++ b/server/src/db/community.rs @@ -79,6 +79,11 @@ impl Community { .first::(conn) } + pub fn list(conn: &PgConnection) -> Result, Error> { + use crate::schema::community::dsl::*; + community.load::(conn) + } + pub fn get_url(&self) -> String { format!("https://{}/c/{}", Settings::get().hostname, self.name) } diff --git a/server/src/db/post.rs b/server/src/db/post.rs index bf9a9ad7..bd8d9e43 100644 --- a/server/src/db/post.rs +++ b/server/src/db/post.rs @@ -43,6 +43,23 @@ pub struct PostForm { pub thumbnail_url: Option, } +impl Post { + pub fn read(conn: &PgConnection, post_id: i32) -> Result { + use crate::schema::post::dsl::*; + post.filter(id.eq(post_id)).first::(conn) + } + + pub fn list_for_community( + conn: &PgConnection, + the_community_id: i32, + ) -> Result, Error> { + use crate::schema::post::dsl::*; + post + .filter(community_id.eq(the_community_id)) + .load::(conn) + } +} + impl Crud for Post { fn read(conn: &PgConnection, post_id: i32) -> Result { use crate::schema::post::dsl::*;