package pl.touk.sputnik.connector.saas; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.http.NameValuePair; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.message.BasicNameValuePair; import org.jetbrains.annotations.NotNull; import pl.touk.sputnik.connector.Connector; import pl.touk.sputnik.connector.Patchset; import pl.touk.sputnik.connector.http.HttpConnector; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; @AllArgsConstructor @Slf4j public class SaasConnector implements Connector { private HttpConnector httpConnector; private Patchset patchset; private String apiKey; private String buildId; private static final String API_KEY_PARAM = "key"; private static final String BUILD_ID_PARAM = "build_id"; private static final String FILES_URL_FORMAT = "/api/%s/%s/pulls/%d/files"; private static final String VIOLATIONS_URL_FORMAT = "/api/%s/%s/pulls/%d/violations"; @NotNull @Override public String listFiles() throws URISyntaxException, IOException { URI uri = httpConnector.buildUri(createUrl(patchset, FILES_URL_FORMAT), params()); HttpGet request = new HttpGet(uri); CloseableHttpResponse httpResponse = httpConnector.logAndExecute(request); return httpConnector.consumeAndLogEntity(httpResponse); } @NotNull @Override public String sendReview(String violationsAsJson) throws URISyntaxException, IOException { log.info("Sending violations: {}", violationsAsJson); URI uri = httpConnector.buildUri(createUrl(patchset, VIOLATIONS_URL_FORMAT), params()); HttpPost httpPost = new HttpPost(uri); httpPost.setEntity(new StringEntity(violationsAsJson, ContentType.APPLICATION_JSON)); CloseableHttpResponse httpResponse = httpConnector.logAndExecute(httpPost); return httpConnector.consumeAndLogEntity(httpResponse); } private String createUrl(Patchset patchset, String formatUrl) { return String.format(formatUrl, patchset.getProvider().getName(), patchset.getProjectPath(), patchset.getPullRequestId()); } @NotNull private NameValuePair[] params() { List<NameValuePair> params = new ArrayList<>(); if (StringUtils.isNotBlank(apiKey)) { params.add(new BasicNameValuePair(API_KEY_PARAM, apiKey)); } if (StringUtils.isNotBlank(buildId)) { params.add(new BasicNameValuePair(BUILD_ID_PARAM, buildId)); } return params.toArray(new NameValuePair[params.size()]); } }