-use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
-
-#[async_trait::async_trait(?Send)]
-impl PerformCrud for CreatePost {
- type Response = PostResponse;
-
- async fn perform(
- &self,
- context: &Data<LemmyContext>,
- websocket_id: Option<ConnectionId>,
- ) -> Result<PostResponse, LemmyError> {
- let data: &CreatePost = self;
- let local_user_view = get_local_user_view_from_jwt(&data.auth, context.pool()).await?;
-
- check_slurs(&data.name)?;
- check_slurs_opt(&data.body)?;
+use tracing::Instrument;
+use url::Url;
+use webmention::{Webmention, WebmentionError};
+
+#[tracing::instrument(skip(context))]
+pub async fn create_post(
+ data: Json<CreatePost>,
+ context: Data<LemmyContext>,
+) -> Result<Json<PostResponse>, LemmyError> {
+ let local_user_view = local_user_view_from_jwt(&data.auth, &context).await?;
+ let local_site = LocalSite::read(&mut context.pool()).await?;
+
+ let slur_regex = local_site_to_slur_regex(&local_site);
+ check_slurs(&data.name, &slur_regex)?;
+ check_slurs_opt(&data.body, &slur_regex)?;
+ honeypot_check(&data.honeypot)?;
+
+ let data_url = data.url.as_ref();
+ let url = data_url.map(clean_url_params).map(Into::into); // TODO no good way to handle a "clear"
+
+ is_valid_post_title(&data.name)?;
+ is_valid_body_field(&data.body, true)?;
+ check_url_scheme(&data.url)?;
+
+ check_community_ban(
+ local_user_view.person.id,
+ data.community_id,
+ &mut context.pool(),
+ )
+ .await?;
+ check_community_deleted_or_removed(data.community_id, &mut context.pool()).await?;
+
+ let community_id = data.community_id;
+ let community = Community::read(&mut context.pool(), community_id).await?;
+ if community.posting_restricted_to_mods {
+ let community_id = data.community_id;
+ let is_mod = CommunityView::is_mod_or_admin(
+ &mut context.pool(),
+ local_user_view.local_user.person_id,
+ community_id,
+ )
+ .await?;
+ if !is_mod {
+ return Err(LemmyErrorType::OnlyModsCanPostInCommunity)?;
+ }
+ }