From b2294b8ae19d240f3697a167dfef115c4bfcea72 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Mon, 16 Sep 2019 15:10:48 +0200 Subject: [PATCH] Add uninstall endpoint --- .../v2/resources/InstalledPluginResource.java | 19 +++++++++++++++++++ .../scm/api/v2/resources/PluginDtoMapper.java | 7 +++++++ .../scm/api/v2/resources/ResourceLinks.java | 4 ++++ 3 files changed, 30 insertions(+) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/InstalledPluginResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/InstalledPluginResource.java index 5b5d0f267b..f0dff26757 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/InstalledPluginResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/InstalledPluginResource.java @@ -11,9 +11,11 @@ import sonia.scm.web.VndMediaType; import javax.inject.Inject; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; import java.util.List; import java.util.Optional; @@ -80,4 +82,21 @@ public class InstalledPluginResource { throw notFound(entity("Plugin", name)); } } + + /** + * Triggers plugin uninstall. + * @param name plugin name + * @return HTTP Status. + */ + @POST + @Path("/{name}/uninstall") + @StatusCodes({ + @ResponseCode(code = 200, condition = "success"), + @ResponseCode(code = 500, condition = "internal server error") + }) + public Response uninstallPlugin(@PathParam("name") String name, @QueryParam("restart") boolean restartAfterInstallation) { + PluginPermissions.manage().check(); + pluginManager.uninstall(name, restartAfterInstallation); + return Response.ok().build(); + } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginDtoMapper.java index e03330ab32..e3e1c026ac 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PluginDtoMapper.java @@ -74,6 +74,13 @@ public abstract class PluginDtoMapper { ) { links.single(link("update", resourceLinks.availablePlugin().install(information.getName()))); } + if (!plugin.isCore() + && (!availablePlugin.isPresent() || !availablePlugin.get().isPending()) + && PluginPermissions.manage().isPermitted() + // TODO check if plugin is no dependency of another plugin + ) { + links.single(link("uninstall", resourceLinks.installedPlugin().uninstall(information.getName()))); + } PluginDto dto = new PluginDto(links.build()); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java index 3a797734ea..4198d8dbd0 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java @@ -666,6 +666,10 @@ class ResourceLinks { String self(String id) { return installedPluginLinkBuilder.method("installedPlugins").parameters().method("getInstalledPlugin").parameters(id).href(); } + + public String uninstall(String name) { + return installedPluginLinkBuilder.method("installedPlugins").parameters().method("uninstallPlugin").parameters(name).href(); + } } public InstalledPluginCollectionLinks installedPluginCollection() {