package com.linkedin.thirdeye.dashboard.resources;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Strings;
import com.linkedin.thirdeye.client.DAORegistry;
import com.linkedin.thirdeye.datalayer.bao.AlertConfigManager;
import com.linkedin.thirdeye.datalayer.bao.AnomalyFunctionManager;
import com.linkedin.thirdeye.datalayer.bao.DashboardConfigManager;
import com.linkedin.thirdeye.datalayer.bao.DatasetConfigManager;
import com.linkedin.thirdeye.datalayer.bao.EmailConfigurationManager;
import com.linkedin.thirdeye.datalayer.bao.MetricConfigManager;
import com.linkedin.thirdeye.datalayer.bao.OverrideConfigManager;
import com.linkedin.thirdeye.datalayer.dto.AbstractDTO;
import com.linkedin.thirdeye.datalayer.dto.AlertConfigDTO;
import com.linkedin.thirdeye.datalayer.dto.AnomalyFunctionDTO;
import com.linkedin.thirdeye.datalayer.dto.DashboardConfigDTO;
import com.linkedin.thirdeye.datalayer.dto.DatasetConfigDTO;
import com.linkedin.thirdeye.datalayer.dto.EmailConfigurationDTO;
import com.linkedin.thirdeye.datalayer.dto.MetricConfigDTO;
import com.linkedin.thirdeye.datalayer.dto.OverrideConfigDTO;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.ws.rs.Consumes;
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.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Path("thirdeye/entity")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class EntityManagerResource {
private final AnomalyFunctionManager anomalyFunctionManager;
private final EmailConfigurationManager emailConfigurationManager;
private final DashboardConfigManager dashboardConfigManager;
private final MetricConfigManager metricConfigManager;
private final DatasetConfigManager datasetConfigManager;
private final OverrideConfigManager overrideConfigManager;
private final AlertConfigManager alertConfigManager;
private static final DAORegistry DAO_REGISTRY = DAORegistry.getInstance();
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private static final Logger LOG = LoggerFactory.getLogger(EntityManagerResource.class);
public EntityManagerResource() {
this.emailConfigurationManager = DAO_REGISTRY.getEmailConfigurationDAO();
this.anomalyFunctionManager = DAO_REGISTRY.getAnomalyFunctionDAO();
this.dashboardConfigManager = DAO_REGISTRY.getDashboardConfigDAO();
this.metricConfigManager = DAO_REGISTRY.getMetricConfigDAO();
this.datasetConfigManager = DAO_REGISTRY.getDatasetConfigDAO();
this.overrideConfigManager = DAO_REGISTRY.getOverrideConfigDAO();
this.alertConfigManager = DAO_REGISTRY.getAlertConfigDAO();
}
private enum EntityType {
ANOMALY_FUNCTION, EMAIL_CONFIGURATION, DASHBOARD_CONFIG, DATASET_CONFIG, METRIC_CONFIG,
OVERRIDE_CONFIG, ALERT_CONFIG
}
@GET
public List<EntityType> getAllEntityTypes() {
return Arrays.asList(EntityType.values());
}
@GET
@Path("{entityType}")
public Response getAllEntitiesForType(@PathParam("entityType") String entityTypeStr) {
EntityType entityType = EntityType.valueOf(entityTypeStr);
List<AbstractDTO> results = new ArrayList<>();
switch (entityType) {
case ANOMALY_FUNCTION:
results.addAll(anomalyFunctionManager.findAllActiveFunctions());
break;
case EMAIL_CONFIGURATION:
results.addAll(emailConfigurationManager.findAll());
break;
case DASHBOARD_CONFIG:
results.addAll(dashboardConfigManager.findAll());
break;
case DATASET_CONFIG:
results.addAll(datasetConfigManager.findAll());
break;
case METRIC_CONFIG:
results.addAll(metricConfigManager.findAll());
break;
case OVERRIDE_CONFIG:
results.addAll(overrideConfigManager.findAll());
break;
case ALERT_CONFIG:
results.addAll(alertConfigManager.findAll());
break;
default:
throw new WebApplicationException("Unknown entity type : " + entityType);
}
return Response.ok(results).build();
}
@POST
public Response updateEntity(@QueryParam("entityType") String entityTypeStr, String jsonPayload) {
if (Strings.isNullOrEmpty(entityTypeStr)) {
throw new WebApplicationException("EntryType can not be null");
}
EntityType entityType = EntityType.valueOf(entityTypeStr);
try {
switch (entityType) {
case ANOMALY_FUNCTION:
AnomalyFunctionDTO anomalyFunctionDTO = OBJECT_MAPPER.readValue(jsonPayload, AnomalyFunctionDTO.class);
if (anomalyFunctionDTO.getId() == null) {
anomalyFunctionManager.save(anomalyFunctionDTO);
} else {
anomalyFunctionManager.update(anomalyFunctionDTO);
}
break;
case EMAIL_CONFIGURATION:
EmailConfigurationDTO emailConfigurationDTO =
OBJECT_MAPPER.readValue(jsonPayload, EmailConfigurationDTO.class);
emailConfigurationManager.update(emailConfigurationDTO);
break;
case DASHBOARD_CONFIG:
DashboardConfigDTO dashboardConfigDTO = OBJECT_MAPPER.readValue(jsonPayload, DashboardConfigDTO.class);
dashboardConfigManager.update(dashboardConfigDTO);
break;
case DATASET_CONFIG:
DatasetConfigDTO datasetConfigDTO = OBJECT_MAPPER.readValue(jsonPayload, DatasetConfigDTO.class);
datasetConfigManager.update(datasetConfigDTO);
break;
case METRIC_CONFIG:
MetricConfigDTO metricConfigDTO = OBJECT_MAPPER.readValue(jsonPayload, MetricConfigDTO.class);
metricConfigManager.update(metricConfigDTO);
break;
case OVERRIDE_CONFIG:
OverrideConfigDTO overrideConfigDTO = OBJECT_MAPPER.readValue(jsonPayload, OverrideConfigDTO.class);
if (overrideConfigDTO.getId() == null) {
overrideConfigManager.save(overrideConfigDTO);
} else {
overrideConfigManager.update(overrideConfigDTO);
}
break;
case ALERT_CONFIG:
AlertConfigDTO alertConfigDTO = OBJECT_MAPPER.readValue(jsonPayload, AlertConfigDTO.class);
if (alertConfigDTO.getId() == null) {
alertConfigManager.save(alertConfigDTO);
} else {
alertConfigManager.update(alertConfigDTO);
}
break;
}
} catch (IOException e) {
LOG.error("Error saving the entity with payload : " + jsonPayload, e);
throw new WebApplicationException(e);
}
return Response.ok().build();
}
}