From 0d17230c280d2752a14735052173ff2bfa4e4e21 Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Fri, 27 Oct 2023 22:51:22 +0200
Subject: [PATCH] Download plugin

---
 .../playwall/controller/PluginController.java   | 11 +++++++++++
 .../playwall/service/ArtifactoryClient.java     | 17 +++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/src/main/java/de/tobias/playwall/controller/PluginController.java b/src/main/java/de/tobias/playwall/controller/PluginController.java
index fa39bc7..24f4d67 100644
--- a/src/main/java/de/tobias/playwall/controller/PluginController.java
+++ b/src/main/java/de/tobias/playwall/controller/PluginController.java
@@ -1,14 +1,17 @@
 package de.tobias.playwall.controller;
 
 import de.tobias.playwall.model.Plugin;
+import de.tobias.playwall.service.ArtifactoryClient;
 import de.tobias.playwall.service.PluginService;
 import lombok.AllArgsConstructor;
+import org.springframework.core.io.Resource;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.server.ResponseStatusException;
+import reactor.core.publisher.Mono;
 
 import java.util.List;
 
@@ -18,6 +21,7 @@ import java.util.List;
 public class PluginController
 {
 	private final PluginService service;
+	private final ArtifactoryClient artifactoryClient;
 
 	@GetMapping
 	List<Plugin> getAllPlugins()
@@ -30,4 +34,11 @@ public class PluginController
 	{
 		return service.getPlugin(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
 	}
+
+	@GetMapping("/raw/{id}")
+	Mono<byte[]> getPluginExecutable(@PathVariable Integer id)
+	{
+		final Plugin plugin = service.getPlugin(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
+		return artifactoryClient.downloadArtifact(plugin);
+	}
 }
diff --git a/src/main/java/de/tobias/playwall/service/ArtifactoryClient.java b/src/main/java/de/tobias/playwall/service/ArtifactoryClient.java
index 0680ed3..3fd4983 100644
--- a/src/main/java/de/tobias/playwall/service/ArtifactoryClient.java
+++ b/src/main/java/de/tobias/playwall/service/ArtifactoryClient.java
@@ -3,6 +3,7 @@ package de.tobias.playwall.service;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
 import de.tobias.playwall.infrastructure.ArtifactoryConfigurationProperties;
+import de.tobias.playwall.model.Plugin;
 import de.tobias.playwall.model.PluginDescription;
 import de.tobias.playwall.model.PluginManifest;
 import de.tobias.playwall.model.artifactory.Folder;
@@ -13,6 +14,7 @@ import lombok.SneakyThrows;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
 
 import java.util.Comparator;
 import java.util.List;
@@ -89,4 +91,19 @@ public class ArtifactoryClient
 		}
 		return mapper.readValue(response.getBody().source(), PluginManifest.class);
 	}
+
+	public Mono<byte[]> downloadArtifact(Plugin plugin)
+	{
+		return webClient.get()
+				.uri("/artifactory/%s/%s/%s/%s/%s-%s.jar".formatted(
+						configurationProperties.getRepository(),
+						configurationProperties.getGroupId().replace(".", "/"),
+						plugin.getName(),
+						plugin.getVersion(),
+						plugin.getName(),
+						plugin.getVersion()
+				))
+				.retrieve()
+				.bodyToMono(byte[].class);
+	}
 }
-- 
GitLab