diff --git a/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java b/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java index 8d749b5..68df125 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/file/FileEntityRequest.java @@ -51,9 +51,6 @@ public class FileEntityRequest { @JsonProperty("date_filter") private String dateFilter; - @JsonProperty("moderation_reason_id") - private Long moderationReasonId; - @JsonProperty("comment") private String comment; diff --git a/src/main/java/ru/soune/nocopy/dto/file/FileModerationInfo.java b/src/main/java/ru/soune/nocopy/dto/file/FileModerationInfo.java index fbe409c..8ffc794 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/FileModerationInfo.java +++ b/src/main/java/ru/soune/nocopy/dto/file/FileModerationInfo.java @@ -15,7 +15,6 @@ public class FileModerationInfo { private String ownerEmail; private FileStatus currentStatus; private LocalDateTime uploadDate; - private String moderationReason; private Boolean hasActiveAppeal; private AppealInfo activeAppeal; } diff --git a/src/main/java/ru/soune/nocopy/dto/file/ModerationActionRequest.java b/src/main/java/ru/soune/nocopy/dto/file/ModerationActionRequest.java index ad6f6b1..58a227c 100644 --- a/src/main/java/ru/soune/nocopy/dto/file/ModerationActionRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/file/ModerationActionRequest.java @@ -9,7 +9,6 @@ import ru.soune.nocopy.entity.file.FileStatus; public class ModerationActionRequest { private String fileId; private FileStatus newStatus; - private Long moderationReasonId; private String comment; private String token; } diff --git a/src/main/java/ru/soune/nocopy/dto/file/ModerationReasonRequest.java b/src/main/java/ru/soune/nocopy/dto/file/ModerationReasonRequest.java deleted file mode 100644 index 3e475c5..0000000 --- a/src/main/java/ru/soune/nocopy/dto/file/ModerationReasonRequest.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.soune.nocopy.dto.file; - -import lombok.Builder; -import lombok.Data; - -@Data -@Builder -public class ModerationReasonRequest { - private String action; - private String token; - private Long reasonId; - private String reasonText; - private Integer page; - private Integer pageSize; - private String searchQuery; -} diff --git a/src/main/java/ru/soune/nocopy/dto/file/ModerationReasonResponse.java b/src/main/java/ru/soune/nocopy/dto/file/ModerationReasonResponse.java deleted file mode 100644 index a5bbaa8..0000000 --- a/src/main/java/ru/soune/nocopy/dto/file/ModerationReasonResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.soune.nocopy.dto.file; -import lombok.Builder; -import lombok.Data; -import java.time.LocalDateTime; - -@Data -@Builder -public class ModerationReasonResponse { - private Long id; - private String reasonText; - private LocalDateTime createdAt; - private LocalDateTime updatedAt; - private Boolean isUsed; - private Long usageCount; -} diff --git a/src/main/java/ru/soune/nocopy/entity/file/FileAppeal.java b/src/main/java/ru/soune/nocopy/entity/file/FileAppeal.java index 36a5553..26b28a6 100644 --- a/src/main/java/ru/soune/nocopy/entity/file/FileAppeal.java +++ b/src/main/java/ru/soune/nocopy/entity/file/FileAppeal.java @@ -52,9 +52,6 @@ public class FileAppeal { @Enumerated(EnumType.STRING) private FileStatus moderationBeforeStatus; - @Column(name = "moderation_reason_id") - private Long moderationReasonId; - @Column(name = "resolved_at") private LocalDateTime resolvedAt; diff --git a/src/main/java/ru/soune/nocopy/entity/file/FileEntity.java b/src/main/java/ru/soune/nocopy/entity/file/FileEntity.java index a02e1cc..02104c7 100644 --- a/src/main/java/ru/soune/nocopy/entity/file/FileEntity.java +++ b/src/main/java/ru/soune/nocopy/entity/file/FileEntity.java @@ -87,9 +87,6 @@ public class FileEntity { @Column(name = "medium_path") private String mediumPath; - @Column(name = "moderation_reason_id") - private Long moderationReasonId; - @OneToOne(mappedBy = "file", cascade = CascadeType.ALL, orphanRemoval = true) @JsonIgnore private ImageHashEntity imageHash; diff --git a/src/main/java/ru/soune/nocopy/entity/file/moderation/ModerationLog.java b/src/main/java/ru/soune/nocopy/entity/file/moderation/ModerationLog.java index 04249a7..5196134 100644 --- a/src/main/java/ru/soune/nocopy/entity/file/moderation/ModerationLog.java +++ b/src/main/java/ru/soune/nocopy/entity/file/moderation/ModerationLog.java @@ -44,9 +44,6 @@ public class ModerationLog { @Column(name = "reason", columnDefinition = "TEXT") private String reason; - @Column(name = "moderation_reason_id") - private Long moderationReasonId; - @Column(name = "comment", columnDefinition = "TEXT") private String comment; diff --git a/src/main/java/ru/soune/nocopy/entity/file/moderation/ModerationReason.java b/src/main/java/ru/soune/nocopy/entity/file/moderation/ModerationReason.java deleted file mode 100644 index e62c302..0000000 --- a/src/main/java/ru/soune/nocopy/entity/file/moderation/ModerationReason.java +++ /dev/null @@ -1,34 +0,0 @@ -package ru.soune.nocopy.entity.file.moderation; - -import jakarta.persistence.*; -import lombok.*; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - -import java.time.LocalDateTime; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Entity -@Table(name = "moderation_reasons") -@EntityListeners(AuditingEntityListener.class) -public class ModerationReason { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "reason_text", nullable = false, columnDefinition = "TEXT") - private String reasonText; - - @CreatedDate - @Column(name = "created_at", updatable = false) - private LocalDateTime createdAt; - - @LastModifiedDate - @Column(name = "updated_at") - private LocalDateTime updatedAt; -} diff --git a/src/main/java/ru/soune/nocopy/exception/ModerationReasonInUseException.java b/src/main/java/ru/soune/nocopy/exception/ModerationReasonInUseException.java deleted file mode 100644 index 21525ba..0000000 --- a/src/main/java/ru/soune/nocopy/exception/ModerationReasonInUseException.java +++ /dev/null @@ -1,17 +0,0 @@ -package ru.soune.nocopy.exception; - -import lombok.Getter; - -@Getter -public class ModerationReasonInUseException extends RuntimeException { - private final Long reasonId; - private final Long usageCount; - - public ModerationReasonInUseException(Long reasonId, Long usageCount) { - super(String.format("Cannot delete moderation reason %d because it is used by %d files", - reasonId, usageCount)); - this.reasonId = reasonId; - this.usageCount = usageCount; - } - -} \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/exception/ModerationReasonNotFoundException.java b/src/main/java/ru/soune/nocopy/exception/ModerationReasonNotFoundException.java deleted file mode 100644 index a829628..0000000 --- a/src/main/java/ru/soune/nocopy/exception/ModerationReasonNotFoundException.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.soune.nocopy.exception; - -public class ModerationReasonNotFoundException extends RuntimeException { - public ModerationReasonNotFoundException(Long id) { - super("Moderation reason not found with id: " + id); - } -} diff --git a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java index cb1feb5..a254184 100644 --- a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java @@ -16,7 +16,6 @@ import ru.soune.nocopy.exception.*; import ru.soune.nocopy.repository.FileAppealRepository; import ru.soune.nocopy.repository.FileEntityRepository; import ru.soune.nocopy.repository.ModerationLogRepository; -import ru.soune.nocopy.service.file.moderation.ModerationReasonService; import ru.soune.nocopy.service.file.moderation.ModerationService; import ru.soune.nocopy.service.register.AuthService; import ru.soune.nocopy.service.file.FileEntityService; @@ -47,8 +46,6 @@ public class FileEntityHandler implements RequestHandler { private final ModerationLogRepository moderationLogRepository; - private final ModerationReasonService moderationReasonService; - @Override public BaseResponse handle(BaseRequest request) { try { @@ -86,14 +83,6 @@ public class FileEntityHandler implements RequestHandler { return handleGetUserAppeals(request, fileRequest); case "files_for_moderation": return handleGetFilesForModeration(request, fileRequest); - case "get_moderation_reason": - return handleGetModerationReason(request, fileRequest); - case "create_moderation_reason": - return handleCreateModerationReason(request, fileRequest); - case "update_moderation_reason": - return handleUpdateModerationReason(request, fileRequest); - case "delete_moderation_reason": - return handleDeleteModerationReason(request, fileRequest); default: ActionResponse response = ActionResponse.builder() .action(action) @@ -629,7 +618,6 @@ public class FileEntityHandler implements RequestHandler { ModerationActionRequest moderationRequest = ModerationActionRequest.builder() .fileId(fileRequest.getFileId()) .newStatus(fileRequest.getFileStatus()) - .moderationReasonId(fileRequest.getModerationReasonId()) .comment(fileRequest.getComment()) .build(); @@ -736,9 +724,6 @@ public class FileEntityHandler implements RequestHandler { } } - /** - * Получение списка апелляций пользователя - */ private BaseResponse handleGetUserAppeals(BaseRequest request, FileEntityRequest fileRequest) { try { Long userId = authService.useUserAuthToken(fileRequest.getToken()); @@ -774,9 +759,6 @@ public class FileEntityHandler implements RequestHandler { } } - /** - * Получение списка файлов на модерации - */ private BaseResponse handleGetFilesForModeration(BaseRequest request, FileEntityRequest fileRequest) { try { //TODO @@ -843,9 +825,6 @@ public class FileEntityHandler implements RequestHandler { } } - /** - * Получение детальной информации о файле для модерации - */ private BaseResponse handleGetFileModerationInfo(BaseRequest request, FileEntityRequest fileRequest) { try { // TODO @@ -907,9 +886,6 @@ public class FileEntityHandler implements RequestHandler { } } - /** - * Получение истории модерации файла - */ private List> getModerationHistory(String fileId) { List logs = moderationLogRepository.findByFileIdOrderByCreatedAtDesc(fileId); if (logs == null || logs.isEmpty()) { @@ -931,9 +907,6 @@ public class FileEntityHandler implements RequestHandler { .collect(Collectors.toList()); } - /** - * Получение всех апелляций файла - */ private List> getFileAppeals(String fileId) { List appeals = fileAppealRepository.findByFileId(fileId); if (appeals == null || appeals.isEmpty()) { @@ -957,214 +930,6 @@ public class FileEntityHandler implements RequestHandler { .collect(Collectors.toList()); } - /** - * Получение списка причин модерации - */ - private BaseResponse handleGetModerationReasons(BaseRequest request, FileEntityRequest fileRequest) { - try { - // TODO - // authService.useAdminAuthToken(fileRequest.getToken()); - - int page = fileRequest.getPage() != null ? fileRequest.getPage() : 1; - int pageSize = fileRequest.getPageSize() != null ? fileRequest.getPageSize() : 20; - String searchQuery = fileRequest.getSearchQuery(); - - Page reasons = moderationReasonService.getAllReasons( - page - 1, pageSize, searchQuery); - - Map response = new HashMap<>(); - response.put("reasons", reasons.getContent()); - response.put("totalCount", reasons.getTotalElements()); - response.put("totalPages", reasons.getTotalPages()); - response.put("currentPage", page); - response.put("pageSize", pageSize); - - return new BaseResponse(request.getMsgId(), - MessageCode.SUCCESS.getCode(), - MessageCode.SUCCESS.getDescription(), - response); - - } catch (SecurityException e) { - return new BaseResponse(request.getMsgId(), - MessageCode.ACCESS_DENIED.getCode(), - "Admin access required", - null); - } catch (Exception e) { - log.error("Error getting moderation reasons", e); - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - "Failed to get reasons: " + e.getMessage(), - null); - } - } - - /** - * Получение конкретной причины модерации - */ - private BaseResponse handleGetModerationReason(BaseRequest request, FileEntityRequest fileRequest) { - try { - // TODO - // authService.useAdminAuthToken(fileRequest.getToken()); - - Long reasonId = fileRequest.getModerationReasonId(); - if (reasonId == null) { - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - "reasonId is required", - null); - } - - ModerationReasonResponse reason = moderationReasonService.getReasonById(reasonId); - - return new BaseResponse(request.getMsgId(), - MessageCode.SUCCESS.getCode(), - MessageCode.SUCCESS.getDescription(), - reason); - - } catch (ModerationReasonNotFoundException e) { - return new BaseResponse(request.getMsgId(), - MessageCode.NOT_FOUND.getCode(), - e.getMessage(), - null); - } catch (Exception e) { - log.error("Error getting moderation reason", e); - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - "Failed to get reason: " + e.getMessage(), - null); - } - } - - /** - * Создание новой причины модерации - */ - private BaseResponse handleCreateModerationReason(BaseRequest request, FileEntityRequest fileRequest) { - try { - // TODO - // authService.useAdminAuthToken(fileRequest.getToken()); - - String reasonText = fileRequest.getReasonText(); - if (reasonText == null || reasonText.trim().isEmpty()) { - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - "reasonText is required", - null); - } - - ModerationReasonResponse reason = moderationReasonService.createReason(reasonText); - - return new BaseResponse(request.getMsgId(), - MessageCode.SUCCESS.getCode(), - "Moderation reason created successfully", - reason); - - } catch (IllegalArgumentException e) { - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - e.getMessage(), - null); - } catch (Exception e) { - log.error("Error creating moderation reason", e); - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - "Failed to create reason: " + e.getMessage(), - null); - } - } - - /** - * Обновление причины модерации - */ - private BaseResponse handleUpdateModerationReason(BaseRequest request, FileEntityRequest fileRequest) { - try { - // TODO - // authService.useAdminAuthToken(fileRequest.getToken()); - - Long reasonId = fileRequest.getModerationReasonId(); - String reasonText = fileRequest.getReasonText(); - - if (reasonId == null) { - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - "reasonId is required", - null); - } - - if (reasonText == null || reasonText.trim().isEmpty()) { - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - "reasonText is required", - null); - } - - ModerationReasonResponse reason = moderationReasonService.updateReason(reasonId, reasonText); - - return new BaseResponse(request.getMsgId(), - MessageCode.SUCCESS.getCode(), - "Moderation reason updated successfully", - reason); - - } catch (ModerationReasonNotFoundException e) { - return new BaseResponse(request.getMsgId(), - MessageCode.NOT_FOUND.getCode(), - e.getMessage(), - null); - } catch (IllegalArgumentException e) { - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - e.getMessage(), - null); - } catch (Exception e) { - log.error("Error updating moderation reason", e); - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - "Failed to update reason: " + e.getMessage(), - null); - } - } - - /** - * Удаление причины модерации - */ - private BaseResponse handleDeleteModerationReason(BaseRequest request, FileEntityRequest fileRequest) { - try { - // TODO - // authService.useAdminAuthToken(fileRequest.getToken()); - - Long reasonId = fileRequest.getModerationReasonId(); - if (reasonId == null) { - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - "reasonId is required", - null); - } - - moderationReasonService.deleteReason(reasonId); - - return new BaseResponse(request.getMsgId(), - MessageCode.SUCCESS.getCode(), - "Moderation reason deleted successfully", - Map.of("reasonId", reasonId)); - - } catch (ModerationReasonNotFoundException e) { - return new BaseResponse(request.getMsgId(), - MessageCode.NOT_FOUND.getCode(), - e.getMessage(), - null); - } catch (ModerationReasonInUseException e) { - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - e.getMessage(), - Map.of("usageCount", e.getUsageCount())); - } catch (Exception e) { - log.error("Error deleting moderation reason", e); - return new BaseResponse(request.getMsgId(), - MessageCode.INVALID_FIELD.getCode(), - "Failed to delete reason: " + e.getMessage(), - null); - } - } - private String formatFileSize(long size) { if (size < 1024) return size + " B"; int exp = (int) (Math.log(size) / Math.log(1024)); diff --git a/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java b/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java index 3b98025..0e5e014 100644 --- a/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java @@ -72,8 +72,4 @@ public interface FileEntityRepository extends JpaRepository Page findByStatusIn(List statuses, Pageable pageable); List findByUserIdAndStatusIn(Long userId, List statuses); - - @Query("SELECT COUNT(f) FROM FileEntity f WHERE f.moderationReasonId = :reasonId AND f.status IN :statuses") - long countByModerationReasonIdAndStatusIn(@Param("reasonId") Long reasonId, - @Param("statuses") List statuses); } diff --git a/src/main/java/ru/soune/nocopy/repository/ModerationReasonRepository.java b/src/main/java/ru/soune/nocopy/repository/ModerationReasonRepository.java deleted file mode 100644 index 81ebce4..0000000 --- a/src/main/java/ru/soune/nocopy/repository/ModerationReasonRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.soune.nocopy.repository; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import ru.soune.nocopy.entity.file.moderation.ModerationReason; - -import java.util.Optional; - -public interface ModerationReasonRepository extends JpaRepository { - Optional findByReasonText(String reasonText); - - Page findAll(Pageable pageable); - - @Query("SELECT mr FROM ModerationReason mr WHERE mr.reasonText LIKE %:search%") - Page searchByText(@Param("search") String search, Pageable pageable); - - @Query("SELECT COUNT(mr) FROM ModerationReason mr") - long countAllReasons(); -} diff --git a/src/main/java/ru/soune/nocopy/service/file/moderation/ModerationReasonService.java b/src/main/java/ru/soune/nocopy/service/file/moderation/ModerationReasonService.java deleted file mode 100644 index 0140d4b..0000000 --- a/src/main/java/ru/soune/nocopy/service/file/moderation/ModerationReasonService.java +++ /dev/null @@ -1,184 +0,0 @@ -package ru.soune.nocopy.service.file.moderation; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import ru.soune.nocopy.dto.file.ModerationReasonResponse; -import ru.soune.nocopy.entity.file.FileStatus; -import ru.soune.nocopy.entity.file.moderation.ModerationReason; -import ru.soune.nocopy.exception.ModerationReasonInUseException; -import ru.soune.nocopy.exception.ModerationReasonNotFoundException; -import ru.soune.nocopy.repository.FileEntityRepository; -import ru.soune.nocopy.repository.ModerationReasonRepository; - -import java.util.Arrays; -import java.util.List; - -@Slf4j -@Service -@RequiredArgsConstructor -public class ModerationReasonService { - - private final ModerationReasonRepository moderationReasonRepository; - private final FileEntityRepository fileEntityRepository; - - private static final List BLOCKED_STATUSES = Arrays.asList( - FileStatus.BLOCKED, - FileStatus.VIOLATION, - FileStatus.MODERATION - ); - - /** - * Создание новой причины модерации - */ - @Transactional - public ModerationReasonResponse createReason(String reasonText) { - if (reasonText == null || reasonText.trim().isEmpty()) { - throw new IllegalArgumentException("Reason text cannot be empty"); - } - - if (moderationReasonRepository.findByReasonText(reasonText.trim()).isPresent()) { - throw new IllegalArgumentException("Reason with this text already exists"); - } - - ModerationReason reason = ModerationReason.builder() - .reasonText(reasonText.trim()) - .build(); - - ModerationReason saved = moderationReasonRepository.save(reason); - - log.info("Created new moderation reason: id={}, text={}", saved.getId(), saved.getReasonText()); - - return convertToResponse(saved, false, 0L); - } - - /** - * Обновление причины модерации - */ - @Transactional - public ModerationReasonResponse updateReason(Long reasonId, String newReasonText) { - ModerationReason reason = moderationReasonRepository.findById(reasonId) - .orElseThrow(() -> new ModerationReasonNotFoundException(reasonId)); - - if (newReasonText == null || newReasonText.trim().isEmpty()) { - throw new IllegalArgumentException("Reason text cannot be empty"); - } - - moderationReasonRepository.findByReasonText(newReasonText.trim()) - .ifPresent(existingReason -> { - if (!existingReason.getId().equals(reasonId)) { - throw new IllegalArgumentException("Reason with this text already exists"); - } - }); - - String oldText = reason.getReasonText(); - reason.setReasonText(newReasonText.trim()); - - ModerationReason updated = moderationReasonRepository.save(reason); - - log.info("Updated moderation reason: id={}, oldText={}, newText={}", - reasonId, oldText, newReasonText); - - long usageCount = getReasonUsageCount(reasonId); - - return convertToResponse(updated, usageCount > 0, usageCount); - } - - /** - * Удаление причины модерации - */ - @Transactional - public void deleteReason(Long reasonId) { - ModerationReason reason = moderationReasonRepository.findById(reasonId) - .orElseThrow(() -> new ModerationReasonNotFoundException(reasonId)); - - long usageCount = getReasonUsageCount(reasonId); - - if (usageCount > 0) { - throw new ModerationReasonInUseException(reasonId, usageCount); - } - - moderationReasonRepository.deleteById(reasonId); - - log.info("Deleted moderation reason: id={}, text={}", reasonId, reason.getReasonText()); - } - - /** - * Получение причины по ID - */ - @Transactional(readOnly = true) - public ModerationReasonResponse getReasonById(Long reasonId) { - ModerationReason reason = moderationReasonRepository.findById(reasonId) - .orElseThrow(() -> new ModerationReasonNotFoundException(reasonId)); - - long usageCount = getReasonUsageCount(reasonId); - - return convertToResponse(reason, usageCount > 0, usageCount); - } - - /** - * Получение всех причин с пагинацией - */ - @Transactional(readOnly = true) - public Page getAllReasons(int page, int size, String searchQuery) { - Pageable pageable = PageRequest.of(page, size, Sort.by("createdAt").descending()); - - Page reasonsPage; - - if (searchQuery != null && !searchQuery.trim().isEmpty()) { - reasonsPage = moderationReasonRepository.searchByText(searchQuery.trim(), pageable); - } else { - reasonsPage = moderationReasonRepository.findAll(pageable); - } - - return reasonsPage.map(reason -> { - long usageCount = getReasonUsageCount(reason.getId()); - return convertToResponse(reason, usageCount > 0, usageCount); - }); - } - - /** - * Получение списка всех причин (без пагинации, для выпадающих списков) - */ - @Transactional(readOnly = true) - public List getAllReasonsList() { - List reasons = moderationReasonRepository.findAll(Sort.by("reasonText").ascending()); - - return reasons.stream() - .map(reason -> { - long usageCount = getReasonUsageCount(reason.getId()); - return convertToResponse(reason, usageCount > 0, usageCount); - }) - .collect(java.util.stream.Collectors.toList()); - } - - /** - * Подсчет количества файлов, заблокированных по данной причине - */ - private long getReasonUsageCount(Long reasonId) { - return fileEntityRepository.countByModerationReasonIdAndStatusIn(reasonId, BLOCKED_STATUSES); - } - - /** - * Проверка, используется ли причина в активных блокировках - */ - public boolean isReasonInUse(Long reasonId) { - return getReasonUsageCount(reasonId) > 0; - } - - private ModerationReasonResponse convertToResponse(ModerationReason reason, boolean isUsed, long usageCount) { - return ModerationReasonResponse.builder() - .id(reason.getId()) - .reasonText(reason.getReasonText()) - .createdAt(reason.getCreatedAt()) - .updatedAt(reason.getUpdatedAt()) - .isUsed(isUsed) - .usageCount(usageCount) - .build(); - } -} diff --git a/src/main/java/ru/soune/nocopy/service/file/moderation/ModerationService.java b/src/main/java/ru/soune/nocopy/service/file/moderation/ModerationService.java index 8a7b4d8..289f194 100644 --- a/src/main/java/ru/soune/nocopy/service/file/moderation/ModerationService.java +++ b/src/main/java/ru/soune/nocopy/service/file/moderation/ModerationService.java @@ -57,14 +57,13 @@ public class ModerationService { .oldStatus(file.getStatus()) .newStatus(request.getNewStatus()) .reason(request.getComment()) - .moderationReasonId(request.getModerationReasonId()) .comment(request.getComment()) .build(); moderationLogRepository.save(log); file.setStatus(request.getNewStatus()); - file.setModerationReasonId(request.getModerationReasonId()); + fileEntityRepository.save(file); if (request.getNewStatus() == FileStatus.BLOCKED || @@ -107,7 +106,6 @@ public class ModerationService { .additionalInfo(request.getAdditionalInfo()) .status(AppealStatus.PENDING) .moderationBeforeStatus(file.getStatus()) - .moderationReasonId(file.getModerationReasonId()) .build(); FileAppeal saved = fileAppealRepository.save(appeal); @@ -137,7 +135,6 @@ public class ModerationService { if (approve) { file.setStatus(FileStatus.ACTIVE); - file.setModerationReasonId(null); } ModerationLog log = ModerationLog.builder()