@ -0,0 +1,60 @@ | |||||
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.util.ArrayList; | |||||
import java.util.List; | |||||
/*Esta clase se encarga de obtener los tickets desde redmine | |||||
para poder mostrarlo en la vista de visualizacion de tickets*/ | |||||
public class RedmineClient { | |||||
private static final String REDMINE_URL = "http://localhost:3000"; | |||||
private static final String API_KEY = "cf3be6168e66c99892c6212ea0bc64e8ab1c6848"; | |||||
public List<Ticket> getTickets() { | |||||
List<Ticket> tickets = new ArrayList<>(); | |||||
HttpClient client = HttpClient.newHttpClient(); | |||||
HttpRequest request = HttpRequest.newBuilder() | |||||
.uri(URI.create(REDMINE_URL + "/issues.json")) | |||||
.header("Content-Type", "application/json") | |||||
.header("X-Redmine-API-Key", API_KEY) | |||||
.build(); | |||||
try { | |||||
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); | |||||
if (response.statusCode() == 200) { | |||||
String responseBody = response.body(); | |||||
tickets = parseTickets(responseBody); | |||||
} else { | |||||
System.err.println("Error en la respuesta: " + response.statusCode()); | |||||
} | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
} | |||||
return tickets; | |||||
} | |||||
private List<Ticket> parseTickets(String json) { | |||||
List<Ticket> tickets = new ArrayList<>(); | |||||
JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject(); | |||||
JsonArray issues = jsonObject.getAsJsonArray("issues"); | |||||
for (JsonElement issueElement : issues) { | |||||
JsonObject issue = issueElement.getAsJsonObject(); | |||||
int id = issue.get("id").getAsInt(); | |||||
String subject = issue.get("subject").getAsString(); | |||||
String description = issue.has("description") ? issue.get("description").getAsString() : ""; | |||||
tickets.add(new Ticket(id, subject, description)); | |||||
} | |||||
return tickets; | |||||
} | |||||
} |
@ -0,0 +1,28 @@ | |||||
package com.example.application.models; | |||||
/*Esta clase obtiene los detalles de los tickets*/ | |||||
public class Ticket { | |||||
private int id; | |||||
private String subject; | |||||
private String description; | |||||
public Ticket(int id, String subject, String description) { | |||||
this.id = id; | |||||
this.subject = subject; | |||||
this.description = description; | |||||
} | |||||
public int getId() { | |||||
return id; | |||||
} | |||||
public String getSubject() { | |||||
return subject; | |||||
} | |||||
public String getDescription() { | |||||
return description; | |||||
} | |||||
} |
@ -1,2 +0,0 @@ | |||||
package com.example.application.views.login;public class CustomLoginView { | |||||
} |
@ -1,2 +0,0 @@ | |||||
package com.example.application.views.login;public class LoginFailAuth { | |||||
} |
@ -1,26 +1,47 @@ | |||||
package com.example.application.views.tickets; | package com.example.application.views.tickets; | ||||
import com.example.application.api.RedmineClient; | |||||
import com.example.application.models.Ticket; | |||||
import com.example.application.views.MainLayout; | import com.example.application.views.MainLayout; | ||||
import com.vaadin.flow.component.html.Div; | |||||
import com.vaadin.flow.component.html.H2; | |||||
import com.vaadin.flow.component.grid.ColumnTextAlign; | |||||
import com.vaadin.flow.component.grid.Grid; | |||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout; | import com.vaadin.flow.component.orderedlayout.VerticalLayout; | ||||
import com.vaadin.flow.router.Route; | import com.vaadin.flow.router.Route; | ||||
import com.vaadin.flow.server.auth.AnonymousAllowed; | import com.vaadin.flow.server.auth.AnonymousAllowed; | ||||
import java.util.List; | |||||
@Route(value="mytickets", layout = MainLayout.class) | @Route(value="mytickets", layout = MainLayout.class) | ||||
@AnonymousAllowed | @AnonymousAllowed | ||||
public class MisTicketsView extends VerticalLayout { | public class MisTicketsView extends VerticalLayout { | ||||
private final RedmineClient redmineClient; | |||||
private final Grid<Ticket> grid; | |||||
public MisTicketsView() { | public MisTicketsView() { | ||||
this.redmineClient = new RedmineClient(); | |||||
this.grid = new Grid<>(Ticket.class, false); | |||||
grid.addColumn(Ticket::getId).setHeader("No.") | |||||
.setWidth("4em").setFlexGrow(0).setTextAlign(ColumnTextAlign.CENTER); | |||||
grid.addColumn(Ticket::getSubject).setHeader("Asunto") | |||||
.setAutoWidth(true).setFlexGrow(0); | |||||
grid.addColumn(Ticket::getDescription).setHeader("Description") | |||||
.setFlexGrow(1); | |||||
grid.setSizeFull(); | |||||
setSizeFull(); | setSizeFull(); | ||||
Div banner = new Div(); | |||||
banner.setText("Aqui es donde el usuario vera sus tickets creados"); | |||||
banner.getStyle() | |||||
.set("display", "flex") | |||||
.set("justify-content", "center") | |||||
.set("align-items", "center") | |||||
.set("height", "100%"); | |||||
add(new H2("Mis tickets"), banner); | |||||
setPadding(false); | |||||
add(grid); | |||||
loadTickets(); | |||||
} | |||||
private void loadTickets() { | |||||
List<Ticket> tickets = redmineClient.getTickets(); | |||||
grid.setItems(tickets); | |||||
} | } | ||||
} | } |