diff --git a/src/main/java/org/rostislav/quickdrop/controller/AdminViewController.java b/src/main/java/org/rostislav/quickdrop/controller/AdminViewController.java index c100f16..9ce57e3 100644 --- a/src/main/java/org/rostislav/quickdrop/controller/AdminViewController.java +++ b/src/main/java/org/rostislav/quickdrop/controller/AdminViewController.java @@ -2,7 +2,6 @@ package org.rostislav.quickdrop.controller; import jakarta.servlet.http.HttpServletRequest; import org.rostislav.quickdrop.entity.ApplicationSettingsEntity; -import org.rostislav.quickdrop.entity.FileEntity; import org.rostislav.quickdrop.model.AnalyticsDataView; import org.rostislav.quickdrop.model.ApplicationSettingsViewModel; import org.rostislav.quickdrop.model.FileEntityView; @@ -19,7 +18,8 @@ import org.springframework.web.bind.annotation.RequestParam; import java.util.List; -import static org.rostislav.quickdrop.util.FileUtils.*; +import static org.rostislav.quickdrop.util.FileUtils.bytesToMegabytes; +import static org.rostislav.quickdrop.util.FileUtils.megabytesToBytes; @Controller @RequestMapping("/admin") @@ -40,10 +40,8 @@ public class AdminViewController { return "redirect:/admin/password"; } - List files = fileService.getFiles(); - - model.addAttribute("files", files.stream().map( - file -> new FileEntityView(file, formatFileSize(file.size), analyticsService.getTotalDownloadsByFile(file.id)))); + List files = fileService.getAllFilesWithDownloadCounts(); + model.addAttribute("files", files); AnalyticsDataView analytics = analyticsService.getAnalytics(); model.addAttribute("analytics", analytics); diff --git a/src/main/java/org/rostislav/quickdrop/controller/FileViewController.java b/src/main/java/org/rostislav/quickdrop/controller/FileViewController.java index ed9db87..64a81ff 100644 --- a/src/main/java/org/rostislav/quickdrop/controller/FileViewController.java +++ b/src/main/java/org/rostislav/quickdrop/controller/FileViewController.java @@ -17,7 +17,6 @@ import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBo import java.util.List; -import static org.rostislav.quickdrop.util.FileUtils.formatFileSize; import static org.rostislav.quickdrop.util.FileUtils.populateModelAttributes; @Controller @@ -76,7 +75,7 @@ public class FileViewController { List downloadHistory = downloadLogRepository.findByFileId(id); long totalDownloads = analyticsService.getTotalDownloadsByFile(id); - model.addAttribute("file", new FileEntityView(file, formatFileSize(file.size), totalDownloads)); + model.addAttribute("file", new FileEntityView(file, totalDownloads)); model.addAttribute("downloadHistory", downloadHistory); return "admin/download-history"; diff --git a/src/main/java/org/rostislav/quickdrop/model/FileEntityView.java b/src/main/java/org/rostislav/quickdrop/model/FileEntityView.java index ad689a0..3c56416 100644 --- a/src/main/java/org/rostislav/quickdrop/model/FileEntityView.java +++ b/src/main/java/org/rostislav/quickdrop/model/FileEntityView.java @@ -4,6 +4,8 @@ import org.rostislav.quickdrop.entity.FileEntity; import java.time.LocalDate; +import static org.rostislav.quickdrop.util.FileUtils.formatFileSize; + public class FileEntityView { public Long id; public String name; @@ -18,12 +20,12 @@ public class FileEntityView { public FileEntityView() { } - public FileEntityView(FileEntity fileEntity, String formatedSize, long totalDownloads) { + public FileEntityView(FileEntity fileEntity, long totalDownloads) { this.id = fileEntity.id; this.name = fileEntity.name; this.uuid = fileEntity.uuid; this.description = fileEntity.description; - this.size = formatedSize; + this.size = formatFileSize(fileEntity.size); this.keepIndefinitely = fileEntity.keepIndefinitely; this.uploadDate = fileEntity.uploadDate; this.totalDownloads = totalDownloads; diff --git a/src/main/java/org/rostislav/quickdrop/repository/FileRepository.java b/src/main/java/org/rostislav/quickdrop/repository/FileRepository.java index 8f8aa9e..5a9213f 100644 --- a/src/main/java/org/rostislav/quickdrop/repository/FileRepository.java +++ b/src/main/java/org/rostislav/quickdrop/repository/FileRepository.java @@ -1,6 +1,7 @@ package org.rostislav.quickdrop.repository; import org.rostislav.quickdrop.entity.FileEntity; +import org.rostislav.quickdrop.model.FileEntityView; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -27,4 +28,15 @@ public interface FileRepository extends JpaRepository { @Query("SELECT f FROM FileEntity f WHERE f.hidden = false AND (LOWER(f.name) LIKE LOWER(CONCAT('%', :searchString, '%')) OR LOWER(f.description) LIKE LOWER(CONCAT('%', :searchString, '%')) OR LOWER(f.uuid) LIKE LOWER(CONCAT('%', :searchString, '%')))") List searchNotHiddenFiles(@Param("searchString") String query); + + @Query(""" + SELECT new org.rostislav.quickdrop.model.FileEntityView( + f, + CAST(SUM(CASE WHEN dl.id IS NOT NULL THEN 1 ELSE 0 END) AS long) + ) + FROM FileEntity f + LEFT JOIN DownloadLog dl ON dl.file.id = f.id + GROUP BY f + """) + List findAllFilesWithDownloadCounts(); } diff --git a/src/main/java/org/rostislav/quickdrop/service/FileService.java b/src/main/java/org/rostislav/quickdrop/service/FileService.java index 5def7c1..acb2e3c 100644 --- a/src/main/java/org/rostislav/quickdrop/service/FileService.java +++ b/src/main/java/org/rostislav/quickdrop/service/FileService.java @@ -3,6 +3,7 @@ package org.rostislav.quickdrop.service; import jakarta.servlet.http.HttpServletRequest; import org.rostislav.quickdrop.entity.DownloadLog; import org.rostislav.quickdrop.entity.FileEntity; +import org.rostislav.quickdrop.model.FileEntityView; import org.rostislav.quickdrop.model.FileUploadRequest; import org.rostislav.quickdrop.repository.DownloadLogRepository; import org.rostislav.quickdrop.repository.FileRepository; @@ -306,4 +307,9 @@ public class FileService { public List getNotHiddenFiles() { return fileRepository.findAllNotHiddenFiles(); } + + public List getAllFilesWithDownloadCounts() { + return fileRepository.findAllFilesWithDownloadCounts(); + } + }