diff --git a/src/main/java/ru/org/linux/comment/CommentDeleteService.java b/src/main/java/ru/org/linux/comment/CommentDeleteService.java index 4add8a226..adbb3c467 100644 --- a/src/main/java/ru/org/linux/comment/CommentDeleteService.java +++ b/src/main/java/ru/org/linux/comment/CommentDeleteService.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2022 Linux.org.ru + * Copyright 1998-2024 Linux.org.ru * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -168,7 +168,7 @@ private List deleteReplys(Comment root, String rootReason, List deleteInfos = new ArrayList<>(replys.size()); for (CommentAndDepth cur : replys) { - Comment child = cur.getComment(); + Comment child = cur.comment(); DeleteInfoDao.InsertDeleteInfo info = cur.deleteInfo(score, user); @@ -214,11 +214,7 @@ public DeleteCommentResult deleteCommentsByIPAddress( { List deletedTopics = topicService.deleteByIPAddress(ip, timeDelta, moderator, reason); - Map deleteInfo = new HashMap<>(); - - for (int msgid : deletedTopics) { - deleteInfo.put(msgid, "Топик " + msgid + " удален"); - } + List skippedComments = new ArrayList<>(); // Удаляем комментарии если на них нет ответа List commentIds = commentDao.getCommentsByIPAddressForUpdate(ip, timeDelta); @@ -229,12 +225,9 @@ public DeleteCommentResult deleteCommentsByIPAddress( if (commentDao.getRepliesCount(msgid) == 0) { if (doDeleteComment(msgid, reason, moderator)) { deletedCommentIds.add(msgid); - deleteInfo.put(msgid, "Комментарий " + msgid + " удален"); - } else { - deleteInfo.put(msgid, "Комментарий " + msgid + " уже был удален"); } } else { - deleteInfo.put(msgid, "Комментарий " + msgid + " пропущен"); + skippedComments.add(msgid); } } @@ -244,7 +237,7 @@ public DeleteCommentResult deleteCommentsByIPAddress( userEventService.processCommentsDeleted(deletedCommentIds); - return new DeleteCommentResult(deletedTopics, deletedCommentIds, deleteInfo); + return new DeleteCommentResult(deletedTopics, deletedCommentIds, skippedComments); } /** @@ -261,35 +254,25 @@ public DeleteCommentResult deleteAllCommentsAndBlock(User user, final User moder List deletedTopicIds = topicService.deleteAllByUser(user, moderator); - List deletedCommentIds = deleteAllCommentsByUser(user, moderator); - - return new DeleteCommentResult(deletedTopicIds, deletedCommentIds, null); - } - - /** - * Массовое удаление комментариев пользователя со всеми ответами на комментарии. - * - * @param user пользователь для экзекуции - * @param moderator экзекутор-модератор - * @return список удаленных комментариев - */ - private List deleteAllCommentsByUser(User user, final User moderator) { final List deletedCommentIds = new ArrayList<>(); // Удаляем все комментарии List commentIds = commentDao.getAllByUserForUpdate(user); + List skippedComments = new ArrayList<>(); for (int msgid : commentIds) { if (commentDao.getRepliesCount(msgid) == 0) { doDeleteComment(msgid, "Блокировка пользователя с удалением сообщений", moderator); commentDao.updateStatsAfterDelete(msgid, 1); deletedCommentIds.add(msgid); + } else { + skippedComments.add(msgid); } } userEventService.processCommentsDeleted(deletedCommentIds); - return deletedCommentIds; + return new DeleteCommentResult(deletedTopicIds, deletedCommentIds, skippedComments); } private static List getAllReplys(CommentNode node, int depth) { @@ -303,46 +286,35 @@ private static List getAllReplys(CommentNode node, int depth) { return replys; } - private static class CommentAndDepth { - private final Comment comment; - private final int depth; - - private CommentAndDepth(Comment comment, int depth) { - this.comment = comment; - this.depth = depth; - } - - public Comment getComment() { - return comment; - } + private record CommentAndDepth(Comment comment, int depth) { private DeleteInfoDao.InsertDeleteInfo deleteInfo(boolean score, User user) { - int bonus; - String reason; - - if (score) { - switch (depth) { - case 0 -> { - reason = "7.1 Ответ на некорректное сообщение (авто, уровень 0)"; - bonus = -2; - } - case 1 -> { - reason = "7.1 Ответ на некорректное сообщение (авто, уровень 1)"; - bonus = -1; - } - default -> { - reason = "7.1 Ответ на некорректное сообщение (авто, уровень >1)"; - bonus = 0; + int bonus; + String reason; + + if (score) { + switch (depth) { + case 0 -> { + reason = "7.1 Ответ на некорректное сообщение (авто, уровень 0)"; + bonus = -2; + } + case 1 -> { + reason = "7.1 Ответ на некорректное сообщение (авто, уровень 1)"; + bonus = -1; + } + default -> { + reason = "7.1 Ответ на некорректное сообщение (авто, уровень >1)"; + bonus = 0; + } } + } else { + reason = "7.1 Ответ на некорректное сообщение (авто)"; + bonus = 0; } - } else { - reason = "7.1 Ответ на некорректное сообщение (авто)"; - bonus = 0; - } - return new DeleteInfoDao.InsertDeleteInfo(comment.getId(), reason, bonus, user.getId()); + return new DeleteInfoDao.InsertDeleteInfo(comment.getId(), reason, bonus, user.getId()); + } } - } @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) public void undeleteComment(Comment comment) { diff --git a/src/main/java/ru/org/linux/comment/DeleteCommentResult.java b/src/main/java/ru/org/linux/comment/DeleteCommentResult.java index 281018d20..7f6c72495 100644 --- a/src/main/java/ru/org/linux/comment/DeleteCommentResult.java +++ b/src/main/java/ru/org/linux/comment/DeleteCommentResult.java @@ -1,5 +1,5 @@ /* - * Copyright 1998-2015 Linux.org.ru + * Copyright 1998-2024 Linux.org.ru * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -16,29 +16,16 @@ package ru.org.linux.comment; import java.util.List; -import java.util.Map; -/** - * Результат работы deleteCommentsByIPAddress - */ public class DeleteCommentResult { - /** - * список id удаленных топиков - */ private final List deletedTopicIds; - /** - * список id удаленных комментариев - */ private final List deletedCommentIds; - /** - * хэш id удаляемого топика -> строка с результатом удален или пропущен - */ - private final Map deleteInfo; + private final List skippedComments; - DeleteCommentResult(List deletedTopicIds, List deletedCommentIds, Map deleteInfo) { + DeleteCommentResult(List deletedTopicIds, List deletedCommentIds, List skippedComments) { this.deletedCommentIds = deletedCommentIds; this.deletedTopicIds = deletedTopicIds; - this.deleteInfo = deleteInfo; + this.skippedComments = skippedComments; } public List getDeletedTopicIds() { @@ -49,7 +36,7 @@ public List getDeletedCommentIds() { return deletedCommentIds; } - public Map getDeleteInfo() { - return deleteInfo; + public List getSkippedComments() { + return skippedComments; } } diff --git a/src/main/java/ru/org/linux/spring/DelIPController.java b/src/main/java/ru/org/linux/spring/DelIPController.java index 9a3fad829..0e0138678 100644 --- a/src/main/java/ru/org/linux/spring/DelIPController.java +++ b/src/main/java/ru/org/linux/spring/DelIPController.java @@ -83,11 +83,6 @@ public ModelAndView delIp(@RequestParam("reason") String reason, User moderator = AuthUtil.getCurrentUser(); - DeleteCommentResult deleteResult = commentDeleteService.deleteCommentsByIPAddress(ip, ts, moderator, reason); - - params.put("topics", deleteResult.getDeletedTopicIds().size()); // кол-во удаленных топиков - params.put("deleted", deleteResult.getDeleteInfo()); - if (banTime != null) { Optional banTo = switch (banTime) { case "hour" -> Optional.of(OffsetDateTime.now().plusHours(1)); @@ -96,6 +91,7 @@ public ModelAndView delIp(@RequestParam("reason") String reason, case "3month" -> Optional.of(OffsetDateTime.now().plusMonths(3)); case "6month" -> Optional.of(OffsetDateTime.now().plusMonths(6)); case "unlim" -> Optional.empty(); + case "remove" -> Optional.of(OffsetDateTime.now()); default -> throw new UserErrorException("Invalid count"); }; @@ -119,6 +115,12 @@ public ModelAndView delIp(@RequestParam("reason") String reason, ipBlockDao.blockIP(ip, moderator.getId(), reason, banTo.orElse(null), allowPosting, captchaRequired); } + DeleteCommentResult deleteResult = commentDeleteService.deleteCommentsByIPAddress(ip, ts, moderator, reason); + + params.put("topics", deleteResult.getDeletedTopicIds().size()); + params.put("comments", deleteResult.getDeletedCommentIds().size()); + params.put("skipped", deleteResult.getSkippedComments()); + for (int topicId : deleteResult.getDeletedTopicIds()) { searchQueueSender.updateMessage(topicId, true); } diff --git a/src/main/scala/ru/org/linux/user/UserModificationController.scala b/src/main/scala/ru/org/linux/user/UserModificationController.scala index 94b3c4bd3..a51c28930 100644 --- a/src/main/scala/ru/org/linux/user/UserModificationController.scala +++ b/src/main/scala/ru/org/linux/user/UserModificationController.scala @@ -1,5 +1,5 @@ /* - * Copyright 1998-2023 Linux.org.ru + * Copyright 1998-2024 Linux.org.ru * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -134,21 +134,23 @@ class UserModificationController(searchQueueSender: SearchQueueSender, userDao: throw new UserErrorException("Пользователь уже блокирован") } - val params = new mutable.HashMap[String, AnyRef] - params.put("message", "Удалено") - val deleteCommentResult = commentService.deleteAllCommentsAndBlock(user, moderator.user, reason) + val deleteResult = commentService.deleteAllCommentsAndBlock(user, moderator.user, reason) logger.info(s"User ${user.getNick} blocked by ${moderator.user.getNick}") - params.put("bigMessage", s"Удалено комментариев: ${deleteCommentResult.getDeletedCommentIds.size}
Удалено тем: ${deleteCommentResult.getDeletedTopicIds.size}") - - deleteCommentResult.getDeletedTopicIds.asScala.foreach { topicId => + deleteResult.getDeletedTopicIds.asScala.foreach { topicId => searchQueueSender.updateMessage(topicId, true) } - searchQueueSender.updateComment(deleteCommentResult.getDeletedCommentIds) + searchQueueSender.updateComment(deleteResult.getDeletedCommentIds) + + val params = new mutable.HashMap[String, AnyRef] + + params.put("topics", Integer.valueOf(deleteResult.getDeletedTopicIds.size)) + params.put("comments", Integer.valueOf(deleteResult.getDeletedCommentIds.size)) + params.put("skipped", deleteResult.getSkippedComments) - new ModelAndView("action-done", params.asJava) + return new ModelAndView("delip", params.asJava) } /** diff --git a/src/main/webapp/WEB-INF/jsp/delip.jsp b/src/main/webapp/WEB-INF/jsp/delip.jsp index d2586fab2..2fd9d7db7 100644 --- a/src/main/webapp/WEB-INF/jsp/delip.jsp +++ b/src/main/webapp/WEB-INF/jsp/delip.jsp @@ -2,7 +2,7 @@ <%@ page import="java.util.Date" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%-- - ~ Copyright 1998-2015 Linux.org.ru + ~ Copyright 1998-2024 Linux.org.ru ~ Licensed under the Apache License, Version 2.0 (the "License"); ~ you may not use this file except in compliance with the License. ~ You may obtain a copy of the License at @@ -17,12 +17,6 @@ --%> -<% - - response.setDateHeader("Expires", new Date(new Date().getTime() - 20 * 3600 * 1000).getTime()); - response.setDateHeader("Last-Modified", new Date(new Date().getTime() - 2 * 1000).getTime()); - -%> delip @@ -33,15 +27,15 @@ ${message}
-Удалено тем: ${topics} +Удалено тем: ${topics}; удалено комментариев: ${comments}
    - +
  • -Удаляется #${del.key}: ${del.value} +Пропущен #${del}