package ru.charm.back.controller; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.MultipartConfig; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import ru.charm.back.dto.ProfileFilter; import ru.charm.back.dto.ProfileGetDto; import ru.charm.back.dto.ProfileUpdateDto; import ru.charm.back.mapper.RequestToProfileFilterMapper; import ru.charm.back.mapper.RequestToProfileUpdateDtoMapper; import ru.charm.back.service.ProfileService; import java.io.IOException; import java.io.OutputStream; import java.util.Optional; import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND; import static ru.charm.back.utils.UrlUtils.PROFILE_URL; @WebServlet(PROFILE_URL + "/*") @MultipartConfig @Slf4j public class ProfileController extends HttpServlet { private final ProfileService service = ProfileService.getInstance(); private final RequestToProfileUpdateDtoMapper requestToProfileUpdateDtoMapper = RequestToProfileUpdateDtoMapper.getInstance(); private final RequestToProfileFilterMapper requestToProfileFilterMapper = RequestToProfileFilterMapper.getInstance(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String sId = req.getParameter("id"); if (sId != null) { Optional optProfileDto = service.findById(Long.parseLong(sId)); if (optProfileDto.isPresent()) { ProfileGetDto profileGetDto = optProfileDto.get(); if (req.getRequestURI().equals("/profile/pdf")) { resp.setHeader("Content-Disposition", "attachment; filename=\"profile.pdf\""); resp.setContentType("application/pdf"); resp.setCharacterEncoding("UTF-8"); try(OutputStream os = resp.getOutputStream()) { Document document = new Document(); PdfWriter.getInstance(document, os); document.open(); PdfPTable table = new PdfPTable(2); table.addCell("Email"); table.addCell(profileGetDto.getEmail()); table.addCell("Name"); table.addCell(profileGetDto.getName()); table.addCell("Surname"); table.addCell(profileGetDto.getSurname()); document.add(table); document.close(); } catch (DocumentException e) { throw new IOException(e); } } else { req.setAttribute("profile", profileGetDto); req.getRequestDispatcher("/WEB-INF/jsp/profile.jsp").forward(req, resp); } } else { resp.sendError(SC_NOT_FOUND); } } else { ProfileFilter filter = requestToProfileFilterMapper.map(req); req.setAttribute("profiles", service.findAll(filter)); req.getRequestDispatcher("/WEB-INF/jsp/profiles.jsp").forward(req, resp); } } @Override protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException { ProfileUpdateDto dto = requestToProfileUpdateDtoMapper.map(req); service.update(dto); String referer = req.getHeader("referer"); resp.sendRedirect(referer); } }