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 {
Self::community_mods_and_admins(conn, community_id)
.unwrap_or_default()
Crud,
};
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 comment;
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)
+}
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,
version,
LemmyContext,
online,
version: version::VERSION.to_string(),
my_user,
- federated_instances: Settings::get().get_allowed_instances(),
+ federated_instances: linked_instances(context.pool()).await?,
})
}
}
online: 0,
version: version::VERSION.to_string(),
my_user: Some(user),
- federated_instances: Settings::get().get_allowed_instances(),
+ federated_instances: linked_instances(context.pool()).await?,
})
}
}
admin: false,
banned: false,
updated: None,
+ published: None,
show_nsfw: false,
theme: "darkly".into(),
default_sort_type: SortType::Hot as i16,