Skip to content

Commit 8300e05

Browse files
committed
Enable project key validation
1 parent 99bb1a8 commit 8300e05

File tree

5 files changed

+55
-17
lines changed

5 files changed

+55
-17
lines changed

src/main/java/org/hibernate/infra/replicate/jira/resource/JiraWebHookListenerResource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.hibernate.infra.replicate.jira.service.jira.JiraService;
44
import org.hibernate.infra.replicate.jira.service.jira.model.hook.JiraWebHookEvent;
5+
import org.hibernate.infra.replicate.jira.service.validation.ConfiguredProject;
56

67
import org.jboss.resteasy.reactive.RestPath;
78

@@ -22,7 +23,7 @@ public class JiraWebHookListenerResource {
2223
@POST
2324
@Path("/{project}")
2425
@Consumes(MediaType.APPLICATION_JSON)
25-
public String somethingHappened(@RestPath @NotNull /* @ConfiguredProject */ String project,
26+
public String somethingHappenedUpstream(@RestPath @NotNull @ConfiguredProject String project,
2627
JiraWebHookEvent event) {
2728
Log.infof("Received a notification about %s project: %.200s...", project, event);
2829
jiraService.acknowledge(project, event);

src/main/java/org/hibernate/infra/replicate/jira/service/validation/ConfiguredProject.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
2121
@Retention(RUNTIME)
2222
public @interface ConfiguredProject {
23-
String message() default "The {project} project is not configured";
23+
String message() default "The ${project} project is not configured";
24+
25+
boolean upstream() default true;
2426

2527
Class<?>[] groups() default {};
2628

src/main/java/org/hibernate/infra/replicate/jira/service/validation/ConfiguredProjectValidator.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,31 @@
11
package org.hibernate.infra.replicate.jira.service.validation;
22

3-
import java.util.Locale;
4-
import java.util.Set;
5-
6-
import org.hibernate.infra.replicate.jira.JiraConfig;
73
import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext;
84

5+
import jakarta.enterprise.inject.Instance;
6+
import jakarta.inject.Inject;
97
import jakarta.validation.ConstraintValidator;
108
import jakarta.validation.ConstraintValidatorContext;
119

12-
// @ApplicationScoped
1310
public class ConfiguredProjectValidator implements ConstraintValidator<ConfiguredProject, String> {
1411

15-
private final Set<String> projects;
12+
@Inject
13+
Instance<ConfiguredProjectsService> configuredProjectsService;
14+
private boolean upstream;
1615

17-
// @Inject
18-
public ConfiguredProjectValidator() {
19-
JiraConfig jiraConfig = null;
20-
projects = Set.of();
21-
// jiraConfig.projects().keySet().stream().map( s -> s.toLowerCase( Locale.ROOT
22-
// ) ).collect( Collectors.toSet() );
16+
@Override
17+
public void initialize(ConfiguredProject constraintAnnotation) {
18+
upstream = constraintAnnotation.upstream();
2319
}
2420

2521
@Override
2622
public boolean isValid(String value, ConstraintValidatorContext context) {
2723
if (value == null) {
2824
return true;
2925
}
30-
if (projects.contains(value.toLowerCase(Locale.ROOT))) {
26+
if (upstream
27+
? configuredProjectsService.get().isUpstreamProject(value)
28+
: configuredProjectsService.get().isDownstreamProject(value)) {
3129
return true;
3230
}
3331

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.hibernate.infra.replicate.jira.service.validation;
2+
3+
import java.util.Collections;
4+
import java.util.HashSet;
5+
import java.util.Set;
6+
7+
import org.hibernate.infra.replicate.jira.JiraConfig;
8+
9+
import jakarta.enterprise.context.ApplicationScoped;
10+
11+
@ApplicationScoped
12+
public class ConfiguredProjectsService {
13+
14+
private final Set<String> upstreamProjects;
15+
private final Set<String> downstreamProjects;
16+
17+
public ConfiguredProjectsService(JiraConfig jiraConfig) {
18+
Set<String> down = new HashSet<>();
19+
Set<String> up = new HashSet<>();
20+
for (JiraConfig.JiraProjectGroup group : jiraConfig.projectGroup().values()) {
21+
for (JiraConfig.JiraProject project : group.projects().values()) {
22+
up.add(project.originalProjectKey());
23+
down.add(project.projectKey());
24+
}
25+
}
26+
27+
upstreamProjects = Collections.unmodifiableSet(up);
28+
downstreamProjects = Collections.unmodifiableSet(down);
29+
}
30+
31+
public boolean isUpstreamProject(String projectName) {
32+
return upstreamProjects.contains(projectName);
33+
}
34+
35+
public boolean isDownstreamProject(String projectName) {
36+
return downstreamProjects.contains(projectName);
37+
}
38+
}

src/test/java/org/hibernate/infra/replicate/jira/SimpleProjectHookTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ class SimpleProjectHookTest {
3434
@Test
3535
void unknown() {
3636
given().when().body(REQUEST_BODY).contentType(ContentType.JSON).post("api/jira/webhooks/NOTAPROJECTKEY").then()
37-
.statusCode(500).body(containsString(
38-
"Unable to determine handler context for project NOTAPROJECTKEY. Was it not configured"));
37+
.statusCode(400).body(containsString("The NOTAPROJECTKEY project is not configured"));
3938
}
4039

4140
@Test

0 commit comments

Comments
 (0)