blob: 92a3505c72acd7a3b4e63239288533a660893f67 [file]
package build.bazel.dashboard.common;
import static build.bazel.dashboard.utils.HttpHeadersUtils.getAsIntOrZero;
import static build.bazel.dashboard.utils.HttpHeadersUtils.getOrEmpty;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.Builder;
import lombok.Value;
import org.springframework.http.HttpStatusCode;
import org.springframework.web.reactive.function.client.ClientResponse;
import reactor.core.publisher.Mono;
@Builder
@Value
public class RestApiResponse {
HttpStatusCode status;
String etag;
RateLimit rateLimit;
JsonNode body;
@Builder
@Value
public static class RateLimit {
int limit;
int remaining;
int used;
int reset;
public static RateLimit fromHeaders(ClientResponse.Headers headers) {
RateLimitBuilder builder = RateLimit.builder();
builder.limit(getAsIntOrZero(headers, "X-RateLimit-Limit"));
builder.remaining(getAsIntOrZero(headers, "X-RateLimit-Remaining"));
builder.used(getAsIntOrZero(headers, "X-RateLimit-Used"));
builder.reset(getAsIntOrZero(headers, "X-RateLimit-Reset"));
return builder.build();
}
}
public static Mono<RestApiResponse> fromClientResponse(ClientResponse clientResponse) {
var status = clientResponse.statusCode();
ClientResponse.Headers headers = clientResponse.headers();
var builder =
RestApiResponse.builder()
.status(status)
.etag(getOrEmpty(headers, "ETag"))
.rateLimit(RateLimit.fromHeaders(headers));
if (status.is2xxSuccessful()) {
return clientResponse.bodyToMono(JsonNode.class).map(body -> builder.body(body).build());
} else {
return Mono.just(builder.build());
}
}
}