diff --git a/src/main/java/io/sockudo/rest/Sockudo.java b/src/main/java/io/sockudo/rest/Sockudo.java index af73ae9..a4eef5b 100644 --- a/src/main/java/io/sockudo/rest/Sockudo.java +++ b/src/main/java/io/sockudo/rest/Sockudo.java @@ -4,6 +4,7 @@ import org.apache.http.HttpResponse; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.entity.StringEntity; @@ -168,6 +169,11 @@ protected Result doGet(final URI uri) { return httpCall(new HttpGet(uri)); } + @Override + protected Result doDelete(final URI uri) { + return httpCall(new HttpDelete(uri)); + } + @Override protected Result doPost(final URI uri, final String body) { final StringEntity bodyEntity = new StringEntity(body, "UTF-8"); diff --git a/src/main/java/io/sockudo/rest/SockudoAbstract.java b/src/main/java/io/sockudo/rest/SockudoAbstract.java index c9528eb..04f4e72 100644 --- a/src/main/java/io/sockudo/rest/SockudoAbstract.java +++ b/src/main/java/io/sockudo/rest/SockudoAbstract.java @@ -617,6 +617,45 @@ public T appendMessage(final String channelName, final String messageSerial, fin return post("/channels/" + channelName + "/messages/" + messageSerial + "/append", body); } + /** + * Publish an annotation for a versioned message. + */ + public T publishAnnotation(final String channelName, final String messageSerial, final String body) { + Prerequisites.nonEmpty("channelName", channelName); + Prerequisites.isValidChannel(channelName); + Prerequisites.nonEmpty("messageSerial", messageSerial); + return post("/channels/" + channelName + "/messages/" + messageSerial + "/annotations", body); + } + + /** + * Delete an annotation from a versioned message. + */ + public T deleteAnnotation(final String channelName, final String messageSerial, final String annotationSerial, final Map parameters) { + Prerequisites.nonEmpty("channelName", channelName); + Prerequisites.isValidChannel(channelName); + Prerequisites.nonEmpty("messageSerial", messageSerial); + Prerequisites.nonEmpty("annotationSerial", annotationSerial); + return delete("/channels/" + channelName + "/messages/" + messageSerial + "/annotations/" + annotationSerial, parameters); + } + + public T deleteAnnotation(final String channelName, final String messageSerial, final String annotationSerial) { + return deleteAnnotation(channelName, messageSerial, annotationSerial, Collections.emptyMap()); + } + + /** + * List raw annotation events for a versioned message. + */ + public T listAnnotations(final String channelName, final String messageSerial, final Map parameters) { + Prerequisites.nonEmpty("channelName", channelName); + Prerequisites.isValidChannel(channelName); + Prerequisites.nonEmpty("messageSerial", messageSerial); + return get("/channels/" + channelName + "/messages/" + messageSerial + "/annotations", parameters); + } + + public T listAnnotations(final String channelName, final String messageSerial) { + return listAnnotations(channelName, messageSerial, Collections.emptyMap()); + } + /** * Fetch presence history for a specific presence channel. * @@ -666,6 +705,15 @@ public T getChannelPresenceSnapshot(final String channelName) { protected abstract T doGet(final URI uri); + public T delete(final String path, final Map parameters) { + final String fullPath = "/apps/" + appId + path; + final URI uri = SignatureUtil.uri("DELETE", scheme, host, fullPath, null, key, secret, parameters); + + return doDelete(uri); + } + + protected abstract T doDelete(final URI uri); + /** * Make a generic HTTP call to the Sockudo API. *

diff --git a/src/main/java/io/sockudo/rest/SockudoAsync.java b/src/main/java/io/sockudo/rest/SockudoAsync.java index ed89428..0dadae7 100644 --- a/src/main/java/io/sockudo/rest/SockudoAsync.java +++ b/src/main/java/io/sockudo/rest/SockudoAsync.java @@ -139,6 +139,15 @@ protected CompletableFuture doGet(final URI uri) { return httpCall(request); } + @Override + protected CompletableFuture doDelete(final URI uri) { + final Request request = new RequestBuilder(HttpConstants.Methods.DELETE) + .setUrl(uri.toString()) + .build(); + + return httpCall(request); + } + @Override protected CompletableFuture doPost(final URI uri, final String body) { final Request request = new RequestBuilder(HttpConstants.Methods.POST) diff --git a/src/test/java/io/sockudo/rest/util/SockudoNoHttp.java b/src/test/java/io/sockudo/rest/util/SockudoNoHttp.java index e015763..853f71e 100644 --- a/src/test/java/io/sockudo/rest/util/SockudoNoHttp.java +++ b/src/test/java/io/sockudo/rest/util/SockudoNoHttp.java @@ -19,6 +19,11 @@ protected Object doGet(final URI uri) { throw new IllegalStateException("Shouldn't have been called, HTTP level not implemented"); } + @Override + protected Object doDelete(final URI uri) { + throw new IllegalStateException("Shouldn't have been called, HTTP level not implemented"); + } + @Override protected Object doPost(final URI uri, final String body) { throw new IllegalStateException("Shouldn't have been called, HTTP level not implemented");