From 857a691e2b07ab44fa8d88eefe5615142c9cbbf4 Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Wed, 25 Feb 2026 15:10:34 +0100 Subject: [PATCH] scheduled cleanup --- Backend/.ignore | 1 + .../gtransfer/config/DefaultConfig.java | 2 + .../gtransfer/config/types/UploadConfig.java | 4 ++ .../gtransfer/model/FileRepository.java | 8 ++++ .../services/FileCleanupService.java | 43 +++++++++++++++++++ .../StorageServiceConfiguration.java | 2 + 6 files changed, 60 insertions(+) create mode 100644 Backend/src/main/java/com/gregor_lohaus/gtransfer/services/FileCleanupService.java diff --git a/Backend/.ignore b/Backend/.ignore index e5d8d13..54b860e 100644 --- a/Backend/.ignore +++ b/Backend/.ignore @@ -2,3 +2,4 @@ .gradle bin build +.devenv diff --git a/Backend/src/main/java/com/gregor_lohaus/gtransfer/config/DefaultConfig.java b/Backend/src/main/java/com/gregor_lohaus/gtransfer/config/DefaultConfig.java index e3c96c8..f6d5109 100644 --- a/Backend/src/main/java/com/gregor_lohaus/gtransfer/config/DefaultConfig.java +++ b/Backend/src/main/java/com/gregor_lohaus/gtransfer/config/DefaultConfig.java @@ -47,6 +47,8 @@ public class DefaultConfig { UploadConfig uc = new UploadConfig(); uc.maxDownloadLimit = 100; uc.maxExpiryDays = 30; + uc.cleanupEnabled = true; + uc.cleanupIntervalMs = 3600000L; c.uploadConfig = uc; config = c; diff --git a/Backend/src/main/java/com/gregor_lohaus/gtransfer/config/types/UploadConfig.java b/Backend/src/main/java/com/gregor_lohaus/gtransfer/config/types/UploadConfig.java index 61251b6..f4ee3e3 100644 --- a/Backend/src/main/java/com/gregor_lohaus/gtransfer/config/types/UploadConfig.java +++ b/Backend/src/main/java/com/gregor_lohaus/gtransfer/config/types/UploadConfig.java @@ -9,4 +9,8 @@ public class UploadConfig implements TomlSerializable { public Integer maxDownloadLimit; @Property(name = "maxExpiryDays") public Integer maxExpiryDays; + @Property(name = "cleanupEnabled") + public Boolean cleanupEnabled; + @Property(name = "cleanupIntervalMs") + public Long cleanupIntervalMs; } diff --git a/Backend/src/main/java/com/gregor_lohaus/gtransfer/model/FileRepository.java b/Backend/src/main/java/com/gregor_lohaus/gtransfer/model/FileRepository.java index dbcac13..1c55226 100644 --- a/Backend/src/main/java/com/gregor_lohaus/gtransfer/model/FileRepository.java +++ b/Backend/src/main/java/com/gregor_lohaus/gtransfer/model/FileRepository.java @@ -1,8 +1,16 @@ package com.gregor_lohaus.gtransfer.model; +import java.time.LocalDateTime; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface FileRepository extends JpaRepository { + + @Query("SELECT f FROM File f WHERE f.expireyDateTime IS NOT NULL AND f.expireyDateTime < :now") + List findExpired(@Param("now") LocalDateTime now); } diff --git a/Backend/src/main/java/com/gregor_lohaus/gtransfer/services/FileCleanupService.java b/Backend/src/main/java/com/gregor_lohaus/gtransfer/services/FileCleanupService.java new file mode 100644 index 0000000..3d8f6f5 --- /dev/null +++ b/Backend/src/main/java/com/gregor_lohaus/gtransfer/services/FileCleanupService.java @@ -0,0 +1,43 @@ +package com.gregor_lohaus.gtransfer.services; + +import java.time.LocalDateTime; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import com.gregor_lohaus.gtransfer.model.File; +import com.gregor_lohaus.gtransfer.model.FileRepository; +import com.gregor_lohaus.gtransfer.services.filewriter.AbstractStorageService; + +@Component +@ConditionalOnProperty(name = "gtransfer-config.upload.cleanupEnabled", havingValue = "true", matchIfMissing = true) +public class FileCleanupService { + + private static final Logger log = LoggerFactory.getLogger(FileCleanupService.class); + + @Autowired + private FileRepository fileRepository; + + @Autowired + private AbstractStorageService storageService; + + @Scheduled(fixedDelayString = "${gtransfer-config.upload.cleanupIntervalMs:3600000}") + @Transactional + public void cleanupExpiredFiles() { + List expired = fileRepository.findExpired(LocalDateTime.now()); + if (expired.isEmpty()) return; + + for (File file : expired) { + storageService.delete(file.getId()); + fileRepository.delete(file); + } + + log.info("Cleaned up {} expired file(s)", expired.size()); + } +} diff --git a/Backend/src/main/java/com/gregor_lohaus/gtransfer/services/filewriter/StorageServiceConfiguration.java b/Backend/src/main/java/com/gregor_lohaus/gtransfer/services/filewriter/StorageServiceConfiguration.java index 6268dff..049178e 100644 --- a/Backend/src/main/java/com/gregor_lohaus/gtransfer/services/filewriter/StorageServiceConfiguration.java +++ b/Backend/src/main/java/com/gregor_lohaus/gtransfer/services/filewriter/StorageServiceConfiguration.java @@ -5,10 +5,12 @@ import java.nio.file.Path; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; import com.gregor_lohaus.gtransfer.config.types.StorageServiceType; @Configuration +@EnableScheduling public class StorageServiceConfiguration { //TODO S3 implementation