Add linked instances. (#1149)

* Adding linked instances. Fixes #1147

* Removing current instance, checking for federation enabled.

* Cleaning up.

* Switching to iterator.
This commit is contained in:
Dessalines 2020-09-24 09:46:57 -04:00 committed by GitHub
parent ab17e0a9f3
commit c6888472dc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 4 deletions

View file

@ -154,6 +154,11 @@ impl Community {
Ok(mods_and_admins) Ok(mods_and_admins)
} }
pub fn distinct_federated_communities(conn: &PgConnection) -> Result<Vec<String>, Error> {
use crate::schema::community::dsl::*;
community.select(actor_id).distinct().load::<String>(conn)
}
pub fn is_mod_or_admin(conn: &PgConnection, user_id: i32, community_id: i32) -> bool { pub fn is_mod_or_admin(conn: &PgConnection, user_id: i32, community_id: i32) -> bool {
Self::community_mods_and_admins(conn, community_id) Self::community_mods_and_admins(conn, community_id)
.unwrap_or_default() .unwrap_or_default()

View file

@ -8,7 +8,8 @@ use lemmy_db::{
Crud, Crud,
}; };
use lemmy_structs::blocking; use lemmy_structs::blocking;
use lemmy_utils::{APIError, ConnectionId, LemmyError}; use lemmy_utils::{settings::Settings, APIError, ConnectionId, LemmyError};
use url::Url;
pub mod claims; pub mod claims;
pub mod comment; pub mod comment;
@ -96,3 +97,32 @@ pub(in crate::api) async fn check_community_ban(
Ok(()) Ok(())
} }
} }
pub(in crate::api) async fn linked_instances(pool: &DbPool) -> Result<Vec<String>, LemmyError> {
let mut instances: Vec<String> = Vec::new();
if Settings::get().federation.enabled {
let distinct_communities = blocking(pool, move |conn| {
Community::distinct_federated_communities(conn)
})
.await??;
instances = distinct_communities
.iter()
.map(|actor_id| Ok(Url::parse(actor_id)?.host_str().unwrap_or("").to_string()))
.collect::<Result<Vec<String>, LemmyError>>()?;
instances.append(&mut Settings::get().get_allowed_instances());
instances.retain(|a| {
!Settings::get().get_blocked_instances().contains(a)
&& !a.eq("")
&& !a.eq(&Settings::get().hostname)
});
// Sort and remove dupes
instances.sort_unstable();
instances.dedup();
}
Ok(instances)
}

View file

@ -1,5 +1,5 @@
use crate::{ use crate::{
api::{get_user_from_jwt, get_user_from_jwt_opt, is_admin, Perform}, api::{get_user_from_jwt, get_user_from_jwt_opt, is_admin, linked_instances, Perform},
apub::fetcher::search_by_apub_id, apub::fetcher::search_by_apub_id,
version, version,
LemmyContext, LemmyContext,
@ -314,7 +314,7 @@ impl Perform for GetSite {
online, online,
version: version::VERSION.to_string(), version: version::VERSION.to_string(),
my_user, my_user,
federated_instances: Settings::get().get_allowed_instances(), federated_instances: linked_instances(context.pool()).await?,
}) })
} }
} }
@ -543,7 +543,7 @@ impl Perform for TransferSite {
online: 0, online: 0,
version: version::VERSION.to_string(), version: version::VERSION.to_string(),
my_user: Some(user), my_user: Some(user),
federated_instances: Settings::get().get_allowed_instances(), federated_instances: linked_instances(context.pool()).await?,
}) })
} }
} }

View file

@ -86,6 +86,7 @@ fn create_user(conn: &PgConnection, name: &str) -> User_ {
admin: false, admin: false,
banned: false, banned: false,
updated: None, updated: None,
published: None,
show_nsfw: false, show_nsfw: false,
theme: "darkly".into(), theme: "darkly".into(),
default_sort_type: SortType::Hot as i16, default_sort_type: SortType::Hot as i16,