diff --git a/src/main/java/com/example/application/api/ApiRedmine.java b/src/main/java/com/example/application/api/ApiRedmine.java deleted file mode 100644 index 76d0262..0000000 --- a/src/main/java/com/example/application/api/ApiRedmine.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.example.application.api; - - -import com.nimbusds.jose.shaded.gson.Gson; -import com.nimbusds.jose.shaded.gson.JsonObject; -import com.nimbusds.jose.shaded.gson.JsonParser; - -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ApiRedmine { - public static final Gson GSON = new Gson(); - static String REDMINE_URL; - static String API_KEY; - - public ApiRedmine(String redmineurl, String apikey) { - REDMINE_URL = redmineurl; - API_KEY = apikey; - } - - public static String createIssue(Map issueDetails) { - return createIssue(issueDetails, null); - } - - public static String createIssue(Map issueDetails, String fileUploadToken) { - Map payload = new HashMap<>(); - payload.put("issue", issueDetails); - - if (fileUploadToken != null) { - List> uploads = new ArrayList<>(); - Map fileTokenMap = new HashMap<>(); - fileTokenMap.put("token", fileUploadToken); - uploads.add(fileTokenMap); - payload.put("uploads", uploads); - } - - String jsonPayload = GSON.toJson(payload); - - try { - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(REDMINE_URL + "/issues.json")) - .header("Content-Type", "application/json") - .header("X-Redmine-API-Key", API_KEY) - .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) - .build(); - - HttpClient client = HttpClient.newHttpClient(); - HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - - return response.body(); - } catch (Exception e) { - e.printStackTrace(); - return "Error: " + e.getMessage(); - } - } - - public List getTicketTypes() { - List ticketTypes = new ArrayList<>(); - HttpClient client = HttpClient.newHttpClient(); - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(REDMINE_URL + "/trackers.json")) - .header("Content-Type", "application/json") - .header("X-Redmine-API-Key", API_KEY) - .build(); - - try { - HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - if (response.statusCode() == 200) { - String responseBody = response.body(); - ticketTypes = parseTicketTypes(responseBody); - } else { - System.err.println("Error en la respuesta: " + response.statusCode()); - } - } catch (Exception e) { - e.printStackTrace(); - } - return ticketTypes; - } - - private List parseTicketTypes(String json) { - List names = new ArrayList<>(); - JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject(); - jsonObject.getAsJsonArray("trackers").forEach(trackerElement -> { - JsonObject tracker = trackerElement.getAsJsonObject(); - names.add(tracker.get("name").getAsString()); - }); - return names; - } - - public static String uploadFile(byte[] fileContent, String fileName) { - HttpClient client = HttpClient.newHttpClient(); - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(REDMINE_URL + "/uploads.json")) - .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(); - - try { - HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - if (response.statusCode() == 201) { - JsonObject jsonResponse = JsonParser.parseString(response.body()).getAsJsonObject(); - return jsonResponse.get("upload").getAsJsonObject().get("token").getAsString(); - } else { - System.err.println("Error en la subida del archivo: " + response.statusCode()); - System.err.println("Response body: " + response.body()); - return null; - } - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/src/main/java/com/example/application/api/RedmineClient.java b/src/main/java/com/example/application/api/RedmineClient.java deleted file mode 100644 index b8c2ae1..0000000 --- a/src/main/java/com/example/application/api/RedmineClient.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.example.application.api; - -import com.example.application.models.Ticket; -import com.nimbusds.jose.shaded.gson.JsonArray; -import com.nimbusds.jose.shaded.gson.JsonElement; -import com.nimbusds.jose.shaded.gson.JsonObject; -import com.nimbusds.jose.shaded.gson.JsonParser; - -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public class RedmineClient { - - private static final int PAGE_SIZE = 25; - static String REDMINE_URL; - static String API_KEY; - - public RedmineClient(String redmineUrl, String apiKey) { - REDMINE_URL = redmineUrl; - API_KEY = apiKey; - } - - public List getTickets() { - List tickets = new ArrayList<>(); - HttpClient client = HttpClient.newHttpClient(); - int offset = 0; - - while (true) { - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(REDMINE_URL + "/issues.json?key=" + API_KEY + "&offset=" + offset)) - .header("Content-Type", "application/json") - .build(); - - try { - HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - if (response.statusCode() == 200) { - String responseBody = response.body(); - List pageTickets = parseTickets(responseBody); - tickets.addAll(pageTickets); - if (pageTickets.size() < PAGE_SIZE) { - break; - } - offset += PAGE_SIZE; - } else { - System.err.println("Error en la respuesta: " + response.statusCode()); - break; - } - } catch (Exception e) { - e.printStackTrace(); - break; - } - } - System.out.println("Total tickets obtenidos: " + tickets.size()); - return tickets; - } - - private List parseTickets(String json) { - List tickets = new ArrayList<>(); - try { - JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject(); - JsonArray issues = jsonObject.getAsJsonArray("issues"); - if (issues != null) { - for (JsonElement issueElement : issues) { - JsonObject issue = issueElement.getAsJsonObject(); - int id = issue.has("id") ? issue.get("id").getAsInt() : 0; - String subject = issue.has("subject") ? issue.get("subject").getAsString() : ""; - String description = issue.has("description") ? issue.get("description").getAsString() : ""; - String status = issue.has("status") ? issue.getAsJsonObject("status").get("name").getAsString() : "Unknown"; - String dateString = issue.has("created_on") ? issue.get("created_on").getAsString() : ""; - - LocalDate date = null; - if (!dateString.isEmpty()) { - try { - DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; - date = LocalDate.parse(dateString, formatter); - } catch (DateTimeParseException e) { - System.err.println("Error al parsear la fecha: " + dateString); - e.printStackTrace(); - } - } - - JsonObject authorJson = issue.has("author") ? issue.getAsJsonObject("author") : null; - Ticket.User author = null; - if (authorJson != null) { - String username = authorJson.has("name") ? authorJson.get("name").getAsString() : "Unknown"; - author = new Ticket.User(username); - } - - tickets.add(new Ticket(id, subject, description, status, date != null ? date.toString() : "", author)); - } - } else { - System.out.println("La respuesta JSON no contiene la clave 'issues'"); - } - } catch (Exception e) { - e.printStackTrace(); - System.out.println("Ocurrió un error al parsear los tickets: " + e.getMessage()); - } - return tickets; - } - - public List getTicketsCreatedBy(String username) { - List allTickets = getTickets(); - return allTickets.stream() - .filter(ticket -> ticket.getAuthor() != null && username.equals(ticket.getAuthor().getUsername())) - .collect(Collectors.toList()); - } - - private static class TicketResponse { - private List issues; - - public List getIssues() { - return issues; - } - - public void setIssues(List issues) { - this.issues = issues; - } - } -} diff --git a/src/main/java/com/example/application/views/login/LoginView.java b/src/main/java/com/example/application/views/login/LoginView.java deleted file mode 100644 index f0d552e..0000000 --- a/src/main/java/com/example/application/views/login/LoginView.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.example.application.views.login; - -import com.vaadin.flow.component.html.Image; -import com.vaadin.flow.component.login.LoginForm; -import com.vaadin.flow.component.login.LoginI18n; -import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import com.vaadin.flow.router.BeforeEnterEvent; -import com.vaadin.flow.router.BeforeEnterObserver; -import com.vaadin.flow.router.PageTitle; -import com.vaadin.flow.router.Route; -import com.vaadin.flow.server.auth.AnonymousAllowed; - -@Route("login") -@PageTitle("Login") -@AnonymousAllowed -public class LoginView extends VerticalLayout implements BeforeEnterObserver { - - private final LoginForm formularioLogin; - - public LoginView() { - addClassName("vista-login"); - setSizeFull(); - setAlignItems(Alignment.CENTER); - setJustifyContentMode(JustifyContentMode.CENTER); - - Image logo = new Image("images/NVO_JUMAPA.png", "Logo JUMAPA"); - logo.setWidth("300px"); - - LoginI18n i18n = LoginI18n.createDefault(); - LoginI18n.Form i18nFormulario = i18n.getForm(); - i18nFormulario.setTitle("Sistema de Soporte Técnico Gcia. de T.I"); - i18nFormulario.setUsername("Usuario"); - i18nFormulario.setPassword("Contraseña"); - i18nFormulario.setSubmit("Iniciar sesión"); - i18n.setForm(i18nFormulario); - i18n.getErrorMessage().setTitle("Credenciales incorrectas"); - i18n.getErrorMessage().setMessage("El usuario o la contraseña son incorrectos, verifica tus credenciales."); - - formularioLogin = new LoginForm(); - formularioLogin.setAction("login"); - formularioLogin.setForgotPasswordButtonVisible(false); - formularioLogin.setI18n(i18n); - - add(logo, formularioLogin); - } - - - @Override - public void beforeEnter(BeforeEnterEvent beforeEnterEvent) { - if (beforeEnterEvent.getLocation() - .getQueryParameters() - .getParameters() - .containsKey("error")) { - formularioLogin.setError(true); - } - } -} - diff --git a/src/main/java/com/example/application/Application.java b/src/main/java/mx/gob/jumapacelaya/Application.java similarity index 97% rename from src/main/java/com/example/application/Application.java rename to src/main/java/mx/gob/jumapacelaya/Application.java index 4aa9fce..7bfc666 100644 --- a/src/main/java/com/example/application/Application.java +++ b/src/main/java/mx/gob/jumapacelaya/Application.java @@ -1,4 +1,4 @@ -package com.example.application; +package mx.gob.jumapacelaya; import com.vaadin.flow.component.dependency.JsModule; import com.vaadin.flow.component.html.Main; diff --git a/src/main/java/mx/gob/jumapacelaya/api/ApiRedmine.java b/src/main/java/mx/gob/jumapacelaya/api/ApiRedmine.java new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/api/ApiRedmine.java @@ -0,0 +1 @@ + diff --git a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java new file mode 100644 index 0000000..6b9ed63 --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java @@ -0,0 +1,349 @@ +package mx.gob.jumapacelaya.api; + +import com.nimbusds.jose.shaded.gson.*; +import com.vaadin.flow.server.VaadinService; +import mx.gob.jumapacelaya.models.RedmineUser; +import mx.gob.jumapacelaya.models.Ticket; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +public class RedmineClient { + + private static final int PAGE_SIZE = 25; + static String REDMINE_URL; + static String API_KEY; + public static final Gson GSON = new Gson(); + + + + public RedmineClient(@Value("${redmine.url}") String redmineUrl, @Value("${redmine.api_key}") String apiKey) { + REDMINE_URL = redmineUrl; + API_KEY = apiKey; + + } + + //AQUI OBTENGO LOS TICKETS DESDE REDMINE + public List getTickets(RedmineUser user) { + List tickets = new ArrayList<>(); + HttpClient client = HttpClient.newHttpClient(); + int offset = 0; + + + while (true) { + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + "&offset=" + offset)) + .header("Content-Type", "application/json") + .build(); + + try { + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() == 200) { + String responseBody = response.body(); + List pageTickets = parseTickets(responseBody); + tickets.addAll(pageTickets); + if (pageTickets.size() < PAGE_SIZE) { + break; + } + offset += PAGE_SIZE; + } else { + System.err.println("Error en la respuesta: " + response.statusCode()); + break; + } + } catch (Exception e) { + e.printStackTrace(); + break; + } + } + System.out.println("Total tickets obtenidos: " + tickets.size()); + return tickets; + } + + //AQUI OBTENGO LOS TICKETS DESDE REDMINE + public List getTicketsAuthor(RedmineUser user) { + List tickets = new ArrayList<>(); + HttpClient client = HttpClient.newHttpClient(); + int offset = 0; + + + while (true) { + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + "&author_id=" + user.getId() + "&offset=" + offset)) + .header("Content-Type", "application/json") + .build(); + + try { + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() == 200) { + String responseBody = response.body(); + List pageTickets = parseTickets(responseBody); + tickets.addAll(pageTickets); + if (pageTickets.size() < PAGE_SIZE) { + break; + } + offset += PAGE_SIZE; + } else { + System.err.println("Error en la respuesta: " + response.statusCode()); + break; + } + } catch (Exception e) { + e.printStackTrace(); + break; + } + } + System.out.println("Total tickets obtenidos: " + tickets.size()); + return tickets; + } + + //Aqui se parsean todos los tickets que existen y se les da un formato con los campos a mostrarse + private List parseTickets(String json) { + List tickets = new ArrayList<>(); + try { + JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject(); + JsonArray issues = jsonObject.getAsJsonArray("issues"); + if (issues != null) { + for (JsonElement issueElement : issues) { + JsonObject issue = issueElement.getAsJsonObject(); + int id = issue.has("id") ? issue.get("id").getAsInt() : 0; + String subject = issue.has("subject") ? issue.get("subject").getAsString() : ""; + String description = issue.has("description") ? issue.get("description").getAsString() : ""; + String status = issue.has("status") ? issue.getAsJsonObject("status").get("name").getAsString() : "Unknown"; + String dateString = issue.has("created_on") ? issue.get("created_on").getAsString() : ""; + + LocalDate date = null; + if (!dateString.isEmpty()) { + try { + DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; + date = LocalDate.parse(dateString, formatter); + } catch (DateTimeParseException e) { + System.err.println("Error al parsear la fecha: " + dateString); + e.printStackTrace(); + } + } + + JsonObject authorJson = issue.has("author") ? issue.getAsJsonObject("author") : null; + Ticket.User author = null; + if (authorJson != null) { + String username = authorJson.has("name") ? authorJson.get("name").getAsString() : "Unknown"; + author = new Ticket.User(username); + } + + tickets.add(new Ticket(id, subject, description, status, date != null ? date.toString() : "", author)); + } + } else { + System.out.println("La respuesta JSON no contiene la clave 'issues'"); + } + } catch (Exception e) { + e.printStackTrace(); + System.out.println("Ocurrió un error al parsear los tickets: " + e.getMessage()); + } + return tickets; + } + + + + private static class TicketResponse { + private List issues; + + public List getIssues() { + return issues; + } + + public void setIssues(List issues) { + this.issues = issues; + } + } + + + //AQUI OBTENGO A LOS USUARIOS + //Se devuelven en formato Json + public RedmineUser getUserByUsername(String username) { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(REDMINE_URL + "/users.json?name=" + username )) + .header("Content-Type", "application/json") + .header("X-Redmine-API-Key", API_KEY) + .build(); + + try { + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() == 200) { + String responseBody = response.body(); + System.out.println("Datos del usuario " + responseBody); + return parseUser(responseBody); + } else { + System.err.println("Error en la respuesta: " + response.statusCode()); + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + //Aqui se parsean a los usuarios y se les da un formato con los campos a mostrarse + private RedmineUser parseUser(String json) { + JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject(); + JsonObject userJson = jsonObject.getAsJsonArray("users").get(0).getAsJsonObject(); + + RedmineUser user = new RedmineUser(); + user.setId(userJson.get("id").getAsInt()); + user.setLogin(userJson.get("login").getAsString()); + user.setFirstname(userJson.get("firstname").getAsString()); + user.setLastname(userJson.get("lastname").getAsString()); + user.setMail(userJson.get("mail").getAsString()); + //user.setKey(userJson.get("key").getAsString()); + return user; + } + + + + + public RedmineUser getMyAccount(String username) { + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(REDMINE_URL + "/my/account.json")) + .header("Content-Type", "application/json") + .header("X-Redmine-Switch-User", username) + .header("X-Redmine-API-Key", API_KEY) + .GET() + .build(); + try { + HttpClient client = HttpClient.newHttpClient(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + JsonObject jsonObject = JsonParser.parseString(response.body()).getAsJsonObject(); + JsonObject userJson = jsonObject.get("user").getAsJsonObject(); + + RedmineUser user = new RedmineUser(); + user.setId(userJson.get("id").getAsInt()); + user.setLogin(userJson.get("login").getAsString()); + user.setFirstname(userJson.get("firstname").getAsString()); + user.setLastname(userJson.get("lastname").getAsString()); + user.setMail(userJson.get("mail").getAsString()); + user.setKey(userJson.get("api_key").getAsString()); + return user; + + //return response.body(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + return null; + } + } + + + public String uploadFile(byte[] fileContent, String fileName) { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(REDMINE_URL + "/uploads.json")) + .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(); + + try { + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() == 201) { + JsonObject jsonResponse = JsonParser.parseString(response.body()).getAsJsonObject(); + return jsonResponse.get("upload").getAsJsonObject().get("token").getAsString(); + } else { + System.err.println("Error en la subida del archivo: " + response.statusCode()); + System.err.println("Response body: " + response.body()); + return null; + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + + + public String createIssue(Map issueDetails, String apiKey) { + return createIssue(issueDetails, null, apiKey); + } + + public String createIssue(Map issueDetails, String fileUploadToken, String apiKey) { + Map payload = new HashMap<>(); + payload.put("issue", issueDetails); + + RedmineUser user = (RedmineUser) VaadinService.getCurrentRequest().getWrappedSession().getAttribute("myaccount"); + + if (fileUploadToken != null) { + List> uploads = new ArrayList<>(); + Map fileTokenMap = new HashMap<>(); + fileTokenMap.put("token", fileUploadToken); + uploads.add(fileTokenMap); + payload.put("uploads", uploads); + } + + String jsonPayload = GSON.toJson(payload); + + try { + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(REDMINE_URL + "/issues.json")) + .header("Content-Type", "application/json") + .header("X-Redmine-API-Key", user.getKey()) + .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .build(); + + HttpClient client = HttpClient.newHttpClient(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + return response.body(); + } catch (Exception e) { + e.printStackTrace(); + return "Error: " + e.getMessage(); + } + } + + + + public List getTicketTypes() { + List ticketTypes = new ArrayList<>(); + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(REDMINE_URL + "/trackers.json")) + .header("Content-Type", "application/json") + .header("X-Redmine-API-Key", API_KEY) + .build(); + try { + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() == 200) { + String responseBody = response.body(); + ticketTypes = parseTicketTypes(responseBody); + } else { + System.err.println("Error en la respuesta: " + response.statusCode()); + } + } catch (Exception e) { + e.printStackTrace(); + } + return ticketTypes; + } + + + private List parseTicketTypes(String json) { + List names = new ArrayList<>(); + JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject(); + jsonObject.getAsJsonArray("trackers").forEach(trackerElement -> { + JsonObject tracker = trackerElement.getAsJsonObject(); + names.add(tracker.get("name").getAsString()); + }); + return names; + } + + +} diff --git a/src/main/java/com/example/application/api/SecurityConfig.java b/src/main/java/mx/gob/jumapacelaya/api/SecurityConfig.java similarity index 83% rename from src/main/java/com/example/application/api/SecurityConfig.java rename to src/main/java/mx/gob/jumapacelaya/api/SecurityConfig.java index 1a6c193..abb9180 100644 --- a/src/main/java/com/example/application/api/SecurityConfig.java +++ b/src/main/java/mx/gob/jumapacelaya/api/SecurityConfig.java @@ -1,7 +1,8 @@ -package com.example.application.api; +package mx.gob.jumapacelaya.api; -import com.example.application.views.login.LoginView; import com.vaadin.flow.spring.security.VaadinWebSecurity; +import mx.gob.jumapacelaya.services.UserService; +import mx.gob.jumapacelaya.views.login.LoginView; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; @@ -15,6 +16,9 @@ import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @Configuration public class SecurityConfig extends VaadinWebSecurity { + private UserService userService; + + @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth @@ -28,15 +32,13 @@ public class SecurityConfig extends VaadinWebSecurity { ) .formLogin(formLogin -> formLogin .successHandler((request, response, authentication) -> { - response.sendRedirect("home"); - })); - super.configure(http); - /*HttpSessionRequestCache requestCache = new HttpSessionRequestCache(); - requestCache.setRequestMatcher(new AntPathRequestMatcher("/login")); - http.requestCache((cache) -> cache - .requestCache(requestCache));*/ + response.sendRedirect(""); + + + })); + super.configure(http); setLoginView(http, LoginView.class); } @@ -50,7 +52,10 @@ public class SecurityConfig extends VaadinWebSecurity { auth.authenticationProvider(provider); } - + /*@Autowired + public void setUserService(UserService userService) { + this.userService = userService; + }*/ } diff --git a/src/main/java/com/example/application/api/SecurityService.java b/src/main/java/mx/gob/jumapacelaya/api/SecurityService.java similarity index 51% rename from src/main/java/com/example/application/api/SecurityService.java rename to src/main/java/mx/gob/jumapacelaya/api/SecurityService.java index 62f0ff9..fae395b 100644 --- a/src/main/java/com/example/application/api/SecurityService.java +++ b/src/main/java/mx/gob/jumapacelaya/api/SecurityService.java @@ -1,7 +1,8 @@ -package com.example.application.api; +package mx.gob.jumapacelaya.api; import com.vaadin.flow.spring.security.AuthenticationContext; -import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; @Component @@ -13,8 +14,12 @@ public class SecurityService { this.authenticationContext = authenticationContext; } - public UserDetails getAuthenticatedUser() { - return authenticationContext.getAuthenticatedUser(UserDetails.class).get(); + public String getAuthenticatedUser() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null) { + return authentication.getName(); + } + return null; } diff --git a/src/main/java/com/example/application/api/ServerPrpperties.java b/src/main/java/mx/gob/jumapacelaya/api/ServerPrpperties.java similarity index 88% rename from src/main/java/com/example/application/api/ServerPrpperties.java rename to src/main/java/mx/gob/jumapacelaya/api/ServerPrpperties.java index 2d4709f..6dee8a8 100644 --- a/src/main/java/com/example/application/api/ServerPrpperties.java +++ b/src/main/java/mx/gob/jumapacelaya/api/ServerPrpperties.java @@ -1,4 +1,4 @@ -package com.example.application.api; +package mx.gob.jumapacelaya.api; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; diff --git a/src/main/java/mx/gob/jumapacelaya/controllers/UserController.java b/src/main/java/mx/gob/jumapacelaya/controllers/UserController.java new file mode 100644 index 0000000..4d190fd --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/controllers/UserController.java @@ -0,0 +1,23 @@ +package mx.gob.jumapacelaya.controllers; + +import mx.gob.jumapacelaya.models.RedmineUser; +import mx.gob.jumapacelaya.services.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class UserController { + + private final UserService userService; + + @Autowired + public UserController(UserService userService) { + this.userService = userService; + } + + @GetMapping("/current-user") + public RedmineUser getCurrentUser() { + return userService.getAuthenticatedRedmineUser(); + } +} diff --git a/src/main/java/mx/gob/jumapacelaya/models/RedmineUser.java b/src/main/java/mx/gob/jumapacelaya/models/RedmineUser.java new file mode 100644 index 0000000..0a15f54 --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/models/RedmineUser.java @@ -0,0 +1,73 @@ +package mx.gob.jumapacelaya.models; + +public class RedmineUser { + private int id; + private String login; + private String firstname; + private String lastname; + private String mail; + private String key; + + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getFirstname() { + return firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public String getLastname() { + return lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public String getMail() { + return mail; + } + + public void setMail(String mail) { + this.mail = mail; + } + + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + @Override + public String toString() { + return "RedmineUser{" + + "id=" + id + + ", login='" + login + '\'' + + ", firstname='" + firstname + '\'' + + ", lastname='" + lastname + '\'' + + ", mail='" + mail + '\'' + + ", key='" + key + '\'' + + '}'; + } + +} diff --git a/src/main/java/mx/gob/jumapacelaya/models/RedmineUser_Model.java b/src/main/java/mx/gob/jumapacelaya/models/RedmineUser_Model.java new file mode 100644 index 0000000..ccbc9fa --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/models/RedmineUser_Model.java @@ -0,0 +1,2 @@ +package mx.gob.jumapacelaya.models;public class RedmineUser_Model { +} diff --git a/src/main/java/com/example/application/models/Ticket.java b/src/main/java/mx/gob/jumapacelaya/models/Ticket.java similarity index 97% rename from src/main/java/com/example/application/models/Ticket.java rename to src/main/java/mx/gob/jumapacelaya/models/Ticket.java index a813f61..2c909db 100644 --- a/src/main/java/com/example/application/models/Ticket.java +++ b/src/main/java/mx/gob/jumapacelaya/models/Ticket.java @@ -1,4 +1,4 @@ -package com.example.application.models; +package mx.gob.jumapacelaya.models; /*Esta clase obtiene los detalles de los tickets*/ diff --git a/src/main/java/mx/gob/jumapacelaya/models/User.java b/src/main/java/mx/gob/jumapacelaya/models/User.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/mx/gob/jumapacelaya/models/UserElement.java b/src/main/java/mx/gob/jumapacelaya/models/UserElement.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/mx/gob/jumapacelaya/services/UserService.java b/src/main/java/mx/gob/jumapacelaya/services/UserService.java new file mode 100644 index 0000000..8a6af6c --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/services/UserService.java @@ -0,0 +1,61 @@ +package mx.gob.jumapacelaya.services; + +import com.vaadin.flow.server.VaadinService; +import mx.gob.jumapacelaya.api.RedmineClient; +import mx.gob.jumapacelaya.api.SecurityService; +import mx.gob.jumapacelaya.models.RedmineUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +@Service +public class UserService { + + private final SecurityService securityService; + private final RedmineClient redmineClient; + private static final Logger logger = LoggerFactory.getLogger(UserService.class); + + + public UserService(SecurityService securityService, RedmineClient redmineClient) { + this.securityService = securityService; + this.redmineClient = redmineClient; + } + + /** + * Obtiene el usuario autenticado de Redmine. + * + * @return el usuario autenticado de Redmine, o null si no hay un usuario autenticado. + */ + public RedmineUser getAuthenticatedRedmineUser() { + try { + String usename = securityService.getAuthenticatedUser(); + logger.info("Usuario autenticado: " + usename); + if (usename != null) { + RedmineUser user = redmineClient.getUserByUsername(usename); + logger.info("Usuario autenticado en Redmine: " + user); + return user; + } + } catch (Exception e) { + logger.error("Error al obtener al usuario autenticado en Redmine", e); + } + return null; + } + + public RedmineUser getRedmineUser() { + + RedmineUser userclient = (RedmineUser) VaadinService.getCurrentRequest().getWrappedSession().getAttribute("myaccount"); + + if (userclient == null) { + RedmineUser user = getAuthenticatedRedmineUser(); + if (user != null) { + RedmineUser myAccount = redmineClient.getMyAccount(user.getLogin()); + if (myAccount != null && !myAccount.getKey().isEmpty()) { + userclient = myAccount; + VaadinService.getCurrentRequest().getWrappedSession().setAttribute("myaccount", myAccount); + } + } + } + + return userclient; + } +} diff --git a/src/main/java/com/example/application/views/MainLayout.java b/src/main/java/mx/gob/jumapacelaya/views/MainLayout.java similarity index 91% rename from src/main/java/com/example/application/views/MainLayout.java rename to src/main/java/mx/gob/jumapacelaya/views/MainLayout.java index 7ddcf68..5a50da5 100644 --- a/src/main/java/com/example/application/views/MainLayout.java +++ b/src/main/java/mx/gob/jumapacelaya/views/MainLayout.java @@ -1,9 +1,5 @@ -package com.example.application.views; +package mx.gob.jumapacelaya.views; -import com.example.application.api.SecurityService; -import com.example.application.views.crearnuevoticket.CrearnuevoTicketView; -import com.example.application.views.tickets.AllTicketsView; -import com.example.application.views.tickets.MisTicketsView; import com.vaadin.flow.component.applayout.AppLayout; import com.vaadin.flow.component.applayout.DrawerToggle; import com.vaadin.flow.component.button.Button; @@ -20,6 +16,10 @@ import com.vaadin.flow.component.sidenav.SideNav; import com.vaadin.flow.component.sidenav.SideNavItem; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.theme.lumo.LumoUtility; +import mx.gob.jumapacelaya.api.SecurityService; +import mx.gob.jumapacelaya.views.crearnuevoticket.CrearnuevoTicketView; +import mx.gob.jumapacelaya.views.tickets.AllTicketsView; +import mx.gob.jumapacelaya.views.tickets.MisTicketsView; import org.vaadin.lineawesome.LineAwesomeIcon; /** @@ -45,7 +45,7 @@ public class MainLayout extends AppLayout { viewTitle = new H2(); viewTitle.addClassNames(LumoUtility.FontSize.LARGE, LumoUtility.Margin.NONE); - String u = securityService.getAuthenticatedUser().getUsername(); + String u = securityService.getAuthenticatedUser(); Span usrNameLabel = new Span("Hola " + u); Button logoutButton = new Button("Cerrar sesión", event -> { diff --git a/src/main/java/com/example/application/views/crearnuevoticket/CrearnuevoTicketView.java b/src/main/java/mx/gob/jumapacelaya/views/crearnuevoticket/CrearnuevoTicketView.java similarity index 73% rename from src/main/java/com/example/application/views/crearnuevoticket/CrearnuevoTicketView.java rename to src/main/java/mx/gob/jumapacelaya/views/crearnuevoticket/CrearnuevoTicketView.java index 3d9a3fc..69bca90 100644 --- a/src/main/java/com/example/application/views/crearnuevoticket/CrearnuevoTicketView.java +++ b/src/main/java/mx/gob/jumapacelaya/views/crearnuevoticket/CrearnuevoTicketView.java @@ -1,8 +1,5 @@ -package com.example.application.views.crearnuevoticket; +package mx.gob.jumapacelaya.views.crearnuevoticket; -import com.example.application.api.ApiRedmine; -import com.example.application.api.ServerPrpperties; -import com.example.application.views.MainLayout; import com.nimbusds.jose.shaded.gson.JsonObject; import com.nimbusds.jose.shaded.gson.JsonParser; import com.vaadin.flow.component.button.Button; @@ -20,6 +17,10 @@ import com.vaadin.flow.component.upload.receivers.MemoryBuffer; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import jakarta.annotation.security.PermitAll; +import mx.gob.jumapacelaya.api.RedmineClient; +import mx.gob.jumapacelaya.models.RedmineUser; +import mx.gob.jumapacelaya.services.UserService; +import mx.gob.jumapacelaya.views.MainLayout; import java.io.IOException; import java.util.HashMap; @@ -31,15 +32,25 @@ import java.util.Map; @PageTitle("Nuevo ticket") public class CrearnuevoTicketView extends VerticalLayout { + private final RedmineClient api; // Definir el campo final para el RedmineClient + private final UserService userService; private MemoryBuffer buffer; private Upload uploadFile; - public CrearnuevoTicketView(ServerPrpperties prpperties) { - ApiRedmine api = new ApiRedmine(prpperties.REDMINE_URL, prpperties.API_KEY); + // Inyectar el RedmineClient a través del constructor + public CrearnuevoTicketView(RedmineClient api, UserService service) { + this.api = api; // Asignar el RedmineClient inyectado al campo de la clase + this.userService = service; + + // Obtener la URL de Redmine, apiKey y username desde las propiedades del servidor + RedmineUser user = userService.getRedmineUser(); + //String apiKey = (String) VaadinService.getCurrentRequest().getWrappedSession().getAttribute("apiKey"); + //String username = (String) VaadinService.getCurrentRequest().getWrappedSession().getAttribute("username"); + // Combo de los tipos de tickets ComboBox tipoTickets = new ComboBox<>("Tipo de ticket"); - List types = api.getTicketTypes(); + List types = api.getTicketTypes(); // Llamar al método sin pasar apiKey tipoTickets.setItems(types); // Campo de texto para el asunto @@ -58,6 +69,12 @@ public class CrearnuevoTicketView extends VerticalLayout { // Boton para crear los tickets Button createButton = new Button("Enviar ticket", event -> { + if (user.getKey() == null || user.getKey().isEmpty()) { + Notification.show("No se encontró la API key en la sesión.", 5000, Notification.Position.MIDDLE) + .addThemeVariants(NotificationVariant.LUMO_ERROR); + return; + } + Map issueDetails = new HashMap<>(); issueDetails.put("project_id", "soporte-tecnico-t-i"); issueDetails.put("subject", asunto.getValue()); @@ -68,14 +85,14 @@ public class CrearnuevoTicketView extends VerticalLayout { try { byte[] fileContent = buffer.getInputStream().readAllBytes(); String fileName = buffer.getFileName(); - fileUploadToken = ApiRedmine.uploadFile(fileContent, fileName); + fileUploadToken = api.uploadFile(fileContent, fileName); // Llamar al método sin pasar apiKey } catch (IOException e) { Notification.show("Error al cargar el archivo: " + e.getMessage(), 5000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_WARNING); } } - String response = ApiRedmine.createIssue(issueDetails, fileUploadToken); + String response = api.createIssue(issueDetails, fileUploadToken); // Llamar al método sin pasar apiKey handleResponse(response, asunto, descripcion, tipoTickets); }); @@ -89,6 +106,7 @@ public class CrearnuevoTicketView extends VerticalLayout { buttonLayout.setMargin(true); add(new H2("Crear nuevo ticket"), firstFields, fieldsLayout, buttonLayout); + //this.userService = userService; } private void handleResponse(String response, TextField asunto, TextArea descripcion, ComboBox tipoTickets) { diff --git a/src/main/java/mx/gob/jumapacelaya/views/login/LoginView.java b/src/main/java/mx/gob/jumapacelaya/views/login/LoginView.java new file mode 100644 index 0000000..38391f1 --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/views/login/LoginView.java @@ -0,0 +1,92 @@ +package mx.gob.jumapacelaya.views.login; + +import com.vaadin.flow.component.html.Image; +import com.vaadin.flow.component.login.LoginForm; +import com.vaadin.flow.component.login.LoginI18n; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.router.BeforeEnterEvent; +import com.vaadin.flow.router.BeforeEnterObserver; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.auth.AnonymousAllowed; +import mx.gob.jumapacelaya.api.RedmineClient; +import mx.gob.jumapacelaya.services.UserService; + +@Route("login") +@PageTitle("Login") +@AnonymousAllowed +public class LoginView extends VerticalLayout implements BeforeEnterObserver { //}, ComponentEventListener { + + private final LoginForm formularioLogin; + private static final String LOGIN_SUCCESS_URL = ""; // URL de redirección después del login exitoso + private final UserService userService; + private final RedmineClient redmineClient; + + public LoginView(UserService userService, RedmineClient redmineClient) { + addClassName("vista-login"); + setSizeFull(); + setAlignItems(Alignment.CENTER); + setJustifyContentMode(JustifyContentMode.CENTER); + + // Imagen del logo + Image logo = new Image("images/NVO_JUMAPA.png", "Logo JUMAPA"); + logo.setWidth("300px"); + + // Configuración de i18n para el formulario de login + LoginI18n i18n = LoginI18n.createDefault(); + LoginI18n.Form i18nFormulario = i18n.getForm(); + i18nFormulario.setTitle("Sistema de Soporte Técnico Gcia. de T.I"); + i18nFormulario.setUsername("Usuario"); + i18nFormulario.setPassword("Contraseña"); + i18nFormulario.setSubmit("Iniciar sesión"); + i18n.setForm(i18nFormulario); + i18n.getErrorMessage().setTitle("Credenciales incorrectas"); + i18n.getErrorMessage().setMessage("El usuario o la contraseña son incorrectos, verifica tus credenciales."); + + // Configuración del formulario de login + formularioLogin = new LoginForm(); + formularioLogin.setAction("login"); + formularioLogin.setForgotPasswordButtonVisible(false); + formularioLogin.setI18n(i18n); + + // Añadir el listener del evento de login + //formularioLogin.addLoginListener(this); + + // Añadir componentes a la vista + add(logo, formularioLogin); + this.userService = userService; + this.redmineClient = redmineClient; + } + + @Override + public void beforeEnter(BeforeEnterEvent beforeEnterEvent) { + // Mostrar el mensaje de error si hay un parámetro de error en la URL + if (beforeEnterEvent.getLocation().getQueryParameters().getParameters().containsKey("error")) { + formularioLogin.setError(true); + } + } + + // Manejar el evento de login + /*@Override + public void onComponentEvent(AbstractLogin.LoginEvent event) { + boolean authenticated = mx.gob.jumapacelaya.views.login.SecurityUtils.authenticate( + event.getUsername(), event.getPassword()); + + if (authenticated) { + RedmineUser user = userService.getAuthenticatedRedmineUser(); + if (user != null) { + RedmineUser myAccount = redmineClient.getMyAccount(user.getLogin()); + if (myAccount != null && !myAccount.getKey().isEmpty()) { + VaadinService.getCurrentRequest().getWrappedSession().setAttribute("myaccount", myAccount); + //UI.getCurrent().getPage().setLocation(LOGIN_SUCCESS_URL); + } //else { + // formularioLogin.setError(true); + //} + //} else { + // formularioLogin.setError(true); + } + } //else { + //formularioLogin.setError(true); + // } + }*/ +} diff --git a/src/main/java/mx/gob/jumapacelaya/views/login/SecurityUtils.java b/src/main/java/mx/gob/jumapacelaya/views/login/SecurityUtils.java new file mode 100644 index 0000000..56f2084 --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/views/login/SecurityUtils.java @@ -0,0 +1,39 @@ +package mx.gob.jumapacelaya.views.login; + +import com.vaadin.flow.component.UI; +import com.vaadin.flow.server.VaadinServletRequest; +import com.vaadin.flow.server.VaadinSession; +import jakarta.servlet.ServletException; + +public class SecurityUtils { + + private static final String LOGOUT_SUCCESS_URL = "login"; + + public static boolean isAuthenticated() { + VaadinServletRequest request = VaadinServletRequest.getCurrent(); + return request != null && request.getUserPrincipal() != null; + } + + public static boolean authenticate(String username, String password) { + VaadinServletRequest request = VaadinServletRequest.getCurrent(); + if (request == null) { + // This is in a background thread and we can't access the request to + // log in the user + return false; + } + try { + request.login(username, password); + // change session ID to protect against session fixation + request.getHttpServletRequest().changeSessionId(); + return true; + } catch (ServletException e) { + // login exception handle code omitted + return false; + } + } + + public static void logout() { + UI.getCurrent().getPage().setLocation(LOGOUT_SUCCESS_URL); + VaadinSession.getCurrent().getSession().invalidate(); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/application/views/tickets/AllTicketsView.java b/src/main/java/mx/gob/jumapacelaya/views/tickets/AllTicketsView.java similarity index 81% rename from src/main/java/com/example/application/views/tickets/AllTicketsView.java rename to src/main/java/mx/gob/jumapacelaya/views/tickets/AllTicketsView.java index 14b5959..00da4db 100644 --- a/src/main/java/com/example/application/views/tickets/AllTicketsView.java +++ b/src/main/java/mx/gob/jumapacelaya/views/tickets/AllTicketsView.java @@ -1,9 +1,5 @@ -package com.example.application.views.tickets; +package mx.gob.jumapacelaya.views.tickets; -import com.example.application.api.RedmineClient; -import com.example.application.api.ServerPrpperties; -import com.example.application.models.Ticket; -import com.example.application.views.MainLayout; import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.grid.GridVariant; import com.vaadin.flow.component.html.Span; @@ -12,7 +8,11 @@ import com.vaadin.flow.data.renderer.ComponentRenderer; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import com.vaadin.flow.server.auth.AnonymousAllowed; -import org.springframework.beans.factory.annotation.Autowired; +import mx.gob.jumapacelaya.api.RedmineClient; +import mx.gob.jumapacelaya.api.ServerPrpperties; +import mx.gob.jumapacelaya.models.Ticket; +import mx.gob.jumapacelaya.services.UserService; +import mx.gob.jumapacelaya.views.MainLayout; import java.text.SimpleDateFormat; import java.util.Date; @@ -24,11 +24,14 @@ import java.util.List; public class AllTicketsView extends VerticalLayout { private final RedmineClient redmineClient; + private final UserService userService; private final Grid grid; - @Autowired - public AllTicketsView(ServerPrpperties prpperties) { - this.redmineClient = new RedmineClient(prpperties.REDMINE_URL, prpperties.API_KEY); + + public AllTicketsView(ServerPrpperties prpperties , RedmineClient redmineClient, UserService userService) { + this.redmineClient = redmineClient; + this.userService = userService; + //this.redmineClient = new RedmineClient(prpperties.REDMINE_URL, prpperties.API_KEY); this.grid = new Grid<>(Ticket.class, false); @@ -72,7 +75,7 @@ public class AllTicketsView extends VerticalLayout { private void loadTickets() { try { - List tickets = redmineClient.getTickets(); + List tickets = redmineClient.getTickets(userService.getRedmineUser()); if (tickets != null && !tickets.isEmpty()) { grid.setItems(tickets); } else { diff --git a/src/main/java/com/example/application/views/tickets/MisTicketsView.java b/src/main/java/mx/gob/jumapacelaya/views/tickets/MisTicketsView.java similarity index 80% rename from src/main/java/com/example/application/views/tickets/MisTicketsView.java rename to src/main/java/mx/gob/jumapacelaya/views/tickets/MisTicketsView.java index 261d109..0132001 100644 --- a/src/main/java/com/example/application/views/tickets/MisTicketsView.java +++ b/src/main/java/mx/gob/jumapacelaya/views/tickets/MisTicketsView.java @@ -1,9 +1,5 @@ -package com.example.application.views.tickets; +package mx.gob.jumapacelaya.views.tickets; -import com.example.application.api.RedmineClient; -import com.example.application.api.ServerPrpperties; -import com.example.application.models.Ticket; -import com.example.application.views.MainLayout; import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.grid.GridVariant; import com.vaadin.flow.component.html.Span; @@ -12,6 +8,11 @@ import com.vaadin.flow.data.renderer.ComponentRenderer; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import com.vaadin.flow.server.auth.AnonymousAllowed; +import mx.gob.jumapacelaya.api.RedmineClient; +import mx.gob.jumapacelaya.api.ServerPrpperties; +import mx.gob.jumapacelaya.models.Ticket; +import mx.gob.jumapacelaya.services.UserService; +import mx.gob.jumapacelaya.views.MainLayout; import org.springframework.beans.factory.annotation.Autowired; import java.text.SimpleDateFormat; @@ -24,11 +25,14 @@ import java.util.List; public class MisTicketsView extends VerticalLayout { private final RedmineClient redmineClient; + private final UserService userService; private final Grid grid; @Autowired - public MisTicketsView(ServerPrpperties prpperties) { - this.redmineClient = new RedmineClient(prpperties.REDMINE_URL, prpperties.API_KEY); + public MisTicketsView(ServerPrpperties prpperties, RedmineClient redmineClient, UserService userService) { + this.userService = userService; + this.redmineClient = redmineClient; + //this.redmineClient = new RedmineClient(prpperties.REDMINE_URL, prpperties.API_KEY); this.grid = new Grid<>(Ticket.class, false); // Configuración de columnas del grid @@ -69,7 +73,7 @@ public class MisTicketsView extends VerticalLayout { } private void loadTickets() { - List tickets = redmineClient.getTickets(); + List tickets = redmineClient.getTicketsAuthor(userService.getRedmineUser()); grid.setItems(tickets); }