View Javadoc
1   package de.aikiit.bilanzanalyser.upload;
2   
3   import de.aikiit.bilanzanalyser.reader.BilanzRowParserResult;
4   import de.aikiit.bilanzanalyser.reader.BilanzRowParserStatistic;
5   import lombok.extern.log4j.Log4j2;
6   import org.springframework.beans.factory.annotation.Value;
7   import org.springframework.web.bind.annotation.GetMapping;
8   import org.springframework.web.bind.annotation.PostMapping;
9   import org.springframework.web.bind.annotation.RequestParam;
10  import org.springframework.web.bind.annotation.RestController;
11  import org.springframework.web.multipart.MultipartFile;
12  import org.springframework.web.servlet.ModelAndView;
13  import org.springframework.web.util.HtmlUtils;
14  
15  import java.io.File;
16  import java.io.IOException;
17  import java.nio.file.Files;
18  import java.nio.file.Path;
19  import java.nio.file.Paths;
20  
21  @Log4j2
22  @RestController
23  public final class UploadController {
24      private static final String UPLOAD_DIR = "uploads-bilanz-analyser";
25  
26      private final UploadAnalysisService uploadAnalysisService;
27      private final SourceService sourceService;
28  
29      @Value("${java.io.tmpdir}")
30      private String tempDir;
31  
32      public UploadController(UploadAnalysisService uploadAnalysisService, SourceService sourceService) {
33          this.uploadAnalysisService = uploadAnalysisService;
34          this.sourceService = sourceService;
35      }
36  
37      @GetMapping("/upload")
38      public ModelAndView upload() {
39          ModelAndView mav = new ModelAndView("upload");
40          mav.addObject("worksheets", sourceService.getSources());
41          mav.addObject("selectedWorksheet", "Ausgaben");
42          return mav;
43      }
44  
45      @PostMapping("/upload")
46      public ModelAndView handleFileUpload(@RequestParam("file") MultipartFile file, @RequestParam("selectedWorksheet") String selectedWorksheet) {
47  
48          // Create ModelAndView for the "upload" view
49          ModelAndView mav = new ModelAndView("upload");
50          mav.addObject("worksheets", sourceService.getSources());
51  
52          // prevent mingling with selected worksheet and properly escape user-provided value
53          if (!sourceService.getSources().contains(selectedWorksheet)) {
54              mav.addObject("message", "Invalid worksheet selected");
55              return mav;
56          }
57          String escapedSelectedWorksheet = HtmlUtils.htmlEscape(selectedWorksheet);
58          mav.addObject("selectedWorksheet", escapedSelectedWorksheet);
59  
60          if (file.isEmpty()) {
61              mav.addObject("message", "Please select a file to upload");
62              return mav;
63          }
64  
65          if (!"application/vnd.oasis.opendocument.spreadsheet".equals(file.getContentType())) {
66              mav.addObject("message", "Only ODS spreadsheet files allowed");
67              return mav;
68          }
69  
70          try {
71              // Create directory if not exists under current temp base dir
72              Path uploadDir = Paths.get(tempDir + File.separatorChar + UPLOAD_DIR);
73              Files.createDirectories(uploadDir);
74  
75              // Save file
76              Path destination = Paths.get(uploadDir.toString(), System.currentTimeMillis() + ".ods");
77              file.transferTo(destination);
78  
79              // Process rows and cleanup afterwards
80              BilanzRowParserResult result = uploadAnalysisService.processFile(selectedWorksheet, destination);
81              Files.delete(destination);
82              // flush to DB asynchronously
83              uploadAnalysisService.flushDataIntoDatabase(result);
84  
85              mav.addObject("sucmessage", "File uploaded successfully. Processed " + result.rowCount() + " rows in table " + escapedSelectedWorksheet);
86              mav.addObject("statistic", BilanzRowParserStatistic.from(result));
87          } catch (IOException e) {
88              log.error(e.getMessage());
89              mav.addObject("message", "Upload failed: " + e.getMessage());
90          }
91          return mav;
92      }
93  
94  }