Skip to content
Snippets Groups Projects
Commit 7ea8345a authored by Martin Lowe's avatar Martin Lowe :flag_ca:
Browse files

Iss #98 - Initial commit of Github webhooks code

Additionally contains code to move API client models to a separate
package to allow for application specific models to live separately from
consumed upstream models.
parent 6d9df112
No related branches found
No related tags found
1 merge request!111Iss #98 - Initial commit of Github webhooks code
Showing
with 602 additions and 41 deletions
......@@ -41,6 +41,7 @@ release.properties
secret/
secrets/
secret.properties
*.pem
# Additional build resources
src/test/resources/schemas
......
......@@ -65,6 +65,10 @@
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-context-propagation</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client</artifactId>
......
/**
* Copyright (c) 2022 Eclipse Foundation
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Author: Martin Lowe <martin.lowe@eclipse-foundation.org>
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipsefoundation.git.eca.api;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import org.eclipsefoundation.git.eca.api.models.GithubAccessToken;
import org.eclipsefoundation.git.eca.api.models.GithubCommitStatusRequest;
/**
* @author martin
*
*/
@RegisterRestClient(baseUri = "https://api.github.com")
@Produces("application/json")
public interface GithubAPI {
@GET
@Path("repos/{repoFull}/pulls/{pullNumber}/commits")
public Response getCommits(@PathParam("repoFull") String repoFull, @PathParam("pullNumber") int pullNumber);
@POST
@Path("repos/{repoFull}/statuses/{prHeadSha}")
public Response updateStatus(@HeaderParam("Authorization") String bearer, @PathParam("repoFull") String repoFull,
@PathParam("prHeadSha") String prHeadSha, GithubCommitStatusRequest commitStatusUpdate);
@POST
@Path("app/installations/{installationId}/access_tokens")
public GithubAccessToken getNewAccessToken(@HeaderParam("Authorization") String bearer, @PathParam("installationId") String installationId);
}
/**
* Copyright (c) 2022 Eclipse Foundation
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Author: Martin Lowe <martin.lowe@eclipse-foundation.org>
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipsefoundation.git.eca.api.models;
import java.time.LocalDateTime;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.google.auto.value.AutoValue;
/**
* @author martin
*
*/
@AutoValue
@JsonDeserialize(builder = AutoValue_GithubAccessToken.Builder.class)
public abstract class GithubAccessToken {
public abstract String getToken();
public abstract LocalDateTime getExpiresAt();
public static Builder builder() {
return new AutoValue_GithubAccessToken.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setToken(String token);
public abstract Builder setExpiresAt(LocalDateTime expiresAt);
public abstract GithubAccessToken build();
}
}
/**
* Copyright (c) 2022 Eclipse Foundation
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Author: Martin Lowe <martin.lowe@eclipse-foundation.org>
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipsefoundation.git.eca.api.models;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.google.auto.value.AutoValue;
/**
* @author Martin Lowe
*
*/
@AutoValue
@JsonDeserialize(builder = AutoValue_GithubCommit.Builder.class)
public abstract class GithubCommit {
public abstract String getSha();
public abstract CommitData getCommit();
public static Builder builder() {
return new AutoValue_GithubCommit.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setSha(String sha);
public abstract Builder setCommit(CommitData commit);
public abstract GithubCommit build();
}
@AutoValue
@JsonDeserialize(builder = AutoValue_GithubCommit_CommitData.Builder.class)
public abstract static class CommitData {
public abstract CommitUser getAuthor();
public abstract CommitUser getCommitter();
public static Builder builder() {
return new AutoValue_GithubCommit_CommitData.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setAuthor(CommitUser author);
public abstract Builder setCommitter(CommitUser committer);
public abstract CommitData build();
}
}
@AutoValue
@JsonDeserialize(builder = AutoValue_GithubCommit_CommitUser.Builder.class)
public abstract static class CommitUser {
public abstract String getName();
public abstract String getEmail();
public static Builder builder() {
return new AutoValue_GithubCommit_CommitUser.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setName(String name);
public abstract Builder setEmail(String email);
public abstract CommitUser build();
}
}
}
/**
* Copyright (c) 2022 Eclipse Foundation
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Author: Martin Lowe <martin.lowe@eclipse-foundation.org>
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipsefoundation.git.eca.api.models;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.google.auto.value.AutoValue;
/**
* @author martin
*
*/
@AutoValue
@JsonDeserialize(builder = AutoValue_GithubCommitStatusRequest.Builder.class)
public abstract class GithubCommitStatusRequest {
public abstract String getState();
public abstract String getTargetUrl();
public abstract String getDescription();
public abstract String getContext();
public static Builder builder() {
return new AutoValue_GithubCommitStatusRequest.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setState(String state);
public abstract Builder setTargetUrl(String targetUrl);
public abstract Builder setDescription(String description);
public abstract Builder setContext(String context);
public abstract GithubCommitStatusRequest build();
}
}
/**
* Copyright (c) 2022 Eclipse Foundation
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Author: Martin Lowe <martin.lowe@eclipse-foundation.org>
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipsefoundation.git.eca.api.models;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.google.auto.value.AutoValue;
/**
* Represents incoming webhook requests from the Git ECA app installations on Github.
*
* @author Martin Lowe
*
*/
@AutoValue
@JsonDeserialize(builder = AutoValue_GithubWebhookRequest.Builder.class)
public abstract class GithubWebhookRequest {
public abstract String getAction();
public abstract Installation getInstallation();
public abstract Repository getRepository();
public abstract PullRequest getPullRequest();
public static Builder builder() {
return new AutoValue_GithubWebhookRequest.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setAction(String action);
public abstract Builder setInstallation(Installation installation);
public abstract Builder setRepository(Repository repository);
public abstract Builder setPullRequest(PullRequest pullRequest);
public abstract GithubWebhookRequest build();
}
@AutoValue
@JsonDeserialize(builder = AutoValue_GithubWebhookRequest_Repository.Builder.class)
public abstract static class Repository {
public abstract String getFullName();
public abstract String getHtmlUrl();
public static Builder builder() {
return new AutoValue_GithubWebhookRequest_Repository.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setFullName(String fullName);
public abstract Builder setHtmlUrl(String htmlUrl);
public abstract Repository build();
}
}
@AutoValue
@JsonDeserialize(builder = AutoValue_GithubWebhookRequest_PullRequest.Builder.class)
public abstract static class PullRequest {
public abstract Integer getNumber();
public abstract PullRequestHead getHead();
public static Builder builder() {
return new AutoValue_GithubWebhookRequest_PullRequest.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setNumber(Integer number);
public abstract Builder setHead(PullRequestHead head);
public abstract PullRequest build();
}
}
@AutoValue
@JsonDeserialize(builder = AutoValue_GithubWebhookRequest_PullRequestHead.Builder.class)
public abstract static class PullRequestHead {
public abstract String getSha();
public static Builder builder() {
return new AutoValue_GithubWebhookRequest_PullRequestHead.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setSha(String sha);
public abstract PullRequestHead build();
}
}
@AutoValue
@JsonDeserialize(builder = AutoValue_GithubWebhookRequest_Installation.Builder.class)
public abstract static class Installation {
public abstract String getId();
public abstract String getWebhookId();
public static Builder builder() {
return new AutoValue_GithubWebhookRequest_Installation.Builder();
}
@AutoValue.Builder
@JsonPOJOBuilder(withPrefix = "set")
public abstract static class Builder {
public abstract Builder setId(String id);
public abstract Builder setWebhookId(String webhookId);
public abstract Installation build();
}
}
}
package org.eclipsefoundation.git.eca.model;
package org.eclipsefoundation.git.eca.api.models;
import java.util.List;
import org.eclipsefoundation.git.eca.model.Project.GitlabProject;
import org.eclipsefoundation.git.eca.model.Project.User;
import org.eclipsefoundation.git.eca.api.models.Project.GitlabProject;
import org.eclipsefoundation.git.eca.api.models.Project.User;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
......
......@@ -9,7 +9,7 @@
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipsefoundation.git.eca.model;
package org.eclipsefoundation.git.eca.api.models;
import java.util.ArrayList;
import java.util.List;
......
......@@ -9,7 +9,7 @@
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipsefoundation.git.eca.model;
package org.eclipsefoundation.git.eca.api.models;
import java.time.ZonedDateTime;
import java.util.List;
......
......@@ -16,8 +16,8 @@ import java.util.stream.Collectors;
import javax.ws.rs.core.MultivaluedMap;
import org.eclipsefoundation.git.eca.api.models.Project;
import org.eclipsefoundation.git.eca.model.Commit;
import org.eclipsefoundation.git.eca.model.Project;
import org.eclipsefoundation.git.eca.model.ValidationRequest;
import org.eclipsefoundation.git.eca.namespace.GitEcaParameterNames;
import org.jboss.resteasy.specimpl.MultivaluedMapImpl;
......
/**
* Copyright (c) 2022 Eclipse Foundation
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Author: Martin Lowe <martin.lowe@eclipse-foundation.org>
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipsefoundation.git.eca.namespace;
/**
* @author martin
*
*/
public enum GithubCommitStatuses {
SUCCESS("The author(s) of the pull request is covered by necessary legal agreements in order to proceed!"),
FAILURE("An unexpected error has occurred. Please contact webmaster@eclipse.org."),
ERROR("The author(s) of the pull request is not covered by necessary legal agreements in order to proceed."),
PENDING("Eclipse Foundation Contributor Agreement validation is in progress.");
private String message;
private GithubCommitStatuses(String message) {
this.message = message;
}
public String getMessage() {
return this.message;
}
@Override
public String toString() {
return this.name().toLowerCase();
}
}
/**
* Copyright (c) 2022 Eclipse Foundation
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Author: Martin Lowe <martin.lowe@eclipse-foundation.org>
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipsefoundation.git.eca.resource;
import java.net.URI;
import java.time.Duration;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.eclipsefoundation.core.model.RequestWrapper;
import org.eclipsefoundation.core.service.APIMiddleware;
import org.eclipsefoundation.git.eca.api.GithubAPI;
import org.eclipsefoundation.git.eca.api.models.GithubAccessToken;
import org.eclipsefoundation.git.eca.api.models.GithubCommit;
import org.eclipsefoundation.git.eca.api.models.GithubCommitStatusRequest;
import org.eclipsefoundation.git.eca.api.models.GithubWebhookRequest;
import org.eclipsefoundation.git.eca.model.Commit;
import org.eclipsefoundation.git.eca.model.GitUser;
import org.eclipsefoundation.git.eca.model.ValidationRequest;
import org.eclipsefoundation.git.eca.namespace.GithubCommitStatuses;
import org.eclipsefoundation.git.eca.namespace.ProviderType;
import org.eclipsefoundation.git.eca.service.ValidationService;
import org.jboss.resteasy.annotations.jaxrs.HeaderParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.quarkus.cache.CacheResult;
import io.smallrye.jwt.algorithm.SignatureAlgorithm;
import io.smallrye.jwt.auth.principal.JWTParser;
import io.smallrye.jwt.auth.principal.ParseException;
import io.smallrye.jwt.build.Jwt;
/**
* @author martin
*
*/
@Path("webhooks/github")
public class GithubWebhooksResource {
private static final Logger LOGGER = LoggerFactory.getLogger(GithubWebhooksResource.class);
@ConfigProperty(name = "eclipse.webhooks.github.secret")
String secret;
@ConfigProperty(name = "eclipse.webhooks.github.context")
String context;
@Inject
RequestWrapper wrapper;
@Inject
APIMiddleware middleware;
@Inject
ValidationService validationService;
@Inject
JWTParser parser;
@RestClient
GithubAPI ghApi;
@GET
@Path("jwt/{installationId}")
public Response test(@PathParam("installationId") String installId) throws ParseException {
return Response.ok(parser.verify(generateJwt(), secret)).build();
}
@POST
@Path("check")
public Response processGithubCheck(@HeaderParam("X-GitHub-Delivery") String deliveryId, @HeaderParam("X-GitHub-Event") String eventType,
GithubWebhookRequest request) {
// If event isn't a pr event, drop as we don't process them
if (!"pull_request".equalsIgnoreCase(eventType)) {
return Response.ok().build();
}
// start validation process
ValidationRequest vr = generateRequest(request);
String fingerprint = validationService.generateRequestHash(vr);
updateCommitStatus(request, GithubCommitStatuses.PENDING, fingerprint);
LOGGER.debug("Would have validated: {}", vr);
// TODO once validation move update done, use vr above to validate
boolean hasPassed = true;
if (hasPassed) {
updateCommitStatus(request, GithubCommitStatuses.SUCCESS, fingerprint);
} else {
updateCommitStatus(request, GithubCommitStatuses.FAILURE, fingerprint);
}
return Response.ok().build();
}
/**
* Sends off a POST to update the commit status given a context for the current PR.
*
* @param request the current webhook update request
* @param state the state to set the status to
* @param fingerprint
*/
private void updateCommitStatus(GithubWebhookRequest request, GithubCommitStatuses state, String fingerprint) {
ghApi
.updateStatus("Bearer " + getAccessToken(request.getInstallation().getId()), request.getRepository().getFullName(),
request.getPullRequest().getHead().getSha(),
GithubCommitStatusRequest
.builder()
.setDescription(state.getMessage())
.setState(state.toString())
.setTargetUrl("https://api.eclipse.org/git/eca/status/" + fingerprint + "/ui")
.setContext(context)
.build());
}
/**
* Generate the validation request for the current GH Webhook request.
*
* @param request the current webhook request for validation
* @return the Validation Request body to be used in validating data
*/
private ValidationRequest generateRequest(GithubWebhookRequest request) {
// get the commits that will be validated, don't cache as changes can come in too fast for it to be useful
List<GithubCommit> commits = middleware
.getAll(i -> ghApi.getCommits(request.getRepository().getFullName(), request.getPullRequest().getNumber()),
GithubCommit.class);
LOGGER
.trace("Retrieved {} commits for PR {} in repo {}", commits.size(), request.getPullRequest().getNumber(),
request.getRepository().getHtmlUrl());
// set up the validation request from current data
return ValidationRequest
.builder()
.setProvider(ProviderType.GITHUB)
.setRepoUrl(URI.create(request.getRepository().getHtmlUrl()))
.setCommits(commits
.stream()
.map(c -> Commit
.builder()
.setHash(c.getSha())
.setAuthor(GitUser
.builder()
.setMail(c.getCommit().getAuthor().getEmail())
.setName(c.getCommit().getAuthor().getName())
.build())
.setCommitter(GitUser
.builder()
.setMail(c.getCommit().getCommitter().getEmail())
.setName(c.getCommit().getCommitter().getName())
.build())
.build())
.collect(Collectors.toList()))
.build();
}
@CacheResult(cacheName = "accesstoken")
protected GithubAccessToken getAccessToken(String installationId) {
return ghApi.getNewAccessToken("Bearer " + generateJwt(), installationId);
}
/**
* Generate the JWT to use for Github requests. This is stored in a special one-shot cache method secured to this class,
* and not to be used for other requests that require JWTs.
*
* @return signed JWT using the issuer and secret defined in the secret properties.
*/
private String generateJwt() {
return Jwt.subject("EclipseWebmaster").signWithSecret(secret);
}
}
......@@ -30,9 +30,12 @@ import javax.ws.rs.core.Response;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.eclipsefoundation.core.model.RequestWrapper;
import org.eclipsefoundation.core.service.CachingService;
import org.eclipsefoundation.git.eca.api.models.EclipseUser;
import org.eclipsefoundation.git.eca.api.models.Project;
import org.eclipsefoundation.git.eca.dto.CommitValidationStatus;
import org.eclipsefoundation.git.eca.model.Project;
import org.eclipsefoundation.git.eca.helper.CommitHelper;
import org.eclipsefoundation.git.eca.model.Commit;
import org.eclipsefoundation.git.eca.model.EclipseUser;
import org.eclipsefoundation.git.eca.model.GitUser;
import org.eclipsefoundation.git.eca.model.ValidationRequest;
import org.eclipsefoundation.git.eca.model.ValidationResponse;
import org.eclipsefoundation.git.eca.namespace.APIStatusCode;
......
......@@ -17,7 +17,7 @@ import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import org.eclipsefoundation.core.model.RequestWrapper;
import org.eclipsefoundation.git.eca.model.SystemHook;
import org.eclipsefoundation.git.eca.api.models.SystemHook;
import org.eclipsefoundation.git.eca.namespace.EventType;
import org.eclipsefoundation.git.eca.service.SystemHookService;
import org.jboss.resteasy.annotations.jaxrs.HeaderParam;
......@@ -27,14 +27,12 @@ import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@Path("/webhooks")
@Path("webhooks/gitlab")
public class WebhooksResource {
private static final Logger LOGGER = LoggerFactory.getLogger(WebhooksResource.class);
@Inject
RequestWrapper wrapper;
@Inject
SystemHookService hookService;
......@@ -42,30 +40,26 @@ public class WebhooksResource {
ObjectMapper om;
@POST
@Path("/gitlab/system")
@Path("system")
public Response processGitlabHook(@HeaderParam("X-Gitlab-Event") String eventHeader, String jsonBody) {
// Do not process if header is incorrect
if (!hasValidHeader(eventHeader)) {
if (!"system hook".equalsIgnoreCase(eventHeader)) {
return Response.ok().build();
}
// based on event name in body, process the event hook
String eventName = readEventName(jsonBody);
EventType type = EventType.getType(eventName);
switch (type) {
case PROJECT_CREATE:
hookService.processProjectCreateHook(wrapper, convertRequestToHook(jsonBody));
break;
case PROJECT_DESTROY:
hookService.processProjectDeleteHook(wrapper, convertRequestToHook(jsonBody));
break;
case PROJECT_RENAME:
hookService.processProjectRenameHook(wrapper, convertRequestToHook(jsonBody));
break;
case UNSUPPORTED:
default:
LOGGER.trace("Dropped event: {}", eventName);
......@@ -76,8 +70,8 @@ public class WebhooksResource {
}
/**
* Processes the json body contents and converts them to a SystemHook object.
* Returns null if the json body couldn't be processed.
* Processes the json body contents and converts them to a SystemHook object. Returns null if the json body couldn't be
* processed.
*
* @param jsonBody the json body as a string
* @return A SystemHook object converted from a json string
......@@ -92,9 +86,8 @@ public class WebhooksResource {
}
/**
* Processes the json body contents and returns the event_name field. Returns
* null if the was a processing error or if the event_name field is
* null/missing.
* Processes the json body contents and returns the event_name field. Returns null if the was a processing error or if
* the event_name field is null/missing.
*
* @param jsonBody the json body as a String
* @return the event_name field
......@@ -107,14 +100,4 @@ public class WebhooksResource {
return null;
}
}
/**
* Validates that the hook header contains the required value
*
* @param eventHeader the event header value
* @return true if valid, false if not
*/
private boolean hasValidHeader(String eventHeader) {
return eventHeader != null && eventHeader.equalsIgnoreCase("system hook");
}
}
......@@ -2,8 +2,8 @@ package org.eclipsefoundation.git.eca.service;
import java.util.List;
import org.eclipsefoundation.git.eca.model.InterestGroupData;
import org.eclipsefoundation.git.eca.model.Project;
import org.eclipsefoundation.git.eca.api.models.InterestGroupData;
import org.eclipsefoundation.git.eca.api.models.Project;
/**
* Service for retrieving and interacting with interest groups.
......
......@@ -13,7 +13,7 @@ package org.eclipsefoundation.git.eca.service;
import java.util.List;
import org.eclipsefoundation.git.eca.model.Project;
import org.eclipsefoundation.git.eca.api.models.Project;
import org.eclipsefoundation.git.eca.model.ValidationRequest;
import org.eclipsefoundation.git.eca.namespace.ProviderType;
......
......@@ -12,7 +12,7 @@
package org.eclipsefoundation.git.eca.service;
import org.eclipsefoundation.core.model.RequestWrapper;
import org.eclipsefoundation.git.eca.model.SystemHook;
import org.eclipsefoundation.git.eca.api.models.SystemHook;
/**
* Processes the various system hooks received.
......
......@@ -13,8 +13,8 @@ package org.eclipsefoundation.git.eca.service;
import java.util.List;
import org.eclipsefoundation.git.eca.api.models.EclipseUser;
import org.eclipsefoundation.git.eca.model.Project;
import org.eclipsefoundation.git.eca.api.models.Project;
import org.eclipsefoundation.git.eca.model.EclipseUser;
public interface UserService {
......
......@@ -16,8 +16,8 @@ import java.security.NoSuchAlgorithmException;
import java.util.List;
import org.eclipsefoundation.core.model.RequestWrapper;
import org.eclipsefoundation.git.eca.api.models.Project;
import org.eclipsefoundation.git.eca.dto.CommitValidationStatus;
import org.eclipsefoundation.git.eca.model.Project;
import org.eclipsefoundation.git.eca.model.ValidationRequest;
import org.eclipsefoundation.git.eca.model.ValidationResponse;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment