X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Fapi%2Fread_community.rs;h=1bdfb88a0ff775d3c0e30b1b226d7eb869e03be2;hb=37998b3398ed925a7640a9b67d1dc6ef871893a9;hp=3dc56a940f46e36636d63734c438be3ad412a682;hpb=63f54a3103684fd375428331f730b9a104add3a9;p=lemmy.git diff --git a/crates/apub/src/api/read_community.rs b/crates/apub/src/api/read_community.rs index 3dc56a94..1bdfb88a 100644 --- a/crates/apub/src/api/read_community.rs +++ b/crates/apub/src/api/read_community.rs @@ -1,114 +1,85 @@ -use crate::{ - api::PerformApub, - fetcher::resolve_actor_identifier, - objects::community::ApubCommunity, -}; +use crate::{fetcher::resolve_actor_identifier, objects::community::ApubCommunity}; use activitypub_federation::config::Data; +use actix_web::web::{Json, Query}; use lemmy_api_common::{ community::{GetCommunity, GetCommunityResponse}, context::LemmyContext, - utils::{check_private_instance, get_local_user_view_from_jwt_opt, is_mod_or_admin_opt}, - websocket::handlers::online_users::GetCommunityUsersOnline, + utils::{check_private_instance, is_mod_or_admin_opt, local_user_view_from_jwt_opt}, }; -use lemmy_db_schema::{ - impls::actor_language::default_post_language, - source::{ - actor_language::CommunityLanguage, - community::Community, - local_site::LocalSite, - site::Site, - }, +use lemmy_db_schema::source::{ + actor_language::CommunityLanguage, + community::Community, + local_site::LocalSite, + site::Site, }; use lemmy_db_views_actor::structs::{CommunityModeratorView, CommunityView}; -use lemmy_utils::{error::LemmyError, ConnectionId}; - -#[async_trait::async_trait] -impl PerformApub for GetCommunity { - type Response = GetCommunityResponse; - - #[tracing::instrument(skip(context, _websocket_id))] - async fn perform( - &self, - context: &Data, - _websocket_id: Option, - ) -> Result { - let data: &GetCommunity = self; - let local_user_view = - get_local_user_view_from_jwt_opt(data.auth.as_ref(), context.pool(), context.secret()) - .await?; - let local_site = LocalSite::read(context.pool()).await?; +use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorExt2, LemmyErrorType}; - if data.name.is_none() && data.id.is_none() { - return Err(LemmyError::from_message("no_id_given")); - } +#[tracing::instrument(skip(context))] +pub async fn get_community( + data: Query, + context: Data, +) -> Result, LemmyError> { + let local_user_view = local_user_view_from_jwt_opt(data.auth.as_ref(), &context).await; + let local_site = LocalSite::read(&mut context.pool()).await?; - check_private_instance(&local_user_view, &local_site)?; + if data.name.is_none() && data.id.is_none() { + return Err(LemmyErrorType::NoIdGiven)?; + } - let person_id = local_user_view.as_ref().map(|u| u.person.id); + check_private_instance(&local_user_view, &local_site)?; - let community_id = match data.id { - Some(id) => id, - None => { - let name = data.name.clone().unwrap_or_else(|| "main".to_string()); - resolve_actor_identifier::(&name, context, &local_user_view, true) - .await - .map_err(|e| e.with_message("couldnt_find_community"))? - .id - } - }; + let person_id = local_user_view.as_ref().map(|u| u.person.id); - let is_mod_or_admin = - is_mod_or_admin_opt(context.pool(), local_user_view.as_ref(), Some(community_id)) + let community_id = match data.id { + Some(id) => id, + None => { + let name = data.name.clone().unwrap_or_else(|| "main".to_string()); + resolve_actor_identifier::(&name, &context, &local_user_view, true) .await - .is_ok(); + .with_lemmy_type(LemmyErrorType::CouldntFindCommunity)? + .id + } + }; - let community_view = CommunityView::read( - context.pool(), - community_id, - person_id, - Some(is_mod_or_admin), - ) - .await - .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?; + let is_mod_or_admin = is_mod_or_admin_opt( + &mut context.pool(), + local_user_view.as_ref(), + Some(community_id), + ) + .await + .is_ok(); - let moderators = CommunityModeratorView::for_community(context.pool(), community_id) - .await - .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?; + let community_view = CommunityView::read( + &mut context.pool(), + community_id, + person_id, + Some(is_mod_or_admin), + ) + .await + .with_lemmy_type(LemmyErrorType::CouldntFindCommunity)?; - let online = context - .chat_server() - .send(GetCommunityUsersOnline { community_id }) - .await?; + let moderators = CommunityModeratorView::for_community(&mut context.pool(), community_id) + .await + .with_lemmy_type(LemmyErrorType::CouldntFindCommunity)?; - let site_id = - Site::instance_actor_id_from_url(community_view.community.actor_id.clone().into()); - let mut site = Site::read_from_apub_id(context.pool(), &site_id.into()).await?; - // no need to include metadata for local site (its already available through other endpoints). - // this also prevents us from leaking the federation private key. - if let Some(s) = &site { - if s.actor_id.domain() == Some(context.settings().hostname.as_ref()) { - site = None; - } + let site_id = Site::instance_actor_id_from_url(community_view.community.actor_id.clone().into()); + let mut site = Site::read_from_apub_id(&mut context.pool(), &site_id.into()).await?; + // no need to include metadata for local site (its already available through other endpoints). + // this also prevents us from leaking the federation private key. + if let Some(s) = &site { + if s.actor_id.domain() == Some(context.settings().hostname.as_ref()) { + site = None; } + } - let community_id = community_view.community.id; - let discussion_languages = CommunityLanguage::read(context.pool(), community_id).await?; - let default_post_language = if let Some(user) = local_user_view { - default_post_language(context.pool(), community_id, user.local_user.id).await? - } else { - None - }; - - let res = GetCommunityResponse { - community_view, - site, - moderators, - online, - discussion_languages, - default_post_language, - }; + let community_id = community_view.community.id; + let discussion_languages = CommunityLanguage::read(&mut context.pool(), community_id).await?; - // Return the jwt - Ok(res) - } + Ok(Json(GetCommunityResponse { + community_view, + site, + moderators, + discussion_languages, + })) }