mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-17 18:51:10 +01:00
Show updatable plugins
This commit is contained in:
@@ -3,8 +3,8 @@ package sonia.scm.api.v2.resources;
|
||||
import com.webcohesion.enunciate.metadata.rs.ResponseCode;
|
||||
import com.webcohesion.enunciate.metadata.rs.StatusCodes;
|
||||
import com.webcohesion.enunciate.metadata.rs.TypeHint;
|
||||
import sonia.scm.plugin.AvailablePlugin;
|
||||
import sonia.scm.plugin.InstalledPlugin;
|
||||
import sonia.scm.plugin.InstalledPluginDescriptor;
|
||||
import sonia.scm.plugin.PluginManager;
|
||||
import sonia.scm.plugin.PluginPermissions;
|
||||
import sonia.scm.web.VndMediaType;
|
||||
@@ -50,7 +50,8 @@ public class InstalledPluginResource {
|
||||
public Response getInstalledPlugins() {
|
||||
PluginPermissions.read().check();
|
||||
List<InstalledPlugin> plugins = pluginManager.getInstalled();
|
||||
return Response.ok(collectionMapper.mapInstalled(plugins)).build();
|
||||
List<AvailablePlugin> available = pluginManager.getAvailable();
|
||||
return Response.ok(collectionMapper.mapInstalled(plugins, available)).build();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -72,8 +73,9 @@ public class InstalledPluginResource {
|
||||
public Response getInstalledPlugin(@PathParam("name") String name) {
|
||||
PluginPermissions.read().check();
|
||||
Optional<InstalledPlugin> pluginDto = pluginManager.getInstalled(name);
|
||||
List<AvailablePlugin> available = pluginManager.getAvailable();
|
||||
if (pluginDto.isPresent()) {
|
||||
return Response.ok(mapper.mapInstalled(pluginDto.get())).build();
|
||||
return Response.ok(mapper.mapInstalled(pluginDto.get(), available)).build();
|
||||
} else {
|
||||
throw notFound(entity("Plugin", name));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package sonia.scm.api.v2.resources;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import de.otto.edison.hal.HalRepresentation;
|
||||
import de.otto.edison.hal.Links;
|
||||
import lombok.Getter;
|
||||
@@ -16,6 +17,8 @@ public class PluginDto extends HalRepresentation {
|
||||
|
||||
private String name;
|
||||
private String version;
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
private String newVersion;
|
||||
private String displayName;
|
||||
private String description;
|
||||
private String author;
|
||||
|
||||
@@ -26,8 +26,11 @@ public class PluginDtoCollectionMapper {
|
||||
this.mapper = mapper;
|
||||
}
|
||||
|
||||
public HalRepresentation mapInstalled(List<InstalledPlugin> plugins) {
|
||||
List<PluginDto> dtos = plugins.stream().map(mapper::mapInstalled).collect(toList());
|
||||
public HalRepresentation mapInstalled(List<InstalledPlugin> plugins, List<AvailablePlugin> availablePlugins) {
|
||||
List<PluginDto> dtos = plugins
|
||||
.stream()
|
||||
.map(i -> mapper.mapInstalled(i, availablePlugins))
|
||||
.collect(toList());
|
||||
return new HalRepresentation(createInstalledPluginsLinks(), embedDtos(dtos));
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,9 @@ import sonia.scm.plugin.PluginPermissions;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import static de.otto.edison.hal.Link.link;
|
||||
import static de.otto.edison.hal.Links.linkingTo;
|
||||
|
||||
@@ -22,8 +25,8 @@ public abstract class PluginDtoMapper {
|
||||
|
||||
public abstract void map(PluginInformation plugin, @MappingTarget PluginDto dto);
|
||||
|
||||
public PluginDto mapInstalled(InstalledPlugin plugin) {
|
||||
PluginDto dto = createDtoForInstalled(plugin);
|
||||
public PluginDto mapInstalled(InstalledPlugin plugin, List<AvailablePlugin> availablePlugins) {
|
||||
PluginDto dto = createDtoForInstalled(plugin, availablePlugins);
|
||||
map(dto, plugin);
|
||||
return dto;
|
||||
}
|
||||
@@ -57,13 +60,33 @@ public abstract class PluginDtoMapper {
|
||||
return new PluginDto(links.build());
|
||||
}
|
||||
|
||||
private PluginDto createDtoForInstalled(InstalledPlugin plugin) {
|
||||
private PluginDto createDtoForInstalled(InstalledPlugin plugin, List<AvailablePlugin> availablePlugins) {
|
||||
PluginInformation information = plugin.getDescriptor().getInformation();
|
||||
Optional<AvailablePlugin> availablePlugin = checkForUpdates(plugin, availablePlugins);
|
||||
|
||||
Links.Builder links = linkingTo()
|
||||
.self(resourceLinks.installedPlugin()
|
||||
.self(information.getName()));
|
||||
if (availablePlugin.isPresent()
|
||||
&& !availablePlugin.get().isPending()
|
||||
&& PluginPermissions.manage().isPermitted()
|
||||
) {
|
||||
links.single(link("update", resourceLinks.availablePlugin().install(information.getName())));
|
||||
}
|
||||
|
||||
return new PluginDto(links.build());
|
||||
PluginDto dto = new PluginDto(links.build());
|
||||
|
||||
availablePlugin.ifPresent(value -> {
|
||||
dto.setNewVersion(value.getDescriptor().getInformation().getVersion());
|
||||
dto.setPending(value.isPending());
|
||||
});
|
||||
|
||||
return dto;
|
||||
}
|
||||
|
||||
private Optional<AvailablePlugin> checkForUpdates(InstalledPlugin plugin, List<AvailablePlugin> availablePlugins) {
|
||||
return availablePlugins.stream()
|
||||
.filter(a -> a.getDescriptor().getInformation().getName().equals(plugin.getDescriptor().getInformation().getName()))
|
||||
.findAny();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user