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
49 ModelAndView mav = new ModelAndView("upload");
50 mav.addObject("worksheets", sourceService.getSources());
51
52
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
72 Path uploadDir = Paths.get(tempDir + File.separatorChar + UPLOAD_DIR);
73 Files.createDirectories(uploadDir);
74
75
76 Path destination = Paths.get(uploadDir.toString(), System.currentTimeMillis() + ".ods");
77 file.transferTo(destination);
78
79
80 BilanzRowParserResult result = uploadAnalysisService.processFile(selectedWorksheet, destination);
81 Files.delete(destination);
82
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 }