package org.fluxtream.core.api;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.fluxtream.core.auth.AuthHelper;
import org.fluxtream.core.connectors.Connector;
import org.fluxtream.core.connectors.ObjectType;
import org.fluxtream.core.domain.ApiKey;
import org.fluxtream.core.domain.UpdateWorkerTask;
import org.fluxtream.core.services.ConnectorUpdateService;
import org.fluxtream.core.services.GuestService;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.Collection;
import java.util.List;
/**
*
* @author Candide Kemmler (candide@fluxtream.com)
*/
@Path("/v1/updateTasks")
@Component("RESTUpdateWorkerTaskStore")
@Scope("request")
public class UpdateWorkerTaskStore {
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
@Qualifier("connectorUpdateServiceImpl")
@Autowired
ConnectorUpdateService connectorUpdateService;
private static final DateTimeFormatter fmt = ISODateTimeFormat.dateTime().withZone(DateTimeZone.forID("UTC"));
@Autowired
private GuestService guestService;
@GET
@Path("/{connector}")
@Produces({MediaType.APPLICATION_JSON})
public Response getUpdateTasks(@PathParam("connector") String connectorName) {
try{
long guestId = AuthHelper.getGuestId();
ApiKey apiKey = guestService.getApiKey(guestId, Connector.getConnector(connectorName));
final List<UpdateWorkerTask> scheduledUpdates =
connectorUpdateService.getScheduledOrInProgressUpdateTasks(apiKey);
JSONArray array = new JSONArray();
for (UpdateWorkerTask scheduledUpdate : scheduledUpdates) {
array.add(toJSON(scheduledUpdate));
}
return Response.ok(array.toString()).build();
}
catch (Exception e){
return Response.serverError().entity("Failed to get udpate tasks: " + e.getMessage()).build();
}
}
@GET
@Path("/all")
@Produces({MediaType.APPLICATION_JSON})
public Response getUpdateTasksAll() {
try{
long guestId = AuthHelper.getGuestId();
final Collection<Connector> connectors = Connector.getAllConnectors();
JSONArray res = new JSONArray();
for(Connector c : connectors)
{
ApiKey apiKey = guestService.getApiKey(guestId, Connector.getConnector(c.getName()));
final List<UpdateWorkerTask> scheduledUpdates =
connectorUpdateService.getScheduledOrInProgressUpdateTasks(apiKey);
JSONArray array = new JSONArray();
for (UpdateWorkerTask scheduledUpdate : scheduledUpdates) {
array.add(toJSON(scheduledUpdate));
}
JSONObject connectorStatus = new JSONObject();
connectorStatus.accumulate("name", c.getName());
connectorStatus.accumulate("status", array);
res.add(connectorStatus);
}
return Response.ok(res.toString()).build();
}
catch (Exception e){
return Response.serverError().entity("Failed to get update tasks: " + e.getMessage()).build();
}
}
private JSONObject toJSON(UpdateWorkerTask task) {
JSONObject json = new JSONObject();
json.accumulate("objectTypes", task.getObjectTypes());
json.accumulate("updateType", task.updateType.toString());
json.accumulate("timeScheduled", fmt.print(task.timeScheduled));
json.accumulate("retries", task.retries);
json.accumulate("status", task.status.toString());
json.accumulate("jsonParams", task.jsonParams);
json.accumulate("auditTrail", task.auditTrail);
return json;
}
@GET
@Path("/{connector}/{objectType}")
@Produces({MediaType.APPLICATION_JSON})
public Response getObjectTypeUpdateTasks(@PathParam("connector") String connectorName, @PathParam("objectType") String objectTypeName) {
try{
long guestId = AuthHelper.getGuestId();
final Connector connector = Connector.getConnector(connectorName);
final ObjectType objectType = ObjectType.getObjectType(connector, objectTypeName);
ApiKey apiKey = guestService.getApiKey(guestId, Connector.getConnector(connectorName));
final UpdateWorkerTask scheduledUpdate =
connectorUpdateService.getUpdateWorkerTask(apiKey, objectType.value());
return Response.ok(scheduledUpdate!=null?toJSON(scheduledUpdate).toString():"{}").build();
}
catch (Exception e){
return Response.serverError().entity("Failed to get update tasks: " + e.getMessage()).build();
}
}
@DELETE
@Path("/{connector}")
@Produces({MediaType.APPLICATION_JSON})
public Response deleteUpdateTasks(@PathParam("connector") String connectorName) {
try{
long guestId = AuthHelper.getGuestId();
ApiKey apiKey = guestService.getApiKey(guestId, Connector.getConnector(connectorName));
connectorUpdateService.flushUpdateWorkerTasks(apiKey, false);
return Response.ok("successfully deleted pending update tasks for " + connectorName).build();
}
catch (Exception e){
return Response.serverError().entity("Failed to get update tasks: " + e.getMessage()).build();
}
}
}