Skip to content

Commit

Permalink
Add events webhook (#500)
Browse files Browse the repository at this point in the history
  • Loading branch information
olevitt authored Sep 27, 2024
1 parent f6bf7d7 commit 2610ee3
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 3 deletions.
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,13 @@ Configurable properties :
| `http.proxyPassword` | | Password if the proxy requires authentication |

### Events
| Key | Default | Description |
| --------------------- |---------|----------------------------------------|
| `event.logging.enabled` | `true` | whether events should be logged or not |
| Key | Default | Description |
|--------------------------|--|--------------------------------------------------------------------|
| `event.logging.enabled` | `true` | whether events should be logged or not |
| `event.webhook.enabled` | `false` | whether events should be sent to an external webhook via HTTP POST |
| `event.webhook.url` | | URL of the webhook to send the events to |
| `event.webhook.includes` | | List of events types to send the webhook for (empty = all events). e.g `service.uninstall,service.install` |
| `event.webhook.excludes` | | List of events types to ignore for the webhook. e.g `service.uninstall,service.install` |

### Other configurations
| Key | Default | Description |
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package fr.insee.onyxia.api.events;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component;

@EnableAsync
@Component
@ConditionalOnProperty(name = "event.webhook.enabled", havingValue = "true")
public class WebhookEventListener {

private final ObjectMapper objectMapper;

private static final MediaType JSON = MediaType.get("application/json");

private static final Logger LOGGER = LoggerFactory.getLogger(WebhookEventListener.class);

@Value("${event.webhook.url}")
private String url;

@Value("${event.webhook.includes}")
private List<String> includes = new ArrayList<>();

@Value("${event.webhook.excludes}")
private List<String> excludes = new ArrayList<>();

private final OkHttpClient httpClient;

@Autowired
public WebhookEventListener(ObjectMapper objectMapper, OkHttpClient okHttpClient) {
this.objectMapper = objectMapper;
this.httpClient = okHttpClient;
}

@Async
@EventListener
public void onOnyxiaEvent(OnyxiaEvent onyxiaEvent) throws JsonProcessingException {
if (!includes.isEmpty() && !includes.contains(onyxiaEvent.getType())) {
return;
}
if (!excludes.isEmpty() && excludes.contains(onyxiaEvent.getType())) {
return;
}
RequestBody body = RequestBody.create(objectMapper.writeValueAsString(onyxiaEvent), JSON);
Request request = new Request.Builder().url(url).post(body).build();
try {
httpClient.newCall(request).execute();
} catch (IOException e) {
LOGGER.warn("Failure while sending event to webhook, will not be retried", e);
}
}

public ObjectMapper getObjectMapper() {
return objectMapper;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public List<String> getIncludes() {
return includes;
}

public void setIncludes(List<String> includes) {
this.includes = includes;
}

public List<String> getExcludes() {
return excludes;
}

public void setExcludes(List<String> excludes) {
this.excludes = excludes;
}

public OkHttpClient getHttpClient() {
return httpClient;
}
}
8 changes: 8 additions & 0 deletions onyxia-api/src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,13 @@ springdoc.swagger-ui.oauth.clientId=
springdoc.swagger-ui.oauth.clientSecret=
# Enable events logging
event.logging.enabled=true
# Enable events webhook
event.webhook.enabled=false
# URL to send the events to
event.webhook.url=
# List of events types to send the webhook for (empty = all events). e.g service.uninstall,service.install
event.webhook.includes=
# List of events types to ignore for the webhook. e.g service.uninstall,service.install
event.webhook.excludes=
# Response stream configuration
spring.mvc.async.request-timeout=600000

0 comments on commit 2610ee3

Please sign in to comment.