feat: remove ExcelService and web-upload import path

The ODS-from-filesystem mass import is the sole import workflow.
ExcelService (web-upload Excel) is deleted, and
DocumentService.updateOrCreateFromExcel() which it exclusively called
is removed along with it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-03-15 20:43:48 +01:00
parent 79eccd5598
commit fa60c5be90
2 changed files with 0 additions and 118 deletions

View File

@@ -174,43 +174,6 @@ public class DocumentService {
return documentRepository.save(doc); return documentRepository.save(doc);
} }
/**
* Wird vom Excel-Service aufgerufen für jede Zeile.
*/
@Transactional
public void updateOrCreateFromExcel(String filename, LocalDate date, String location, String transcription,
boolean overwrite) {
Optional<Document> existingOpt = documentRepository.findByOriginalFilename(filename);
Document doc;
if (existingOpt.isPresent()) {
doc = existingOpt.get();
log.info("Excel-Import: Aktualisiere Metadaten für {}", filename);
// Logik: Nur überschreiben, wenn Feld leer ist ODER overwrite=true gesetzt ist
if (doc.getDocumentDate() == null || overwrite) {
doc.setDocumentDate(date);
}
if (doc.getLocation() == null || overwrite) {
doc.setLocation(location);
}
if (doc.getTranscription() == null || overwrite) {
doc.setTranscription(transcription);
}
} else {
log.info("Excel-Import: Erstelle Platzhalter für {}", filename);
doc = Document.builder()
.originalFilename(filename)
.title(filename) // Vorläufiger Titel
.status(DocumentStatus.PLACEHOLDER)
.documentDate(date)
.location(location)
.transcription(transcription)
.build();
}
documentRepository.save(doc);
}
// 1. Allgemeine Suche (für das Suchfeld im Frontend) // 1. Allgemeine Suche (für das Suchfeld im Frontend)
public List<Document> searchDocuments(String text, LocalDate from, LocalDate to, UUID sender, UUID reciever, List<String> tags) { public List<Document> searchDocuments(String text, LocalDate from, LocalDate to, UUID sender, UUID reciever, List<String> tags) {
log.info("Tags", tags); log.info("Tags", tags);

View File

@@ -1,81 +0,0 @@
package org.raddatz.familienarchiv.service;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.ZoneId;
@Service
@RequiredArgsConstructor
@Slf4j
public class ExcelService {
private final DocumentService documentService;
// Wir lesen die Konfiguration ein (mit Defaults, falls nichts in properties steht)
@Value("${app.import.excel.col.filename:0}")
private int colFilename;
@Value("${app.import.excel.col.date:1}")
private int colDate;
@Value("${app.import.excel.col.location:2}")
private int colLocation;
@Value("${app.import.excel.col.transcription:3}")
private int colTranscription;
public void importExcel(MultipartFile file, boolean overwrite) {
try (InputStream is = file.getInputStream();
Workbook workbook = new XSSFWorkbook(is)) {
Sheet sheet = workbook.getSheetAt(0);
log.info("Starte Excel Import mit Mapping: File={}, Date={}, Loc={}, Text={}",
colFilename, colDate, colLocation, colTranscription);
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
if (row == null) continue;
// Wir nutzen jetzt die dynamischen Index-Variablen
String filename = getCellValueAsString(row.getCell(colFilename));
if (filename == null || filename.isBlank()) {
continue;
}
LocalDate date = null;
Cell dateCell = row.getCell(colDate);
if (dateCell != null && dateCell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(dateCell)) {
date = dateCell.getDateCellValue().toInstant()
.atZone(ZoneId.systemDefault()).toLocalDate();
}
String location = getCellValueAsString(row.getCell(colLocation));
String transcription = getCellValueAsString(row.getCell(colTranscription));
documentService.updateOrCreateFromExcel(filename, date, location, transcription, overwrite);
}
} catch (Exception e) {
log.error("Fehler beim Excel Import", e);
throw new RuntimeException("Excel konnte nicht verarbeitet werden: " + e.getMessage());
}
}
private String getCellValueAsString(Cell cell) {
if (cell == null) return null;
return switch (cell.getCellType()) {
case STRING -> cell.getStringCellValue();
case NUMERIC -> String.valueOf((int) cell.getNumericCellValue());
case BOOLEAN -> String.valueOf(cell.getBooleanCellValue());
default -> "";
};
}
}