X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapi%2Fsrc%2Fcommunity%2Ftransfer.rs;h=c63c25750fd66b0a00c9f391b795438776cd7da2;hb=c8063f3267cf2b3622f1fdc69128c6b55feefbbc;hp=05282f457d4939edb78a8baac433e185d674b1f1;hpb=3951a16447fdccfde3b0ec2ef8fcbf9f89562adc;p=lemmy.git diff --git a/crates/api/src/community/transfer.rs b/crates/api/src/community/transfer.rs index 05282f45..c63c2575 100644 --- a/crates/api/src/community/transfer.rs +++ b/crates/api/src/community/transfer.rs @@ -2,9 +2,9 @@ use crate::Perform; use actix_web::web::Data; use anyhow::Context; use lemmy_api_common::{ - blocking, community::{GetCommunityResponse, TransferCommunity}, - get_local_user_view_from_jwt, + context::LemmyContext, + utils::{is_admin, is_top_mod, local_user_view_from_jwt}, }; use lemmy_db_schema::{ source::{ @@ -13,13 +13,11 @@ use lemmy_db_schema::{ }, traits::{Crud, Joinable}, }; -use lemmy_db_views_actor::{ - community_moderator_view::CommunityModeratorView, - community_view::CommunityView, - person_view::PersonViewSafe, +use lemmy_db_views_actor::structs::{CommunityModeratorView, CommunityView}; +use lemmy_utils::{ + error::{LemmyError, LemmyErrorExt, LemmyErrorType}, + location_info, }; -use lemmy_utils::{location_info, ConnectionId, LemmyError}; -use lemmy_websocket::LemmyContext; // 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. @@ -27,33 +25,24 @@ use lemmy_websocket::LemmyContext; 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 admins = blocking(context.pool(), PersonViewSafe::admins).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 = blocking(context.pool(), move |conn| { - CommunityModeratorView::for_community(conn, community_id) - }) - .await??; + let mut community_mods = + CommunityModeratorView::for_community(&mut context.pool(), community_id).await?; // Make sure transferrer is either the top community mod, or an admin - if local_user_view.person.id != community_mods[0].moderator.id - && !admins - .iter() - .map(|a| a.person.id) - .any(|x| x == local_user_view.person.id) + 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. @@ -67,10 +56,8 @@ impl Perform for TransferCommunity { // Delete all the mods let community_id = data.community_id; - blocking(context.pool(), move |conn| { - CommunityModerator::delete_for_community(conn, 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 @@ -80,10 +67,9 @@ impl Perform for TransferCommunity { person_id: cmod.moderator.id, }; - let join = move |conn: &'_ _| CommunityModerator::join(conn, &community_moderator_form); - blocking(context.pool(), join) - .await? - .map_err(|e| LemmyError::from_error_message(e, "community_moderator_already_exists"))?; + CommunityModerator::join(&mut context.pool(), &community_moderator_form) + .await + .with_lemmy_type(LemmyErrorType::CommunityModeratorAlreadyExists)?; } // Mod tables @@ -91,34 +77,28 @@ impl Perform for TransferCommunity { mod_person_id: local_user_view.person.id, other_person_id: data.person_id, community_id: data.community_id, - removed: Some(false), }; - blocking(context.pool(), move |conn| { - ModTransferCommunity::create(conn, &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 = blocking(context.pool(), move |conn| { - CommunityView::read(conn, community_id, Some(person_id)) - }) - .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 = blocking(context.pool(), move |conn| { - CommunityModeratorView::for_community(conn, community_id) - }) - .await? - .map_err(|e| LemmyError::from_error_message(e, "couldnt_find_community"))?; + let moderators = CommunityModeratorView::for_community(&mut context.pool(), community_id) + .await + .with_lemmy_type(LemmyErrorType::CouldntFindCommunity)?; // Return the jwt Ok(GetCommunityResponse { community_view, site: None, moderators, - online: 0, + discussion_languages: vec![], }) } }