X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapi%2Fsrc%2Fcommunity%2Ftransfer.rs;h=c63c25750fd66b0a00c9f391b795438776cd7da2;hb=c8063f3267cf2b3622f1fdc69128c6b55feefbbc;hp=a34dfb40d56f3064cc8e2ea96a4243fcfdf4402d;hpb=d8722b6e91a79878001d968150687d25c5d6905e;p=lemmy.git diff --git a/crates/api/src/community/transfer.rs b/crates/api/src/community/transfer.rs index a34dfb40..c63c2575 100644 --- a/crates/api/src/community/transfer.rs +++ b/crates/api/src/community/transfer.rs @@ -4,7 +4,7 @@ use anyhow::Context; use lemmy_api_common::{ community::{GetCommunityResponse, TransferCommunity}, context::LemmyContext, - utils::{get_local_user_view_from_jwt, is_admin, is_top_mod}, + utils::{is_admin, is_top_mod, local_user_view_from_jwt}, }; use lemmy_db_schema::{ source::{ @@ -14,7 +14,10 @@ use lemmy_db_schema::{ traits::{Crud, Joinable}, }; use lemmy_db_views_actor::structs::{CommunityModeratorView, CommunityView}; -use lemmy_utils::{error::LemmyError, location_info, ConnectionId}; +use lemmy_utils::{ + error::{LemmyError, LemmyErrorExt, LemmyErrorType}, + location_info, +}; // TODO: we dont do anything for federation here, it should be updated the next time the community // gets fetched. i hope we can get rid of the community creator role soon. @@ -22,26 +25,24 @@ use lemmy_utils::{error::LemmyError, location_info, ConnectionId}; impl Perform for TransferCommunity { type Response = GetCommunityResponse; - #[tracing::instrument(skip(context, _websocket_id))] + #[tracing::instrument(skip(context))] async fn perform( &self, context: &Data, - _websocket_id: Option, ) -> Result { let data: &TransferCommunity = self; - let local_user_view = - get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; + let local_user_view = local_user_view_from_jwt(&data.auth, context).await?; // Fetch the community mods let community_id = data.community_id; let mut community_mods = - CommunityModeratorView::for_community(context.pool(), community_id).await?; + CommunityModeratorView::for_community(&mut context.pool(), community_id).await?; // Make sure transferrer is either the top community mod, or an admin if !(is_top_mod(&local_user_view, &community_mods).is_ok() || is_admin(&local_user_view).is_ok()) { - return Err(LemmyError::from_message("not_an_admin")); + return Err(LemmyErrorType::NotAnAdmin)?; } // You have to re-do the community_moderator table, reordering it. @@ -56,7 +57,7 @@ impl Perform for TransferCommunity { // Delete all the mods let community_id = data.community_id; - CommunityModerator::delete_for_community(context.pool(), community_id).await?; + CommunityModerator::delete_for_community(&mut context.pool(), community_id).await?; // TODO: this should probably be a bulk operation // Re-add the mods, in the new order @@ -66,9 +67,9 @@ impl Perform for TransferCommunity { person_id: cmod.moderator.id, }; - CommunityModerator::join(context.pool(), &community_moderator_form) + CommunityModerator::join(&mut context.pool(), &community_moderator_form) .await - .map_err(|e| LemmyError::from_error_message(e, "community_moderator_already_exists"))?; + .with_lemmy_type(LemmyErrorType::CommunityModeratorAlreadyExists)?; } // Mod tables @@ -78,27 +79,26 @@ impl Perform for TransferCommunity { community_id: data.community_id, }; - ModTransferCommunity::create(context.pool(), &form).await?; + ModTransferCommunity::create(&mut context.pool(), &form).await?; let community_id = data.community_id; let person_id = local_user_view.person.id; - let community_view = CommunityView::read(context.pool(), community_id, Some(person_id), None) - .await - .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?; + let community_view = + CommunityView::read(&mut context.pool(), community_id, Some(person_id), false) + .await + .with_lemmy_type(LemmyErrorType::CouldntFindCommunity)?; let community_id = data.community_id; - let moderators = CommunityModeratorView::for_community(context.pool(), community_id) + let moderators = CommunityModeratorView::for_community(&mut context.pool(), community_id) .await - .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?; + .with_lemmy_type(LemmyErrorType::CouldntFindCommunity)?; // Return the jwt Ok(GetCommunityResponse { community_view, site: None, moderators, - online: 0, discussion_languages: vec![], - default_post_language: None, }) } }