use actix_web::{post, web::Data, HttpRequest, HttpResponse}; use sqlx::query; use std::{collections::HashMap, fmt::Write}; use crate::{ ctx::Ctx, db::models::Post, error::NekrochanError, markup::markup, qsform::QsForm, web::{tcx::TemplateCtx, template_response}, }; use super::{get_posts_from_ids, ActionTemplate}; #[post("/actions/edit-posts")] pub async fn edit_posts( ctx: Data, req: HttpRequest, QsForm(edits): QsForm>, ) -> Result { let tcx = TemplateCtx::new(&ctx, &req).await?; if !(tcx.perms.owner() || tcx.perms.edit_posts()) { return Err(NekrochanError::InsufficientPermissionError); } let ids = edits.keys().map(|s| s.to_owned()).collect::>(); let posts = get_posts_from_ids(&ctx, &ids) .await .into_iter() .map(|post| (format!("{}/{}", post.board, post.id), post)) .collect::>(); let mut response = String::new(); let mut posts_edited = 0; for (key, content_nomarkup) in edits { let post = &posts[&key]; let content_nomarkup = content_nomarkup.trim(); let (content, quoted_posts) = markup( &ctx, &tcx.perms, Some(post.board.clone()), post.thread, content_nomarkup, ) .await?; post.update_content(&ctx, content, content_nomarkup.into()) .await?; query(&format!( "UPDATE posts_{} SET quotes = array_remove(quotes, $1) WHERE $1 = ANY(quotes)", post.board )) .bind(post.id) .execute(ctx.db()) .await?; for quoted_post in quoted_posts { quoted_post.update_quotes(&ctx, post.id).await?; } posts_edited += 1; } if posts_edited != 0 { writeln!(&mut response, "[Úspěch] Upraveny příspěvky: {posts_edited}").ok(); } let template = ActionTemplate { tcx, response }; template_response(&template) }