StammdatenController.java
package de.mirkosertic.powerstaff.shared.api;
import de.mirkosertic.powerstaff.shared.TagType;
import de.mirkosertic.powerstaff.shared.command.HistoryType;
import de.mirkosertic.powerstaff.shared.command.ProjectPositionStatus;
import de.mirkosertic.powerstaff.shared.command.StammdatenCommandService;
import de.mirkosertic.powerstaff.shared.command.Tag;
import de.mirkosertic.powerstaff.shared.query.HistoryTypeQueryService;
import de.mirkosertic.powerstaff.shared.query.ProjectPositionStatusQueryService;
import de.mirkosertic.powerstaff.shared.query.TagQueryService;
import de.mirkosertic.powerstaff.shared.query.TagView;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/admin")
public class StammdatenController {
private final HistoryTypeQueryService historyTypeQueryService;
private final ProjectPositionStatusQueryService projectPositionStatusQueryService;
private final TagQueryService tagQueryService;
private final StammdatenCommandService stammdatenCommandService;
public StammdatenController(
final HistoryTypeQueryService historyTypeQueryService,
final ProjectPositionStatusQueryService projectPositionStatusQueryService,
final TagQueryService tagQueryService,
final StammdatenCommandService stammdatenCommandService) {
this.historyTypeQueryService = historyTypeQueryService;
this.projectPositionStatusQueryService = projectPositionStatusQueryService;
this.tagQueryService = tagQueryService;
this.stammdatenCommandService = stammdatenCommandService;
}
// -------------------------------------------------------------------------
// Redirect /admin → /admin/historientypen
// -------------------------------------------------------------------------
@GetMapping
public String adminRoot() {
return "redirect:/admin/historientypen";
}
// -------------------------------------------------------------------------
// Historientypen
// -------------------------------------------------------------------------
@GetMapping("/historientypen")
public String historientypen(final Model model) {
model.addAttribute("types", historyTypeQueryService.findAll());
model.addAttribute("newType", new HistoryType());
model.addAttribute("activePage", "admin");
return "admin/historientypen";
}
@PostMapping("/historientypen")
public String createHistoryType(@ModelAttribute final HistoryType newType) {
stammdatenCommandService.saveHistoryType(newType);
return "redirect:/admin/historientypen";
}
@PostMapping("/historientypen/{id}")
public String updateHistoryType(@PathVariable final long id,
@RequestParam final String description) {
stammdatenCommandService.findHistoryTypeById(id).ifPresent(ht -> {
ht.setDescription(description);
stammdatenCommandService.saveHistoryType(ht);
});
return "redirect:/admin/historientypen";
}
@PostMapping("/historientypen/{id}/delete")
public String deleteHistoryType(@PathVariable final long id) {
stammdatenCommandService.deleteHistoryType(id);
return "redirect:/admin/historientypen";
}
// -------------------------------------------------------------------------
// Projektpositions-Status
// -------------------------------------------------------------------------
@GetMapping("/positionsstatus")
public String positionsstatus(final Model model) {
model.addAttribute("statusList", projectPositionStatusQueryService.findAll());
model.addAttribute("newStatus", new ProjectPositionStatus());
model.addAttribute("activePage", "admin");
return "admin/positionsstatus";
}
@PostMapping("/positionsstatus")
public String createPositionsStatus(@ModelAttribute final ProjectPositionStatus newStatus) {
stammdatenCommandService.saveProjectPositionStatus(newStatus);
return "redirect:/admin/positionsstatus";
}
@PostMapping("/positionsstatus/{id}/delete")
public String deletePositionsStatus(@PathVariable final long id) {
stammdatenCommandService.deleteProjectPositionStatus(id);
return "redirect:/admin/positionsstatus";
}
@PostMapping("/positionsstatus/{id}")
public String updatePositionsStatus(@PathVariable final long id,
@RequestParam final String description,
@RequestParam final String color,
@RequestParam final String colorText,
@RequestParam(defaultValue = "false") final boolean defaultStatus) {
stammdatenCommandService.findProjectPositionStatusById(id).ifPresent(pps -> {
pps.setDescription(description);
pps.setColor(color);
pps.setColorText(colorText);
pps.setDefaultStatus(defaultStatus);
stammdatenCommandService.saveProjectPositionStatus(pps);
});
return "redirect:/admin/positionsstatus";
}
// -------------------------------------------------------------------------
// Tags
// -------------------------------------------------------------------------
@GetMapping("/tags")
public String tags(final Model model) {
final Map<TagType, List<TagView>> tagsByType = new LinkedHashMap<>();
for (final TagType type : TagType.values()) {
tagsByType.put(type, tagQueryService.findByType(type));
}
model.addAttribute("tagsByType", tagsByType);
model.addAttribute("tagTypes", TagType.values());
model.addAttribute("newTag", new Tag());
model.addAttribute("activePage", "admin");
return "admin/tags";
}
@PostMapping("/tags")
public String createTag(@RequestParam final String tagname,
@RequestParam final String tagType) {
final Tag tag = new Tag(tagname, tagType);
stammdatenCommandService.saveTag(tag);
return "redirect:/admin/tags";
}
@PostMapping("/tags/{id}")
public String updateTag(@PathVariable final long id,
@RequestParam final String tagname) {
stammdatenCommandService.findTagById(id).ifPresent(tag -> {
tag.setTagname(tagname);
stammdatenCommandService.saveTag(tag);
});
return "redirect:/admin/tags";
}
@DeleteMapping("/tags/{id}")
@ResponseBody
public ResponseEntity<Map<String, Boolean>> deleteTag(@PathVariable final long id) {
stammdatenCommandService.deleteTag(id);
return ResponseEntity.ok(Map.of("ok", true));
}
}