-
-
Notifications
You must be signed in to change notification settings - Fork 897
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement restricted community (only mods can post) (fixes #187)
- Loading branch information
Showing
21 changed files
with
220 additions
and
93 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
use crate::Perform; | ||
use actix_web::web::Data; | ||
use lemmy_api_common::{ | ||
blocking, | ||
community::{CommunityResponse, HideCommunity}, | ||
get_local_user_view_from_jwt, | ||
is_admin, | ||
}; | ||
use lemmy_apub::protocol::activities::community::update::UpdateCommunity; | ||
use lemmy_db_schema::{ | ||
naive_now, | ||
source::{ | ||
community::{Community, CommunityForm}, | ||
moderator::{ModHideCommunity, ModHideCommunityForm}, | ||
}, | ||
traits::Crud, | ||
}; | ||
use lemmy_utils::{ConnectionId, LemmyError}; | ||
use lemmy_websocket::{send::send_community_ws_message, LemmyContext, UserOperationCrud}; | ||
|
||
#[async_trait::async_trait(?Send)] | ||
impl Perform for HideCommunity { | ||
type Response = CommunityResponse; | ||
|
||
#[tracing::instrument(skip(context, websocket_id))] | ||
async fn perform( | ||
&self, | ||
context: &Data<LemmyContext>, | ||
websocket_id: Option<ConnectionId>, | ||
) -> Result<CommunityResponse, LemmyError> { | ||
let data: &HideCommunity = self; | ||
|
||
// Verify its a admin (only admin can hide or unhide it) | ||
let local_user_view = | ||
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; | ||
is_admin(&local_user_view)?; | ||
|
||
let community_id = data.community_id; | ||
let read_community = blocking(context.pool(), move |conn| { | ||
Community::read(conn, community_id) | ||
}) | ||
.await??; | ||
|
||
let community_form = CommunityForm { | ||
name: read_community.name, | ||
title: read_community.title, | ||
description: read_community.description.to_owned(), | ||
hidden: Some(data.hidden), | ||
updated: Some(naive_now()), | ||
..CommunityForm::default() | ||
}; | ||
|
||
let mod_hide_community_form = ModHideCommunityForm { | ||
community_id: data.community_id, | ||
mod_person_id: local_user_view.person.id, | ||
reason: data.reason.clone(), | ||
hidden: Some(data.hidden), | ||
}; | ||
|
||
let community_id = data.community_id; | ||
let updated_community = blocking(context.pool(), move |conn| { | ||
Community::update(conn, community_id, &community_form) | ||
}) | ||
.await? | ||
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community_hidden_status"))?; | ||
|
||
blocking(context.pool(), move |conn| { | ||
ModHideCommunity::create(conn, &mod_hide_community_form) | ||
}) | ||
.await??; | ||
|
||
UpdateCommunity::send( | ||
updated_community.into(), | ||
&local_user_view.person.into(), | ||
context, | ||
) | ||
.await?; | ||
|
||
let op = UserOperationCrud::EditCommunity; | ||
send_community_ws_message(data.community_id, op, websocket_id, None, context).await | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,4 +2,6 @@ mod add_mod; | |
mod ban; | ||
mod block; | ||
mod follow; | ||
mod hide; | ||
mod restrict; | ||
mod transfer; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
use crate::Perform; | ||
use actix_web::web::Data; | ||
use lemmy_api_common::{ | ||
blocking, | ||
community::{CommunityResponse, RestrictCommunity}, | ||
get_local_user_view_from_jwt, | ||
is_mod_or_admin, | ||
}; | ||
use lemmy_apub::protocol::activities::community::update::UpdateCommunity; | ||
use lemmy_db_schema::{ | ||
naive_now, | ||
source::community::{Community, CommunityForm}, | ||
traits::Crud, | ||
}; | ||
use lemmy_utils::{ConnectionId, LemmyError}; | ||
use lemmy_websocket::{send::send_community_ws_message, LemmyContext, UserOperationCrud}; | ||
|
||
#[async_trait::async_trait(?Send)] | ||
impl Perform for RestrictCommunity { | ||
type Response = CommunityResponse; | ||
|
||
#[tracing::instrument(skip(context, websocket_id))] | ||
async fn perform( | ||
&self, | ||
context: &Data<LemmyContext>, | ||
websocket_id: Option<ConnectionId>, | ||
) -> Result<CommunityResponse, LemmyError> { | ||
let data: &RestrictCommunity = self; | ||
|
||
let local_user_view = | ||
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?; | ||
is_mod_or_admin(context.pool(), local_user_view.person.id, data.community_id).await?; | ||
|
||
let community_id = data.community_id; | ||
let read_community = blocking(context.pool(), move |conn| { | ||
Community::read(conn, community_id) | ||
}) | ||
.await??; | ||
|
||
let community_form = CommunityForm { | ||
name: read_community.name, | ||
title: read_community.title, | ||
posting_restricted: Some(data.restricted), | ||
updated: Some(naive_now()), | ||
..CommunityForm::default() | ||
}; | ||
|
||
let community_id = data.community_id; | ||
let updated_community = blocking(context.pool(), move |conn| { | ||
Community::update(conn, community_id, &community_form) | ||
}) | ||
.await? | ||
.map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community_hidden_status"))?; | ||
|
||
UpdateCommunity::send( | ||
updated_community.into(), | ||
&local_user_view.person.into(), | ||
context, | ||
) | ||
.await?; | ||
|
||
let op = UserOperationCrud::EditCommunity; | ||
send_community_ws_message(data.community_id, op, websocket_id, None, context).await | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.