2 activities::receive::get_actor_as_user,
3 inbox::receive_for_community::verify_mod_activity,
9 activity::{Announce, Create, Dislike, Like, Update},
13 use lemmy_api_structs::{blocking, post::PostResponse};
14 use lemmy_db_queries::{source::post::Post_, ApubObject, Crud, Likeable};
15 use lemmy_db_schema::{
18 post::{Post, PostLike, PostLikeForm},
22 use lemmy_db_views::post_view::PostView;
23 use lemmy_utils::{location_info, LemmyError};
24 use lemmy_websocket::{messages::SendPost, LemmyContext, UserOperation};
26 pub(crate) async fn receive_create_post(
28 context: &LemmyContext,
29 request_counter: &mut i32,
30 ) -> Result<(), LemmyError> {
31 let user = get_actor_as_user(&create, context, request_counter).await?;
32 let page = PageExt::from_any_base(create.object().to_owned().one().context(location_info!())?)?
33 .context(location_info!())?;
35 let post = Post::from_apub(&page, context, user.actor_id(), request_counter, false).await?;
38 let post_id = post.id;
39 let post_view = blocking(context.pool(), move |conn| {
40 PostView::read(conn, post_id, None)
44 let res = PostResponse { post_view };
46 context.chat_server().do_send(SendPost {
47 op: UserOperation::CreatePost,
55 pub(crate) async fn receive_update_post(
57 announce: Option<Announce>,
58 context: &LemmyContext,
59 request_counter: &mut i32,
60 ) -> Result<(), LemmyError> {
61 let user = get_actor_as_user(&update, context, request_counter).await?;
62 let page = PageExt::from_any_base(update.object().to_owned().one().context(location_info!())?)?
63 .context(location_info!())?;
65 let post_id: DbUrl = page
67 .context(location_info!())?
70 let old_post = blocking(context.pool(), move |conn| {
71 Post::read_from_apub_id(conn, &post_id)
75 // If sticked or locked state was changed, make sure the actor is a mod
76 let stickied = page.ext_one.stickied.context(location_info!())?;
77 let locked = !page.ext_one.comments_enabled.context(location_info!())?;
78 let mut is_mod_action = false;
79 if stickied != old_post.stickied || locked != old_post.locked {
80 let community = blocking(context.pool(), move |conn| {
81 Community::read(conn, old_post.community_id)
84 verify_mod_activity(&update, announce, &community, context).await?;
88 let post = Post::from_apub(
97 let post_id = post.id;
99 let post_view = blocking(context.pool(), move |conn| {
100 PostView::read(conn, post_id, None)
104 let res = PostResponse { post_view };
106 context.chat_server().do_send(SendPost {
107 op: UserOperation::EditPost,
115 pub(crate) async fn receive_like_post(
118 context: &LemmyContext,
119 request_counter: &mut i32,
120 ) -> Result<(), LemmyError> {
121 let user = get_actor_as_user(&like, context, request_counter).await?;
123 let post_id = post.id;
124 let like_form = PostLikeForm {
129 let user_id = user.id;
130 blocking(context.pool(), move |conn| {
131 PostLike::remove(conn, user_id, post_id)?;
132 PostLike::like(conn, &like_form)
137 let post_view = blocking(context.pool(), move |conn| {
138 PostView::read(conn, post_id, None)
142 let res = PostResponse { post_view };
144 context.chat_server().do_send(SendPost {
145 op: UserOperation::CreatePostLike,
153 pub(crate) async fn receive_dislike_post(
156 context: &LemmyContext,
157 request_counter: &mut i32,
158 ) -> Result<(), LemmyError> {
159 let user = get_actor_as_user(&dislike, context, request_counter).await?;
161 let post_id = post.id;
162 let like_form = PostLikeForm {
167 let user_id = user.id;
168 blocking(context.pool(), move |conn| {
169 PostLike::remove(conn, user_id, post_id)?;
170 PostLike::like(conn, &like_form)
175 let post_view = blocking(context.pool(), move |conn| {
176 PostView::read(conn, post_id, None)
180 let res = PostResponse { post_view };
182 context.chat_server().do_send(SendPost {
183 op: UserOperation::CreatePostLike,
191 pub(crate) async fn receive_delete_post(
192 context: &LemmyContext,
194 ) -> Result<(), LemmyError> {
195 let deleted_post = blocking(context.pool(), move |conn| {
196 Post::update_deleted(conn, post.id, true)
201 let post_id = deleted_post.id;
202 let post_view = blocking(context.pool(), move |conn| {
203 PostView::read(conn, post_id, None)
207 let res = PostResponse { post_view };
208 context.chat_server().do_send(SendPost {
209 op: UserOperation::EditPost,
217 pub(crate) async fn receive_remove_post(
218 context: &LemmyContext,
220 ) -> Result<(), LemmyError> {
221 let removed_post = blocking(context.pool(), move |conn| {
222 Post::update_removed(conn, post.id, true)
227 let post_id = removed_post.id;
228 let post_view = blocking(context.pool(), move |conn| {
229 PostView::read(conn, post_id, None)
233 let res = PostResponse { post_view };
234 context.chat_server().do_send(SendPost {
235 op: UserOperation::EditPost,