package com.hubspot.baragon.service.resources;
import java.util.List;
import javax.validation.Valid;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Optional;
import com.google.inject.Inject;
import com.hubspot.baragon.auth.NoAuth;
import com.hubspot.baragon.models.BaragonRequest;
import com.hubspot.baragon.models.BaragonResponse;
import com.hubspot.baragon.models.QueuedRequestId;
import com.hubspot.baragon.service.managers.RequestManager;
import com.hubspot.baragon.service.worker.BaragonRequestWorker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Path("/request")
@Consumes({MediaType.APPLICATION_JSON})
@Produces(MediaType.APPLICATION_JSON)
public class RequestResource {
private static final Logger LOG = LoggerFactory.getLogger(RequestResource.class);
private final RequestManager manager;
private final ObjectMapper objectMapper;
@Inject
public RequestResource(RequestManager manager, ObjectMapper objectMapper) {
this.manager = manager;
this.objectMapper = objectMapper;
}
@GET
@NoAuth
@Path("/{requestId}")
public Optional<BaragonResponse> getResponse(@PathParam("requestId") String requestId) {
return manager.getResponse(requestId);
}
@POST
public BaragonResponse enqueueRequest(@Valid BaragonRequest request) {
try {
LOG.info(String.format("Received request: %s", objectMapper.writeValueAsString(request)));
return manager.enqueueRequest(request);
} catch (Exception e) {
LOG.error(String.format("Caught exception for %s", request.getLoadBalancerRequestId()), e);
return BaragonResponse.failure(request.getLoadBalancerRequestId(), e.getMessage());
}
}
@GET
@NoAuth
public List<QueuedRequestId> getQueuedRequestIds() {
return manager.getQueuedRequestIds();
}
@GET
@NoAuth
@Path("/history/{serviceId}")
public List<BaragonResponse> getRecentRequestIds(@PathParam("serviceId") String serviceId) {
return manager.getResponsesForService(serviceId);
}
@DELETE
@Path("/{requestId}")
public BaragonResponse cancelRequest(@PathParam("requestId") String requestId) {
// prevent race conditions when transitioning from a cancel-able to not cancel-able state
synchronized (BaragonRequestWorker.class) {
manager.cancelRequest(requestId);
return manager.getResponse(requestId).or(BaragonResponse.requestDoesNotExist(requestId));
}
}
}