1 use activitypub_federation::config::Data;
2 use actix_web::web::Json;
3 use lemmy_api_common::{
4 build_response::build_post_response,
6 post::{LockPost, PostResponse},
7 send_activity::{ActivityChannel, SendActivityData},
10 check_community_deleted_or_removed,
12 local_user_view_from_jwt,
15 use lemmy_db_schema::{
17 moderator::{ModLockPost, ModLockPostForm},
18 post::{Post, PostUpdateForm},
22 use lemmy_utils::error::LemmyError;
24 #[tracing::instrument(skip(context))]
25 pub async fn lock_post(
27 context: Data<LemmyContext>,
28 ) -> Result<Json<PostResponse>, LemmyError> {
29 let local_user_view = local_user_view_from_jwt(&data.auth, &context).await?;
31 let post_id = data.post_id;
32 let orig_post = Post::read(&mut context.pool(), post_id).await?;
35 local_user_view.person.id,
36 orig_post.community_id,
40 check_community_deleted_or_removed(orig_post.community_id, &mut context.pool()).await?;
42 // Verify that only the mods can lock
45 local_user_view.person.id,
46 orig_post.community_id,
51 let post_id = data.post_id;
52 let locked = data.locked;
53 let post = Post::update(
56 &PostUpdateForm::builder().locked(Some(locked)).build(),
61 let form = ModLockPostForm {
62 mod_person_id: local_user_view.person.id,
63 post_id: data.post_id,
66 ModLockPost::create(&mut context.pool(), &form).await?;
68 let person_id = local_user_view.person.id;
69 ActivityChannel::submit_activity(
70 SendActivityData::LockPost(post, local_user_view.person, data.locked),
75 build_post_response(&context, orig_post.community_id, person_id, post_id).await