package org.stagemonitor.alerting.incident;
import org.stagemonitor.core.elasticsearch.ElasticsearchClient;
import java.util.Collection;
public class ElasticsearchIncidentRepository implements IncidentRepository {
public static final String BASE_URL = "/stagemonitor/incidents";
private ElasticsearchClient elasticsearchClient;
public ElasticsearchIncidentRepository(ElasticsearchClient elasticsearchClient) {
this.elasticsearchClient = elasticsearchClient;
}
@Override
public Collection<Incident> getAllIncidents() {
return elasticsearchClient.getAll(BASE_URL, 100, Incident.class);
}
@Override
public Incident getIncidentByCheckId(String checkId) {
return elasticsearchClient.getObject(BASE_URL + "/" + checkId, Incident.class);
}
@Override
public boolean deleteIncident(Incident incident) {
return hasNoConflict(elasticsearchClient.sendRequest("DELETE", BASE_URL + "/" + incident.getCheckId() + getVersionParameter(incident)));
}
@Override
public boolean createIncident(Incident incident) {
if (incident.getVersion() != 1) {
throw new IllegalArgumentException("Tried to create an incident with version not equal to 1: " + incident.getVersion());
}
return updateIncident(incident);
}
@Override
public boolean updateIncident(Incident incident) {
return hasNoConflict(elasticsearchClient.sendAsJson("PUT", BASE_URL + "/" + incident.getCheckId() + getVersionParameter(incident), incident));
}
@Override
public void clear() {
for (Incident incident : getAllIncidents()) {
deleteIncident(incident);
}
}
private String getVersionParameter(Incident incident) {
return "?version=" + incident.getVersion() + "&version_type=external";
}
private boolean hasNoConflict(int statusCode) {
return statusCode != 409;
}
void setElasticsearchClient(ElasticsearchClient elasticsearchClient) {
this.elasticsearchClient = elasticsearchClient;
}
}