Skip to content

Commit 7fda3a3

Browse files
committed
Allow ignoring updates by specific users
1 parent 8ba5712 commit 7fda3a3

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;
@@ -297,8 +299,10 @@ public void registerManagementRoutes(@Observes ManagementInterface mi) {
297299
* {@link JiraConfig.JiraProjectGroup#projects()}
298300
* @param event
299301
* The body of the event posted by the webhook.
302+
* @param triggeredByUser
303+
* The ID of the Jira user that triggered the webhook event.
300304
*/
301-
public void acknowledge(String project, JiraWebHookEvent event) {
305+
public void acknowledge(String project, JiraWebHookEvent event, String triggeredByUser) {
302306
event.eventType().ifPresentOrElse(eventType -> {
303307
var context = contextPerProject.get(project);
304308
if (context == null) {
@@ -309,6 +313,11 @@ public void acknowledge(String project, JiraWebHookEvent event) {
309313
throw new ConstraintViolationException("Project " + project + " is not configured.", Set.of());
310314
}
311315

316+
if (context.isUserIgnored(triggeredByUser)) {
317+
Log.infof("Event was triggered by %s user that is in the ignore list.", triggeredByUser);
318+
return;
319+
}
320+
312321
for (Runnable handler : eventType.handlers(reportingConfig, event, context)) {
313322
context.submitTask(handler);
314323
}
@@ -381,7 +390,7 @@ private void triggerSyncEvent(JiraIssue jiraIssue, HandlerProjectContext context
381390
event.issue = issue;
382391

383392
String projectKey = Objects.toString(jiraIssue.fields.project.properties().get("key"));
384-
acknowledge(projectKey, event);
393+
acknowledge(projectKey, event, SYSTEM_USER);
385394

386395
// now sync comments:
387396
if (jiraIssue.fields.comment != null && jiraIssue.fields.comment.comments != null) {
@@ -401,7 +410,7 @@ private void triggerSyncEvent(JiraIssue jiraIssue, HandlerProjectContext context
401410
event.issueLink = new JiraWebHookIssueLink();
402411
event.issueLink.id = Long.parseLong(link.id);
403412

404-
acknowledge(projectKey, event);
413+
acknowledge(projectKey, event, SYSTEM_USER);
405414
}
406415
}
407416
}
@@ -413,7 +422,7 @@ private void triggerCommentSyncEvents(String projectKey, JiraWebHookIssue issue,
413422
event.comment.id = Long.parseLong(comment.id);
414423
event.issue = issue;
415424
event.webhookEvent = JiraWebhookEventType.COMMENT_UPDATED.getName();
416-
acknowledge(projectKey, event);
425+
acknowledge(projectKey, event, SYSTEM_USER);
417426
}
418427
}
419428
}

0 commit comments

Comments
 (0)