Skip to content

Commit 9a1ece3

Browse files
committed
Allow ignoring updates by specific users
1 parent 8300e05 commit 9a1ece3

File tree

4 files changed

+28
-6
lines changed

4 files changed

+28
-6
lines changed

src/main/java/org/hibernate/infra/replicate/jira/JiraConfig.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,14 @@ interface UserValueMapping extends ValueMapping {
366366
* {@link #mapping() mapping}.
367367
*/
368368
Optional<String> profileUrl();
369+
370+
/**
371+
* It may be helpful in some cases to ignore webhook events triggered by some
372+
* users. E.g. the sync user that applies updates upstream can be listed here to
373+
* prevent infinite update loop.
374+
*/
375+
@WithDefault("not-a-user")
376+
Set<String> ignoredUpstreamUsers();
369377
}
370378

371379
/**

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import jakarta.ws.rs.Consumes;
1313
import jakarta.ws.rs.POST;
1414
import jakarta.ws.rs.Path;
15+
import jakarta.ws.rs.QueryParam;
1516
import jakarta.ws.rs.core.MediaType;
1617

1718
@Path("/jira/webhooks")
@@ -24,9 +25,9 @@ public class JiraWebHookListenerResource {
2425
@Path("/{project}")
2526
@Consumes(MediaType.APPLICATION_JSON)
2627
public String somethingHappenedUpstream(@RestPath @NotNull @ConfiguredProject String project,
27-
JiraWebHookEvent event) {
28+
@QueryParam("triggeredByUser") String triggeredByUser, JiraWebHookEvent event) {
2829
Log.infof("Received a notification about %s project: %.200s...", project, event);
29-
jiraService.acknowledge(project, event);
30+
jiraService.acknowledge(project, event, triggeredByUser);
3031
return "ack";
3132
}
3233
}

src/main/java/org/hibernate/infra/replicate/jira/service/jira/HandlerProjectContext.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,4 +347,8 @@ private static boolean versionNeedsUpdate(JiraVersion upstreamVersion, JiraVersi
347347
|| upstreamVersion.released != downstreamVersion.released
348348
|| !Objects.equals(upstreamVersion.releaseDate, downstreamVersion.releaseDate);
349349
}
350+
351+
public boolean isUserIgnored(String triggeredByUser) {
352+
return projectGroupContext.projectGroup().users().ignoredUpstreamUsers().contains(triggeredByUser);
353+
}
350354
}

src/main/java/org/hibernate/infra/replicate/jira/service/jira/JiraService.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
@ApplicationScoped
4747
public class JiraService {
4848

49+
private static final String SYSTEM_USER = "94KJcxFzgxZlXyTss4oR0rDNqtjwjhIiZLzYNx0Mwuc=";
50+
4951
private final ReportingConfig reportingConfig;
5052
private final Map<String, HandlerProjectContext> contextPerProject;
5153
private final JiraConfig jiraConfig;
@@ -295,8 +297,10 @@ public void registerManagementRoutes(@Observes ManagementInterface mi) {
295297
* {@link JiraConfig.JiraProjectGroup#projects()}
296298
* @param event
297299
* The body of the event posted by the webhook.
300+
* @param triggeredByUser
301+
* The ID of the Jira user that triggered the webhook event.
298302
*/
299-
public void acknowledge(String project, JiraWebHookEvent event) {
303+
public void acknowledge(String project, JiraWebHookEvent event, String triggeredByUser) {
300304
event.eventType().ifPresentOrElse(eventType -> {
301305
var context = contextPerProject.get(project);
302306
if (context == null) {
@@ -307,6 +311,11 @@ public void acknowledge(String project, JiraWebHookEvent event) {
307311
throw new ConstraintViolationException("Project " + project + " is not configured.", Set.of());
308312
}
309313

314+
if (context.isUserIgnored(triggeredByUser)) {
315+
Log.infof("Event was triggered by %s user that is in the ignore list.", triggeredByUser);
316+
return;
317+
}
318+
310319
for (Runnable handler : eventType.handlers(reportingConfig, event, context)) {
311320
context.submitTask(handler);
312321
}
@@ -379,7 +388,7 @@ private void triggerSyncEvent(JiraIssue jiraIssue, HandlerProjectContext context
379388
event.issue = issue;
380389

381390
String projectKey = Objects.toString(jiraIssue.fields.project.properties().get("key"));
382-
acknowledge(projectKey, event);
391+
acknowledge(projectKey, event, SYSTEM_USER);
383392

384393
// now sync comments:
385394
if (jiraIssue.fields.comment != null && jiraIssue.fields.comment.comments != null) {
@@ -399,7 +408,7 @@ private void triggerSyncEvent(JiraIssue jiraIssue, HandlerProjectContext context
399408
event.issueLink = new JiraWebHookIssueLink();
400409
event.issueLink.id = Long.parseLong(link.id);
401410

402-
acknowledge(projectKey, event);
411+
acknowledge(projectKey, event, SYSTEM_USER);
403412
}
404413
}
405414
}
@@ -411,7 +420,7 @@ private void triggerCommentSyncEvents(String projectKey, JiraWebHookIssue issue,
411420
event.comment.id = Long.parseLong(comment.id);
412421
event.issue = issue;
413422
event.webhookEvent = JiraWebhookEventType.COMMENT_UPDATED.getName();
414-
acknowledge(projectKey, event);
423+
acknowledge(projectKey, event, SYSTEM_USER);
415424
}
416425
}
417426
}

0 commit comments

Comments
 (0)