forked from MinecraftUtilities/Backend
use better responses
This commit is contained in:
parent
a2dfd3fc6d
commit
4b4cc8ae54
@ -2,6 +2,7 @@ package cc.fascinated.controller;
|
||||
|
||||
import cc.fascinated.model.player.Player;
|
||||
import cc.fascinated.model.player.Skin;
|
||||
import cc.fascinated.model.response.impl.PlayerNotFoundResponse;
|
||||
import cc.fascinated.service.PlayerService;
|
||||
import cc.fascinated.util.PlayerUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@ -29,9 +30,10 @@ public class PlayerController {
|
||||
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody
|
||||
public ResponseEntity<?> getPlayer(@PathVariable String id) {
|
||||
Player player = playerManagerService.getPlayer(id);
|
||||
if (player == null) {
|
||||
return new ResponseEntity<>(Map.of("error", "Player not found"), HttpStatus.NOT_FOUND);
|
||||
if (player == null) { // No player with that id was found
|
||||
return new PlayerNotFoundResponse().toResponseEntity();
|
||||
}
|
||||
// Return the player
|
||||
return ResponseEntity.ok()
|
||||
.cacheControl(cacheControl)
|
||||
.body(player);
|
||||
@ -49,11 +51,10 @@ public class PlayerController {
|
||||
Skin.Parts skinPart = Skin.Parts.fromName(part);
|
||||
partBytes = PlayerUtils.getSkinPartBytes(skin, skinPart, size);
|
||||
}
|
||||
|
||||
if (partBytes == null) { // Fallback to the default head
|
||||
partBytes = PlayerUtils.getSkinPartBytes(Skin.DEFAULT_SKIN, Skin.Parts.HEAD, size);
|
||||
}
|
||||
|
||||
// Return the part image
|
||||
return ResponseEntity.ok()
|
||||
.cacheControl(cacheControl)
|
||||
.contentType(MediaType.IMAGE_PNG)
|
||||
|
@ -1,6 +1,6 @@
|
||||
package cc.fascinated.exception;
|
||||
|
||||
import cc.fascinated.model.response.ErrorResponse;
|
||||
import cc.fascinated.model.response.Response;
|
||||
import io.micrometer.common.lang.NonNull;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
@ -28,6 +28,6 @@ public final class ExceptionControllerAdvice {
|
||||
message = "An internal error has occurred.";
|
||||
}
|
||||
ex.printStackTrace(); // Print the stack trace
|
||||
return new ResponseEntity<>(new ErrorResponse(status, message), status);
|
||||
return new Response(status, message).toResponseEntity(); // Return the error response
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@ package cc.fascinated.model.player;
|
||||
|
||||
import cc.fascinated.config.Config;
|
||||
import cc.fascinated.util.PlayerUtils;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.AllArgsConstructor;
|
||||
@ -33,6 +34,7 @@ public class Skin {
|
||||
/**
|
||||
* The skin image for the skin
|
||||
*/
|
||||
@JsonIgnore
|
||||
private final BufferedImage skinImage;
|
||||
|
||||
/**
|
||||
|
@ -1,40 +0,0 @@
|
||||
package cc.fascinated.model.response;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import io.micrometer.common.lang.NonNull;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
import org.springframework.http.HttpStatus;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@NoArgsConstructor
|
||||
@Setter
|
||||
@Getter
|
||||
@ToString
|
||||
public final class ErrorResponse {
|
||||
/**
|
||||
* The status code of this error.
|
||||
*/
|
||||
@NonNull
|
||||
private HttpStatus status;
|
||||
|
||||
/**
|
||||
* The message of this error.
|
||||
*/
|
||||
@NonNull private String message;
|
||||
|
||||
/**
|
||||
* The timestamp this error occurred.
|
||||
*/
|
||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
|
||||
private Date timestamp;
|
||||
|
||||
public ErrorResponse(@NonNull HttpStatus status, @NonNull String message) {
|
||||
this.status = status;
|
||||
this.message = message;
|
||||
timestamp = new Date();
|
||||
}
|
||||
}
|
31
src/main/java/cc/fascinated/model/response/Response.java
Normal file
31
src/main/java/cc/fascinated/model/response/Response.java
Normal file
@ -0,0 +1,31 @@
|
||||
package cc.fascinated.model.response;
|
||||
|
||||
import io.micrometer.common.lang.NonNull;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.servlet.function.EntityResponse;
|
||||
|
||||
@Getter @AllArgsConstructor
|
||||
public class Response {
|
||||
|
||||
/**
|
||||
* The status code of this error.
|
||||
*/
|
||||
private HttpStatus status;
|
||||
|
||||
/**
|
||||
* The message of this error.
|
||||
*/
|
||||
private String message;
|
||||
|
||||
/**
|
||||
* Gets this response as a {@link ResponseEntity}.
|
||||
*
|
||||
* @return the response entity
|
||||
*/
|
||||
public ResponseEntity<?> toResponseEntity() {
|
||||
return new ResponseEntity<>(this, status);
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package cc.fascinated.model.response.impl;
|
||||
|
||||
import cc.fascinated.model.response.Response;
|
||||
import org.springframework.http.HttpStatus;
|
||||
|
||||
public class PlayerNotFoundResponse extends Response {
|
||||
|
||||
public PlayerNotFoundResponse() {
|
||||
super(HttpStatus.NOT_FOUND, "Player not found.");
|
||||
}
|
||||
}
|
@ -24,7 +24,7 @@ public class MojangAPIService {
|
||||
* @return the profile
|
||||
*/
|
||||
public MojangProfile getProfile(String id) {
|
||||
return WebRequest.get(mojangSessionServerUrl + "/session/minecraft/profile/" + id, MojangProfile.class);
|
||||
return WebRequest.getAsEntity(mojangSessionServerUrl + "/session/minecraft/profile/" + id, MojangProfile.class);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -35,6 +35,6 @@ public class MojangAPIService {
|
||||
* @return the profile
|
||||
*/
|
||||
public MojangUsernameToUuid getUuidFromUsername(String id) {
|
||||
return WebRequest.get(mojangApiUrl + "/users/profiles/minecraft/" + id, MojangUsernameToUuid.class);
|
||||
return WebRequest.getAsEntity(mojangApiUrl + "/users/profiles/minecraft/" + id, MojangUsernameToUuid.class);
|
||||
}
|
||||
}
|
||||
|
@ -27,12 +27,9 @@ public class PlayerUtils {
|
||||
@SneakyThrows
|
||||
@JsonIgnore
|
||||
public static BufferedImage getSkinImage(String url) {
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(new URI(url))
|
||||
.GET()
|
||||
.build();
|
||||
|
||||
byte[] body = Main.HTTP_CLIENT.send(request, HttpResponse.BodyHandlers.ofByteArray()).body();
|
||||
HttpResponse<byte[]> response = Main.HTTP_CLIENT.send(HttpRequest.newBuilder(URI.create(url)).build(),
|
||||
HttpResponse.BodyHandlers.ofByteArray());
|
||||
byte[] body = response.body();
|
||||
if (body == null) {
|
||||
return null;
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ public class WebRequest {
|
||||
* @return the response
|
||||
* @param <T> the type of the response
|
||||
*/
|
||||
public static <T> T get(String url, Class<T> clazz) {
|
||||
public static <T> T getAsEntity(String url, Class<T> clazz) {
|
||||
try {
|
||||
ResponseEntity<T> profile = CLIENT.get()
|
||||
.uri(url)
|
||||
|
Loading…
Reference in New Issue
Block a user