diff --git a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java index bea5c6a..7fb5492 100644 --- a/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/FileEntityHandler.java @@ -8,6 +8,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import ru.soune.nocopy.dto.*; import ru.soune.nocopy.dto.file.*; import ru.soune.nocopy.entity.file.*; @@ -690,7 +691,8 @@ public class FileEntityHandler implements RequestHandler { request.getVersion())); } - private BaseResponse handleDeleteFiles(BaseRequest request, FileEntityRequest fileRequest) { + @Transactional + public BaseResponse handleDeleteFiles(BaseRequest request, FileEntityRequest fileRequest) { List fileIds = fileRequest.getFileIds(); List deletedIds = new ArrayList<>(); List failedIds = new ArrayList<>(); @@ -706,7 +708,7 @@ public class FileEntityHandler implements RequestHandler { deleteFileIfExists(fileEntity.getMediumPath()); deletedIds.add(fileId); - log.info("Files deleted for entity: {}", fileId); + log.info("Physical files deleted for entity: {}", fileId); } catch (Exception e) { failedIds.add(fileId); @@ -715,30 +717,21 @@ public class FileEntityHandler implements RequestHandler { } if (!deletedIds.isEmpty()) { - for (String fileId: deletedIds) { - FileMonitoringEntity monitoring = fileMonitoringRepository.findByFileId(fileId).orElse(null); - if (monitoring != null) { - fileMonitoringRepository.delete(monitoring); - } - - List logRepositoryByFileId = moderationLogRepository.findByFileId(fileId); - - moderationLogRepository.deleteAll(logRepositoryByFileId); - - imageHashRepository.deleteByFileId(fileId); - - List appeals = fileAppealRepository.findByFileId(fileId); - - fileAppealRepository.deleteAll(appeals); - - fileEntityRepository.deleteById(fileId); - } + fileMonitoringRepository.deleteAllByFileIdIn(deletedIds); + moderationLogRepository.deleteAllByFileIdIn(deletedIds); + imageHashRepository.deleteAllByFileIdIn(deletedIds); + fileAppealRepository.deleteAllByFileIdIn(deletedIds); + fileEntityRepository.deleteAllByIdIn(deletedIds); log.info("Deleted {} entities from database", deletedIds.size()); } - return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), - MessageCode.SUCCESS.getDescription(), failedIds); + return new BaseResponse( + request.getMsgId(), + MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), + failedIds + ); } private void deleteFileIfExists(String filePath) { diff --git a/src/main/java/ru/soune/nocopy/repository/FileAppealRepository.java b/src/main/java/ru/soune/nocopy/repository/FileAppealRepository.java index c645496..03955a4 100644 --- a/src/main/java/ru/soune/nocopy/repository/FileAppealRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/FileAppealRepository.java @@ -3,6 +3,7 @@ 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.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import ru.soune.nocopy.entity.file.FileAppeal; @@ -24,5 +25,9 @@ public interface FileAppealRepository extends JpaRepository Page findPendingAppeals(@Param("status") AppealStatus status, Pageable pageable); boolean existsByFileIdAndStatusIn(String fileId, List statuses); + + @Modifying + @Query("DELETE FROM FileAppeal a WHERE a.fileId IN :fileIds") + void deleteAllByFileIdIn(@Param("fileIds") List fileIds); } diff --git a/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java b/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java index 9f6f2c9..f285ab8 100644 --- a/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/FileEntityRepository.java @@ -3,6 +3,7 @@ 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.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -131,4 +132,8 @@ public interface FileEntityRepository extends JpaRepository ORDER BY file_count """, nativeQuery = true) List getProtectedFilesPerUserStats(); + + @Modifying + @Query("DELETE FROM FileEntity f WHERE f.id IN :ids") + void deleteAllByIdIn(@Param("ids") List ids); } diff --git a/src/main/java/ru/soune/nocopy/repository/FileMonitoringRepository.java b/src/main/java/ru/soune/nocopy/repository/FileMonitoringRepository.java index 393309d..e645b4d 100644 --- a/src/main/java/ru/soune/nocopy/repository/FileMonitoringRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/FileMonitoringRepository.java @@ -1,6 +1,7 @@ package ru.soune.nocopy.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -29,4 +30,8 @@ public interface FileMonitoringRepository extends JpaRepository userIds, @Param("monitoringType") MonitoringType monitoringType); + + @Modifying + @Query("DELETE FROM FileMonitoringEntity f WHERE f.file.id IN :fileIds") + void deleteAllByFileIdIn(@Param("fileIds") List fileIds); } diff --git a/src/main/java/ru/soune/nocopy/repository/ImageHashRepository.java b/src/main/java/ru/soune/nocopy/repository/ImageHashRepository.java index 48b4378..2df443d 100644 --- a/src/main/java/ru/soune/nocopy/repository/ImageHashRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/ImageHashRepository.java @@ -1,6 +1,9 @@ package ru.soune.nocopy.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import ru.soune.nocopy.entity.file.ImageHashEntity; @@ -11,4 +14,7 @@ public interface ImageHashRepository extends JpaRepository findByFileId(String fileId); ImageHashEntity findByHash64HiAndHash64Lo(Long hash64Hi, Long hash64Lo); + @Modifying + @Query("DELETE FROM ImageHashEntity i WHERE i.file.id IN :fileIds") + void deleteAllByFileIdIn(@Param("fileIds") List fileIds); } diff --git a/src/main/java/ru/soune/nocopy/repository/ModerationLogRepository.java b/src/main/java/ru/soune/nocopy/repository/ModerationLogRepository.java index e46a1d5..6772f9f 100644 --- a/src/main/java/ru/soune/nocopy/repository/ModerationLogRepository.java +++ b/src/main/java/ru/soune/nocopy/repository/ModerationLogRepository.java @@ -1,6 +1,9 @@ package ru.soune.nocopy.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import ru.soune.nocopy.entity.file.moderation.ModerationLog; import java.util.List; @@ -12,4 +15,8 @@ public interface ModerationLogRepository extends JpaRepository findByModeratorId(Long moderatorId); List findByFileId(String fileId); + + @Modifying + @Query("DELETE FROM ModerationLog m WHERE m.fileId IN :fileIds") + void deleteAllByFileIdIn(@Param("fileIds") List fileIds); } \ No newline at end of file