From d1e1012a187a0f78661e77975e31be0a5838063d Mon Sep 17 00:00:00 2001
From: dre0059 <eliska.dreveniakova@vsb.cz>
Date: Tue, 29 Apr 2025 09:28:39 +0200
Subject: [PATCH] Update

---
 data/demo.mv.db                               | Bin 21037056 -> 21037056 bytes
 .../controller/FileUploadController.java      |  34 +++++++++--------
 .../articleprocessor/model/Dokument.java      |   2 +-
 src/main/resources/templates/upload.html      |  36 +++++++++++++-----
 4 files changed, 45 insertions(+), 27 deletions(-)

diff --git a/data/demo.mv.db b/data/demo.mv.db
index ffd29e5632ef9a131d2e65647c27ed4f451be013..c687424bbc764ff63cdef9e93a82885258976e41 100644
GIT binary patch
delta 14830
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
JGL9(C<Znv;FTnr+

delta 4300
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

diff --git a/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java b/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java
index 8d463d7..9bc0176 100644
--- a/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java
+++ b/src/main/java/com/dre0059/articleprocessor/controller/FileUploadController.java
@@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MaxUploadSizeExceededException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
 
 @Controller
 @RequestMapping
@@ -31,7 +33,6 @@ public class FileUploadController {
     private final ReferenceService referenceService;
     private final CategoryService categoryService;
 
-
     public FileUploadController(GrobidClient grobidClient, HeaderService headerService, ReferenceService referenceService, CategoryService categoryService) {
         this.grobidClient = grobidClient;
         this.headerService = headerService;
@@ -54,7 +55,13 @@ public class FileUploadController {
             @RequestParam("tags") List<String> tags) {
 
         if (file.isEmpty()) {
-            return ResponseEntity.badRequest().body("No file uploaded!");
+            return ResponseEntity.badRequest().body(Map.of("error", "No file uploaded!"));
+        }
+
+        // Pridáme kontrolu veľkosti ešte pred spracovaním
+        final long maxFileSizeBytes = 5 * 1024 * 1024; // 5 MB
+        if (file.getSize() > maxFileSizeBytes) {
+            return ResponseEntity.badRequest().body(Map.of("error", "Uploaded PDF is too large. Maximum allowed size is 5MB."));
         }
 
         try {
@@ -64,10 +71,9 @@ public class FileUploadController {
             // save data from file to tmpFile
             try(FileOutputStream stream = new FileOutputStream(tmpFile)) {
                 stream.write(file.getBytes());
-             } catch (IOException e) {
-                return ResponseEntity.internalServerError().body("FAILURE - cannot process file : " + e.getMessage());
+            } catch (IOException e) {
+                return ResponseEntity.internalServerError().body(Map.of("error", "FAILURE - cannot process file : " + e.getMessage()));
             }
-            //System.out.println("File written to temporary location. ");
 
             String header;
             try {
@@ -79,15 +85,11 @@ public class FileUploadController {
                 }
                 return ResponseEntity.internalServerError().body(Map.of("error", "GROBID processing error"));
             }
-            //System.out.println("GROBID Header processed: " + header);
 
             String references = grobidClient.processReferences(tmpFile);
-            //System.out.println("GROBID Reference processed: " + references);
 
             Dokument savedDocument = headerService.processHeader(header, categoryId, tags, tmpFile);
-            //System.out.println("Header saved to database.");
 
-            // dokument already exists
             if(savedDocument == null) {
                 if (tmpFile.exists()) tmpFile.delete();
                 return ResponseEntity.status(HttpStatus.CONFLICT)
@@ -95,7 +97,6 @@ public class FileUploadController {
             }
 
             referenceService.extractReferences(references);
-            //System.out.println("References extracted..");
 
             if (tmpFile.exists()) tmpFile.delete();
 
@@ -105,14 +106,15 @@ public class FileUploadController {
 
             return ResponseEntity.ok(response);
 
-
         } catch (IOException e) {
-            return ResponseEntity.status(500).body("Chyba pri vytváraní dočasného súboru.");
+            return ResponseEntity.status(500).body(Map.of("error", "Chyba pri vytváraní dočasného súboru."));
         }
     }
 
-
+    // Globálny handler pre veľké súbory
+    @ExceptionHandler(MaxUploadSizeExceededException.class)
+    @ResponseBody
+    public ResponseEntity<?> handleMaxSizeException(MaxUploadSizeExceededException exc) {
+        return ResponseEntity.badRequest().body(Map.of("error", "Uploaded PDF is too large. Maximum allowed size is 5MB."));
+    }
 }
-
-
-
diff --git a/src/main/java/com/dre0059/articleprocessor/model/Dokument.java b/src/main/java/com/dre0059/articleprocessor/model/Dokument.java
index 8ae0382..d7ab3ff 100644
--- a/src/main/java/com/dre0059/articleprocessor/model/Dokument.java
+++ b/src/main/java/com/dre0059/articleprocessor/model/Dokument.java
@@ -110,7 +110,7 @@ public class Dokument {
         StringBuilder builder = new StringBuilder();
 
         for(Tag tag : tags){
-            builder.append(tag.getTitle() + " ");
+            builder.append(tag.getTitle() + ", ");
         }
 
         return builder.toString();
diff --git a/src/main/resources/templates/upload.html b/src/main/resources/templates/upload.html
index c263d6d..7b640cb 100644
--- a/src/main/resources/templates/upload.html
+++ b/src/main/resources/templates/upload.html
@@ -121,19 +121,35 @@
     // Náhľad PDF súboru
     document.getElementById('fileInput').addEventListener('change', function(event) {
         const file = event.target.files[0];
-        if (file && file.type === 'application/pdf') {
-            const fileURL = URL.createObjectURL(file);
-            const preview = document.getElementById('pdf-preview');
-            preview.src = fileURL;
-            preview.style.display = 'block';
-
-            document.getElementById('upload-button-wrapper').style.display = 'block';
-            preview.scrollIntoView({ behavior: 'smooth', block: 'start' });
-        } else {
-            alert('Please, choose a valid PDF file.');
+        if (file) {
+            // kontrola veľkosti
+            const maxSizeMB = 5;
+            const maxSizeBytes = maxSizeMB * 1024 * 1024;
+
+            if (file.size > maxSizeBytes) {
+                showAlert(`Uploaded PDF is too large. Maximum allowed size is ${maxSizeMB}MB.`, 'danger');
+                this.value = ''; // vyprázdni input
+                document.getElementById('pdf-preview').style.display = 'none';
+                document.getElementById('upload-button-wrapper').style.display = 'none';
+                return;
+            }
+
+            if (file.type === 'application/pdf') {
+                const fileURL = URL.createObjectURL(file);
+                const preview = document.getElementById('pdf-preview');
+                preview.src = fileURL;
+                preview.style.display = 'block';
+
+                document.getElementById('upload-button-wrapper').style.display = 'block';
+                preview.scrollIntoView({ behavior: 'smooth', block: 'start' });
+            } else {
+                alert('Please, choose a valid PDF file.');
+            }
         }
     });
 
+
+
     // Inicializácia SELECT2 pre tagy
     $(document).ready(function() {
         $('#tags').select2({
-- 
GitLab