From a64cdb060e8f7212555e6f04da088377055629c4 Mon Sep 17 00:00:00 2001 From: Martin Lowe <martin.lowe@eclipse-foundation.org> Date: Fri, 22 Sep 2023 10:30:25 -0400 Subject: [PATCH] Iss #143 - Handle Status event by making PR in hook optional but checked Resolves #143 --- .../eca/api/models/GithubWebhookRequest.java | 5 +++- .../eca/resource/GithubWebhooksResource.java | 26 ++++++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/eclipsefoundation/git/eca/api/models/GithubWebhookRequest.java b/src/main/java/org/eclipsefoundation/git/eca/api/models/GithubWebhookRequest.java index 7ec821ac..582bb760 100644 --- a/src/main/java/org/eclipsefoundation/git/eca/api/models/GithubWebhookRequest.java +++ b/src/main/java/org/eclipsefoundation/git/eca/api/models/GithubWebhookRequest.java @@ -11,6 +11,8 @@ */ package org.eclipsefoundation.git.eca.api.models; +import javax.annotation.Nullable; + import org.eclipsefoundation.git.eca.dto.GithubWebhookTracking; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @@ -31,6 +33,7 @@ public abstract class GithubWebhookRequest { public abstract Repository getRepository(); + @Nullable public abstract PullRequest getPullRequest(); /** @@ -73,7 +76,7 @@ public abstract class GithubWebhookRequest { public abstract Builder setRepository(Repository repository); - public abstract Builder setPullRequest(PullRequest pullRequest); + public abstract Builder setPullRequest(@Nullable PullRequest pullRequest); public abstract GithubWebhookRequest build(); } diff --git a/src/main/java/org/eclipsefoundation/git/eca/resource/GithubWebhooksResource.java b/src/main/java/org/eclipsefoundation/git/eca/resource/GithubWebhooksResource.java index 14a33db9..f0544cbf 100644 --- a/src/main/java/org/eclipsefoundation/git/eca/resource/GithubWebhooksResource.java +++ b/src/main/java/org/eclipsefoundation/git/eca/resource/GithubWebhooksResource.java @@ -27,6 +27,7 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.ServerErrorException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; import org.apache.http.HttpStatus; import org.eclipsefoundation.core.helper.LoggingHelper; @@ -83,16 +84,22 @@ public class GithubWebhooksResource extends GithubAdjacentResource { return Response.ok().build(); } + // check that the pull request isn't somehow missing + if (request.getPullRequest() == null) { + throw new BadRequestException("Pull request event submitted, but pull request information was missing"); + } + PullRequest pr = request.getPullRequest(); + // track the request before we start processing GithubWebhookTracking tracking = validationHelper .retrieveAndUpdateTrackingInformation(wrapper, request.getInstallation().getId(), request.getRepository().getFullName(), - request.getPullRequest()); + pr); // start processing the request LOGGER.trace("Processing PR event for install {} with delivery ID of {}", request.getInstallation().getId(), deliveryId); try { // prepare for validation process by pre-processing into standard format - ValidationRequest vr = generateRequest(request); + ValidationRequest vr = generateRequest(request, pr); // process the request validationHelper.handleGithubWebhookValidation(request, vr, wrapper); } catch (Exception e) { @@ -160,7 +167,13 @@ public class GithubWebhooksResource extends GithubAdjacentResource { try { // get the tracking class, convert back to a GH webhook request, and validate the request GithubWebhookRequest request = GithubWebhookRequest.buildFromTracking(tracking); - boolean isSuccessful = validationHelper.handleGithubWebhookValidation(request, generateRequest(request), wrapper).getPassed(); + if (request.getPullRequest() == null) { + throw new ServerErrorException("Current validation is in a bad state, pull request information missing", + Status.INTERNAL_SERVER_ERROR); + } + boolean isSuccessful = validationHelper + .handleGithubWebhookValidation(request, generateRequest(request, request.getPullRequest()), wrapper) + .getPassed(); LOGGER.debug("Revalidation for request for '{}#{}' was {}successful.", sanitizedRepoName, prNo, isSuccessful ? "" : " not"); // build the url for pull request page @@ -181,12 +194,13 @@ public class GithubWebhooksResource extends GithubAdjacentResource { * Generate the validation request for the current GH Webhook request. * * @param request the current webhook request for validation + * @param pr null checked pull request from Github * @return the Validation Request body to be used in validating data */ - private ValidationRequest generateRequest(GithubWebhookRequest request) { + private ValidationRequest generateRequest(GithubWebhookRequest request, PullRequest pr) { return validationHelper - .generateRequest(request.getInstallation().getId(), request.getRepository().getFullName(), - request.getPullRequest().getNumber(), request.getRepository().getHtmlUrl()); + .generateRequest(request.getInstallation().getId(), request.getRepository().getFullName(), pr.getNumber(), + request.getRepository().getHtmlUrl()); } } -- GitLab