package ru.ulstu.paper.controller; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.Errors; 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 ru.ulstu.deadline.model.Deadline; import ru.ulstu.paper.model.Paper; import ru.ulstu.paper.model.PaperDto; import ru.ulstu.paper.model.PaperFilterDto; import ru.ulstu.paper.service.LatexService; import ru.ulstu.paper.service.PaperService; import ru.ulstu.user.model.User; import springfox.documentation.annotations.ApiIgnore; import javax.validation.Valid; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.stream.Collectors; import static java.nio.charset.StandardCharsets.UTF_8; import static org.springframework.util.StringUtils.isEmpty; @Controller() @RequestMapping(value = "/papers") @ApiIgnore public class PaperController { private final PaperService paperService; private final LatexService latexService; public PaperController(PaperService paperService, LatexService latexService) { this.paperService = paperService; this.latexService = latexService; } @GetMapping("/papers") public void getPapers(ModelMap modelMap) { modelMap.put("filteredPapers", new PaperFilterDto(paperService.findAllDto(), null, null)); } @PostMapping("/papers") public void filterPapers(@Valid PaperFilterDto paperFilterDto, ModelMap modelMap) { modelMap.put("filteredPapers", new PaperFilterDto(paperService.filter(paperFilterDto), paperFilterDto.getFilterAuthorId(), paperFilterDto.getYear())); } @GetMapping("/dashboard") public void getDashboard(ModelMap modelMap) { modelMap.put("papers", paperService.findAllActiveDto()); } @GetMapping("/paper") public void getPapers(ModelMap modelMap, @RequestParam(value = "id") Integer id) { if (id != null && id > 0) { modelMap.put("paperDto", paperService.findOneDto(id)); } else { modelMap.put("paperDto", new PaperDto()); } } @PostMapping(value = "/paper", params = "save") public String save(@Valid PaperDto paperDto, Errors errors) throws IOException { filterEmptyDeadlines(paperDto); if (paperDto.getDeadlines().isEmpty()) { errors.rejectValue("deadlines", "errorCode", "Не может быть пустым"); } if (errors.hasErrors()) { return "/papers/paper"; } paperService.save(paperDto); return "redirect:/papers/papers"; } @PostMapping(value = "/paper", params = "addDeadline") public String addDeadline(@Valid PaperDto paperDto, Errors errors) { filterEmptyDeadlines(paperDto); if (errors.hasErrors()) { return "/papers/paper"; } paperDto.getDeadlines().add(new Deadline()); return "/papers/paper"; } @GetMapping("/delete/{paper-id}") public String delete(@Valid PaperFilterDto paperFilterDto, @PathVariable("paper-id") Integer paperId, Errors errors) throws IOException { try { paperService.delete(paperId); } catch (DataIntegrityViolationException e) { errors.reject("relationExist", "Статья прикреплена к конференции"); return "/papers/papers"; } return "redirect:/papers/papers"; } @ModelAttribute("allStatuses") public List getPaperStatuses() { return paperService.getPaperStatuses(); } @ModelAttribute("allTypes") public List getPaperTypes() { return paperService.getPaperTypes(); } @ModelAttribute("allAuthors") public List getAllAuthors() { return paperService.getPaperAuthors(); } @ModelAttribute("allYears") public List getAllYears() { List years = new ArrayList<>(); for (int i = Calendar.getInstance().get(Calendar.YEAR); i > 2010; i--) { years.add(i); } return years; } @PostMapping("/generatePdf") public ResponseEntity getPdfFile(PaperDto paper) throws IOException, InterruptedException { HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment; filename='" + URLEncoder.encode(paper.getTitle() + ".pdf", UTF_8.toString()) + "'"); return new ResponseEntity<>(latexService.generatePdfFromLatexFile(paper), headers, HttpStatus.OK); } private void filterEmptyDeadlines(PaperDto paperDto) { paperDto.setDeadlines(paperDto.getDeadlines().stream() .filter(dto -> dto.getDate() != null || !isEmpty(dto.getDescription())) .collect(Collectors.toList())); } }