From c53a0674ffd2066667de9f79b2dc7aa445fcb05d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Antonio=20Ram=C3=ADrez=20Galv=C3=A1n?= Date: Wed, 17 Jul 2024 14:46:11 -0600 Subject: [PATCH] se agregaron las funciones para poder subir un archivo y que nos devuelva el token del archivo para posteriormente incluir ese token en una peticion y construya un ticket con archivo --- .../gob/jumapacelaya/api/RedmineClient.java | 20 ++++++----- .../gob/jumapacelaya/api/SecurityConfig.java | 17 ++++++---- .../jumapacelaya/services/LdapService.java | 3 +- .../jumapacelaya/services/UserService.java | 4 +++ .../CrearnuevoTicketView.java | 33 ++++++++++++++++--- src/main/resources/application.properties | 2 +- 6 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java index d6e7821..9497f9a 100644 --- a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java +++ b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java @@ -247,10 +247,9 @@ public class RedmineClient { public String uploadFile(byte[] fileContent, String fileName) { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(REDMINE_URL + "/uploads.json")) + .uri(URI.create(REDMINE_URL + "/uploads.json?filename=" + fileName)) .header("Content-Type", "application/octet-stream") .header("X-Redmine-API-Key", API_KEY) - .header("Content-Disposition", "attachment; filename=\"" + fileName + "\"") .POST(HttpRequest.BodyPublishers.ofByteArray(fileContent)) .build(); @@ -273,26 +272,31 @@ public class RedmineClient { public String createIssue(Map issueDetails, String apiKey) { - return createIssue(issueDetails, null, apiKey); + return createIssue(issueDetails, null, null, null, apiKey); } - public String createIssue(Map issueDetails, String fileUploadToken, String apiKey) { + public String createIssue(Map issueDetails, String fileUploadToken, String fileName, String contentType, String apiKey) { Map payload = new HashMap<>(); - payload.put("issue", issueDetails); + Map issue = new HashMap<>(issueDetails); - RedmineUser user = (RedmineUser) VaadinService.getCurrentRequest().getWrappedSession().getAttribute("myaccount"); if (fileUploadToken != null) { - List> uploads = new ArrayList<>(); - Map fileTokenMap = new HashMap<>(); + List> uploads = new ArrayList<>(); + Map fileTokenMap = new HashMap<>(); + fileTokenMap.put("filename", fileName); fileTokenMap.put("token", fileUploadToken); + fileTokenMap.put("content_type", contentType); uploads.add(fileTokenMap); payload.put("uploads", uploads); } + payload.put("issue", issueDetails); + String jsonPayload = GSON.toJson(payload); try { + RedmineUser user = (RedmineUser) VaadinService.getCurrentRequest().getWrappedSession().getAttribute("myaccount"); + HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(REDMINE_URL + "/issues.json")) .header("Content-Type", "application/json") diff --git a/src/main/java/mx/gob/jumapacelaya/api/SecurityConfig.java b/src/main/java/mx/gob/jumapacelaya/api/SecurityConfig.java index 1dae8dc..1b4a4db 100644 --- a/src/main/java/mx/gob/jumapacelaya/api/SecurityConfig.java +++ b/src/main/java/mx/gob/jumapacelaya/api/SecurityConfig.java @@ -32,15 +32,20 @@ public class SecurityConfig extends VaadinWebSecurity { .requestMatchers( AntPathRequestMatcher.antMatcher(HttpMethod.GET, "/login*") ).permitAll() + ) .formLogin(formLogin -> formLogin + .loginPage("/login") .successHandler((request, response, authentication) -> { - - - response.sendRedirect(""); - - - })); + String username = authentication.getName(); + if (userService.getAuthenticatedRedmineUser() == null) { + response.sendRedirect("/login"); + }else { + response.sendRedirect(""); + } + }) + .failureUrl("/login ") + ); super.configure(http); setLoginView(http, LoginView.class); diff --git a/src/main/java/mx/gob/jumapacelaya/services/LdapService.java b/src/main/java/mx/gob/jumapacelaya/services/LdapService.java index acccaff..c6ef1c6 100644 --- a/src/main/java/mx/gob/jumapacelaya/services/LdapService.java +++ b/src/main/java/mx/gob/jumapacelaya/services/LdapService.java @@ -37,9 +37,8 @@ public class LdapService { private String getAttribute(Attributes attributes, String attributeName) { try { - return attributes.get(attributeName).get().toString(); + return attributes.get(attributeName) != null ? attributes.get(attributeName).get().toString(): null; } catch (NamingException e) { - e.printStackTrace(); return null; } } diff --git a/src/main/java/mx/gob/jumapacelaya/services/UserService.java b/src/main/java/mx/gob/jumapacelaya/services/UserService.java index 236b649..35fe6a3 100644 --- a/src/main/java/mx/gob/jumapacelaya/services/UserService.java +++ b/src/main/java/mx/gob/jumapacelaya/services/UserService.java @@ -38,6 +38,10 @@ public class UserService { if (user == null) { CustomUserDetails userDetails = ldapService.getUserDetails(username); if (userDetails != null) { + if (userDetails.getEmail() == null || userDetails.getEmail().isEmpty()) { + logger.error("El usuario: " + username + " no tiene correo electronico."); + return null; + } RedmineUser newUser = RedmineClient.createRedmineUser( username, userDetails.getFirstName(), diff --git a/src/main/java/mx/gob/jumapacelaya/views/crearnuevoticket/CrearnuevoTicketView.java b/src/main/java/mx/gob/jumapacelaya/views/crearnuevoticket/CrearnuevoTicketView.java index 820f575..553c28d 100644 --- a/src/main/java/mx/gob/jumapacelaya/views/crearnuevoticket/CrearnuevoTicketView.java +++ b/src/main/java/mx/gob/jumapacelaya/views/crearnuevoticket/CrearnuevoTicketView.java @@ -27,6 +27,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static org.atmosphere.annotation.AnnotationUtil.logger; + @Route(value = "", layout = MainLayout.class) @PermitAll @PageTitle("Nuevo ticket") @@ -36,6 +38,7 @@ public class CrearnuevoTicketView extends VerticalLayout { private final UserService userService; private MemoryBuffer buffer; private Upload uploadFile; + private String fileUploadToken; // Inyectar el RedmineClient a través del constructor public CrearnuevoTicketView(RedmineClient api, UserService service) { @@ -67,6 +70,23 @@ public class CrearnuevoTicketView extends VerticalLayout { uploadFile = new Upload(buffer); uploadFile.setAcceptedFileTypes("image/jpeg", "image/png", "application/pdf"); + uploadFile.addSucceededListener(event -> { + if (buffer.getFileData() != null) { + try { + byte[] fileContent = buffer.getInputStream().readAllBytes(); + String fileName = buffer.getFileName(); + fileUploadToken = api.uploadFile(fileContent, fileName); + if (fileUploadToken == null) { + logger.error("Error al obtener el token del archivo"); + } else { + logger.error("Archivo subido exitosamente. Token obtenido: " + fileUploadToken); + } + } catch (IOException e) { + logger.error("Error al leer el archivo: " + e.getMessage()); + } + } + }); + // Boton para crear los tickets Button createButton = new Button("Enviar ticket", event -> { if (user.getKey() == null || user.getKey().isEmpty()) { @@ -81,18 +101,21 @@ public class CrearnuevoTicketView extends VerticalLayout { issueDetails.put("description", descripcion.getValue()); String fileUploadToken = null; + String fileName = null; + String contentType = null; + if (buffer.getFileData() != null) { try { byte[] fileContent = buffer.getInputStream().readAllBytes(); - String fileName = buffer.getFileName(); - fileUploadToken = api.uploadFile(fileContent, fileName); // Llamar al método sin pasar apiKey + fileName = buffer.getFileName(); + contentType = buffer.getFileData().getMimeType(); + fileUploadToken = api.uploadFile(fileContent, fileName); } catch (IOException e) { - Notification.show("Error al cargar el archivo: " + e.getMessage(), 5000, Notification.Position.MIDDLE) - .addThemeVariants(NotificationVariant.LUMO_WARNING); + logger.error("Error al cargar el archivo: " + e.getMessage()); } } + String response = api.createIssue(issueDetails, fileUploadToken, fileName, contentType, user.getKey()); - String response = api.createIssue(issueDetails, fileUploadToken); // Llamar al método sin pasar apiKey handleResponse(response, asunto, descripcion, tipoTickets); }); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 87b2af9..821fb71 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -19,7 +19,7 @@ spring.ldap.password=Dr3na%134$4guA ########PRODUCTIVO################################# #redmine.url=https://proyman.jumapacelaya.gob.mx/ -#redmine.api_key=ad58996f706a48474f1c74368bb35b4614428d90 +#redmine.api_key=9cc9e89cbbf08a6252045d56bd3d3ffec90adbad ########LOCAL######################################