implemented ui for pending plugin installation

This commit is contained in:
Sebastian Sdorra
2019-08-21 14:54:01 +02:00
parent 9514a94492
commit 05967aca4a
14 changed files with 394 additions and 33 deletions

View File

@@ -95,4 +95,16 @@ public class AvailablePluginResource {
pluginManager.install(name, restartAfterInstallation);
return Response.ok().build();
}
@POST
@Path("/install-pending")
@StatusCodes({
@ResponseCode(code = 200, condition = "success"),
@ResponseCode(code = 500, condition = "internal server error")
})
public Response installPending() {
PluginPermissions.manage().check();
pluginManager.installPendingAndRestart();
return Response.ok().build();
}
}

View File

@@ -3,9 +3,11 @@ package sonia.scm.api.v2.resources;
import com.google.inject.Inject;
import de.otto.edison.hal.Embedded;
import de.otto.edison.hal.HalRepresentation;
import de.otto.edison.hal.Link;
import de.otto.edison.hal.Links;
import sonia.scm.plugin.AvailablePlugin;
import sonia.scm.plugin.InstalledPlugin;
import sonia.scm.plugin.PluginPermissions;
import java.util.List;
@@ -31,7 +33,7 @@ public class PluginDtoCollectionMapper {
public HalRepresentation mapAvailable(List<AvailablePlugin> plugins) {
List<PluginDto> dtos = plugins.stream().map(mapper::mapAvailable).collect(toList());
return new HalRepresentation(createAvailablePluginsLinks(), embedDtos(dtos));
return new HalRepresentation(createAvailablePluginsLinks(plugins), embedDtos(dtos));
}
private Links createInstalledPluginsLinks() {
@@ -42,14 +44,25 @@ public class PluginDtoCollectionMapper {
return linksBuilder.build();
}
private Links createAvailablePluginsLinks() {
private Links createAvailablePluginsLinks(List<AvailablePlugin> plugins) {
String baseUrl = resourceLinks.availablePluginCollection().self();
Links.Builder linksBuilder = linkingTo()
.with(Links.linkingTo().self(baseUrl).build());
if (PluginPermissions.manage().isPermitted()) {
if (containsPending(plugins)) {
linksBuilder.single(Link.link("installPending", resourceLinks.availablePluginCollection().installPending()));
}
}
return linksBuilder.build();
}
private boolean containsPending(List<AvailablePlugin> plugins) {
return plugins.stream().anyMatch(AvailablePlugin::isPending);
}
private Embedded embedDtos(List<PluginDto> dtos) {
return embeddedBuilder()
.with("plugins", dtos)

View File

@@ -715,6 +715,10 @@ class ResourceLinks {
availablePluginCollectionLinkBuilder = new LinkBuilder(pathInfo, PluginRootResource.class, AvailablePluginResource.class);
}
String installPending() {
return availablePluginCollectionLinkBuilder.method("availablePlugins").parameters().method("installPending").parameters().href();
}
String self() {
return availablePluginCollectionLinkBuilder.method("availablePlugins").parameters().method("getAvailablePlugins").parameters().href();
}