added FeedbackRepository

This commit is contained in:
Elias Müller 2024-12-08 22:27:54 +01:00
parent 318a30fe54
commit ddedcea8ea
2 changed files with 35 additions and 32 deletions

View File

@ -0,0 +1,25 @@
package eu.mhsl.craftattack.spawn.api.client.repositories;
import com.google.common.reflect.TypeToken;
import eu.mhsl.craftattack.spawn.api.client.HttpRepository;
import eu.mhsl.craftattack.spawn.api.client.ReqResp;
import eu.mhsl.craftattack.spawn.util.api.ApiUtil;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public class FeedbackRepository extends HttpRepository {
public FeedbackRepository() {
super(ApiUtil.getBaseUri(), ApiUtil::withAuthorizationSecret);
}
public record Request(String event, List<UUID> users) {}
public ReqResp<Map<UUID, String>> createFeedbackUrls(Request data) {
final Type responseType = new TypeToken<Map<UUID, String>>(){}.getType();
ReqResp<Object> rawData = this.post("feedback", data, Object.class);
return new ReqResp<>(rawData.status(), this.gson.fromJson(this.gson.toJson(rawData.data()), responseType));
}
}

View File

@ -1,12 +1,13 @@
package eu.mhsl.craftattack.spawn.appliances.feedback; package eu.mhsl.craftattack.spawn.appliances.feedback;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import eu.mhsl.craftattack.spawn.Main; import eu.mhsl.craftattack.spawn.Main;
import eu.mhsl.craftattack.spawn.api.client.ReqResp;
import eu.mhsl.craftattack.spawn.api.client.repositories.FeedbackRepository;
import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliance.Appliance;
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
import eu.mhsl.craftattack.spawn.appliances.feedback.commands.FeedbackCommand; import eu.mhsl.craftattack.spawn.appliances.feedback.commands.FeedbackCommand;
import eu.mhsl.craftattack.spawn.appliances.feedback.commands.RequestFeedbackCommand; import eu.mhsl.craftattack.spawn.appliances.feedback.commands.RequestFeedbackCommand;
import eu.mhsl.craftattack.spawn.util.api.HttpStatus;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.ComponentBuilder;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
@ -18,33 +19,27 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.lang.reflect.Type;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.*; import java.util.*;
public class Feedback extends Appliance { public class Feedback extends Appliance {
private final URI apiEndpoint;
public Feedback() { public Feedback() {
super("feedback"); super("feedback");
this.apiEndpoint = URI.create(Objects.requireNonNull(localConfig().getString("api")));
} }
public void requestFeedback(String eventName, List<Player> receivers, @Nullable String question) { public void requestFeedback(String eventName, List<Player> receivers, @Nullable String question) {
Map<UUID, String> feedbackUrls = createPersonalizedUrls( ReqResp<Map<UUID, String>> response = this.queryRepository(FeedbackRepository.class).createFeedbackUrls(
new Request(eventName, receivers.stream().map(Entity::getUniqueId).toList()) new FeedbackRepository.Request(eventName, receivers.stream().map(Entity::getUniqueId).toList())
); );
System.out.println(feedbackUrls.toString()); System.out.println(response.toString());
System.out.println(response.status());
if(response.status() != HttpStatus.CREATED) throw new RuntimeException();
Component border = Component.text("-".repeat(40), NamedTextColor.GRAY); Component border = Component.text("-".repeat(40), NamedTextColor.GRAY);
receivers.forEach(player -> { receivers.forEach(player -> {
String feedbackUrl = feedbackUrls.get(player.getUniqueId()); String feedbackUrl = response.data().get(player.getUniqueId());
if(feedbackUrl == null) { if(feedbackUrl == null) {
Main.logger().warning(String.format("FeedbackUrl not found for player '%s' from backend!", player.getUniqueId())); Main.logger().warning(String.format("FeedbackUrl not found for player '%s' from backend!", player.getUniqueId()));
return; return;
@ -72,23 +67,6 @@ public class Feedback extends Appliance {
}); });
} }
private record Request(String event, List<UUID> users) {}
private final Type responseType = new TypeToken<Map<UUID, String>>(){}.getType();
private Map<UUID, String> createPersonalizedUrls(Request data) {
try(HttpClient client = HttpClient.newHttpClient()) {
HttpRequest httpRequest = HttpRequest.newBuilder()
.uri(this.apiEndpoint)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(new Gson().toJson(data)))
.build();
HttpResponse<String> httpResponse = client.send(httpRequest, HttpResponse.BodyHandlers.ofString());
return new Gson().fromJson(httpResponse.body(), responseType);
} catch(IOException | InterruptedException e) {
throw new RuntimeException(e);
}
}
@Override @Override
protected @NotNull List<ApplianceCommand<?>> commands() { protected @NotNull List<ApplianceCommand<?>> commands() {
return List.of( return List.of(