diff --git a/src/main/java/com/meilisearch/sdk/Client.java b/src/main/java/com/meilisearch/sdk/Client.java index 1ca76f31..2cca9c23 100644 --- a/src/main/java/com/meilisearch/sdk/Client.java +++ b/src/main/java/com/meilisearch/sdk/Client.java @@ -7,6 +7,8 @@ import com.auth0.jwt.algorithms.Algorithm; import com.meilisearch.sdk.exceptions.MeilisearchException; import com.meilisearch.sdk.json.JsonHandler; +import com.meilisearch.sdk.model.CancelTasksQuery; +import com.meilisearch.sdk.model.DeleteTasksQuery; import com.meilisearch.sdk.model.IndexesQuery; import com.meilisearch.sdk.model.Key; import com.meilisearch.sdk.model.KeyUpdate; @@ -253,6 +255,30 @@ public TasksResults getTasks(TasksQuery param) throws MeilisearchException { return this.tasksHandler.getTasks(param); } + /** + * Cancel any number of enqueued or processing tasks + * https://docs.meilisearch.com/reference/api/tasks.html#cancel-tasks + * + * @param param accept by the tasks route + * @return Meilisearch API response as TaskInfo + * @throws MeilisearchException if an error occurs + */ + public TaskInfo cancelTasks(CancelTasksQuery param) throws MeilisearchException { + return this.tasksHandler.cancelTasks(param); + } + + /** + * Delete a finished (succeeded, failed, or canceled) task + * https://docs.meilisearch.com/reference/api/tasks.html#delete-tasks + * + * @param param accept by the tasks route + * @return Meilisearch API response as TaskInfo + * @throws MeilisearchException if an error occurs + */ + public TaskInfo deleteTasks(DeleteTasksQuery param) throws MeilisearchException { + return this.tasksHandler.deleteTasks(param); + } + /** * Waits for a task to be processed * diff --git a/src/main/java/com/meilisearch/sdk/TasksHandler.java b/src/main/java/com/meilisearch/sdk/TasksHandler.java index 637aaf10..c3105bd9 100644 --- a/src/main/java/com/meilisearch/sdk/TasksHandler.java +++ b/src/main/java/com/meilisearch/sdk/TasksHandler.java @@ -3,7 +3,10 @@ import com.meilisearch.sdk.exceptions.MeilisearchException; import com.meilisearch.sdk.exceptions.MeilisearchTimeoutException; import com.meilisearch.sdk.http.URLBuilder; +import com.meilisearch.sdk.model.CancelTasksQuery; +import com.meilisearch.sdk.model.DeleteTasksQuery; import com.meilisearch.sdk.model.Task; +import com.meilisearch.sdk.model.TaskInfo; import com.meilisearch.sdk.model.TasksQuery; import com.meilisearch.sdk.model.TasksResults; import java.util.Date; @@ -100,6 +103,33 @@ TasksResults getTasks(String indexUid, TasksQuery param) throws MeilisearchExcep return result; } + /** + * Delete tasks from the client + * + * @param param accept by the tasks route + * @return Meilisearch API response as TaskInfo + * @throws MeilisearchException if client request causes an error + */ + TaskInfo cancelTasks(CancelTasksQuery param) throws MeilisearchException { + URLBuilder urlb = tasksPath().addSubroute("cancel"); + TaskInfo result = + httpClient.post(urlb.addQuery(param.toQuery()).getURL(), null, TaskInfo.class); + return result; + } + + /** + * Delete tasks from the client + * + * @param param accept by the tasks route + * @return Meilisearch API response as TaskInfo + * @throws MeilisearchException if client request causes an error + */ + TaskInfo deleteTasks(DeleteTasksQuery param) throws MeilisearchException { + TaskInfo result = + httpClient.delete(tasksPath().addQuery(param.toQuery()).getURL(), TaskInfo.class); + return result; + } + /** * Waits for a task to be processed * diff --git a/src/main/java/com/meilisearch/sdk/model/CancelTasksQuery.java b/src/main/java/com/meilisearch/sdk/model/CancelTasksQuery.java new file mode 100644 index 00000000..d78382df --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/model/CancelTasksQuery.java @@ -0,0 +1,42 @@ +package com.meilisearch.sdk.model; + +import com.meilisearch.sdk.http.URLBuilder; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + * Data structure of a query parameter for tasks route + * + *

https://docs.meilisearch.com/reference/api/tasks.html#query-parameters + */ +@Setter +@Getter +@Accessors(chain = true) +public class CancelTasksQuery { + private int[] uids; + private String[] statuses; + private String[] types; + private String[] indexUids; + private Date beforeEnqueuedAt; + private Date afterEnqueuedAt; + private Date beforeStartedAt; + private Date afterStartedAt; + + public CancelTasksQuery() {} + + public String toQuery() { + URLBuilder urlb = + new URLBuilder() + .addParameter("uids", this.getUids()) + .addParameter("statuses", this.getStatuses()) + .addParameter("types", this.getTypes()) + .addParameter("indexUids", this.getIndexUids()) + .addParameter("beforeEnqueuedAt", this.getBeforeEnqueuedAt()) + .addParameter("afterEnqueuedAt", this.getAfterEnqueuedAt()) + .addParameter("beforeStartedAt", this.getBeforeStartedAt()) + .addParameter("afterStartedAt", this.getAfterStartedAt()); + return urlb.getURL(); + } +} diff --git a/src/main/java/com/meilisearch/sdk/model/DeleteTasksQuery.java b/src/main/java/com/meilisearch/sdk/model/DeleteTasksQuery.java new file mode 100644 index 00000000..607f16b3 --- /dev/null +++ b/src/main/java/com/meilisearch/sdk/model/DeleteTasksQuery.java @@ -0,0 +1,48 @@ +package com.meilisearch.sdk.model; + +import com.meilisearch.sdk.http.URLBuilder; +import java.util.Date; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + * Data structure of a query parameter for tasks route + * + *

https://docs.meilisearch.com/reference/api/tasks.html#query-parameters + */ +@Setter +@Getter +@Accessors(chain = true) +public class DeleteTasksQuery { + private int[] uids; + private String[] statuses; + private String[] types; + private String[] indexUids; + private int[] canceledBy; + private Date beforeEnqueuedAt; + private Date afterEnqueuedAt; + private Date beforeStartedAt; + private Date afterStartedAt; + private Date beforeFinishedAt; + private Date afterFinishedAt; + + public DeleteTasksQuery() {} + + public String toQuery() { + URLBuilder urlb = + new URLBuilder() + .addParameter("uids", this.getUids()) + .addParameter("statuses", this.getStatuses()) + .addParameter("types", this.getTypes()) + .addParameter("indexUids", this.getIndexUids()) + .addParameter("canceledBy", this.getCanceledBy()) + .addParameter("beforeEnqueuedAt", this.getBeforeEnqueuedAt()) + .addParameter("afterEnqueuedAt", this.getAfterEnqueuedAt()) + .addParameter("beforeStartedAt", this.getBeforeStartedAt()) + .addParameter("afterStartedAt", this.getAfterStartedAt()) + .addParameter("beforeFinishedAt", this.getBeforeFinishedAt()) + .addParameter("afterFinishedAt", this.getAfterFinishedAt()); + return urlb.getURL(); + } +} diff --git a/src/test/java/com/meilisearch/integration/TasksTest.java b/src/test/java/com/meilisearch/integration/TasksTest.java index 829a14f8..63a1364a 100644 --- a/src/test/java/com/meilisearch/integration/TasksTest.java +++ b/src/test/java/com/meilisearch/integration/TasksTest.java @@ -5,6 +5,8 @@ import com.meilisearch.integration.classes.AbstractIT; import com.meilisearch.integration.classes.TestData; import com.meilisearch.sdk.Index; +import com.meilisearch.sdk.model.CancelTasksQuery; +import com.meilisearch.sdk.model.DeleteTasksQuery; import com.meilisearch.sdk.model.Task; import com.meilisearch.sdk.model.TaskInfo; import com.meilisearch.sdk.model.TasksQuery; @@ -117,6 +119,78 @@ public void testClientGetTasksAllQueryParameters() throws Exception { assertNotNull(result.getNext()); } + /** Test Cancel Task */ + @Test + public void testClientCancelTask() throws Exception { + CancelTasksQuery query = + new CancelTasksQuery().setStatuses(new String[] {"enqueued", "succeeded"}); + + TaskInfo task = client.cancelTasks(query); + + assertTrue(task instanceof TaskInfo); + assertNotNull(task.getStatus()); + assertNotEquals("", task.getStatus()); + assertNull(task.getIndexUid()); + assertEquals("taskCancelation", task.getType()); + } + + /** Test Cancel Task with multiple filters */ + @Test + public void testClientCancelTaskWithMultipleFilters() throws Exception { + Date date = new Date(); + CancelTasksQuery query = + new CancelTasksQuery() + .setUids(new int[] {0, 1, 2}) + .setStatuses(new String[] {"enqueued", "succeeded"}) + .setTypes(new String[] {"indexDeletion"}) + .setIndexUids(new String[] {"index"}) + .setBeforeEnqueuedAt(date); + + TaskInfo task = client.cancelTasks(query); + + assertTrue(task instanceof TaskInfo); + assertNotNull(task.getStatus()); + assertNotEquals("", task.getStatus()); + assertNull(task.getIndexUid()); + assertEquals("taskCancelation", task.getType()); + } + + /** Test Delete Task */ + @Test + public void testClientDeleteTask() throws Exception { + DeleteTasksQuery query = + new DeleteTasksQuery().setStatuses(new String[] {"enqueued", "succeeded"}); + + TaskInfo task = client.deleteTasks(query); + + assertTrue(task instanceof TaskInfo); + assertNotNull(task.getStatus()); + assertNotEquals("", task.getStatus()); + assertNull(task.getIndexUid()); + assertEquals("taskDeletion", task.getType()); + } + + /** Test Delete Task with multiple filters */ + @Test + public void testClientDeleteTaskWithMultipleFilters() throws Exception { + Date date = new Date(); + DeleteTasksQuery query = + new DeleteTasksQuery() + .setUids(new int[] {0, 1, 2}) + .setStatuses(new String[] {"enqueued", "succeeded"}) + .setTypes(new String[] {"indexDeletion"}) + .setIndexUids(new String[] {"index"}) + .setBeforeEnqueuedAt(date); + + TaskInfo task = client.deleteTasks(query); + + assertTrue(task instanceof TaskInfo); + assertNotNull(task.getStatus()); + assertNotEquals("", task.getStatus()); + assertNull(task.getIndexUid()); + assertEquals("taskDeletion", task.getType()); + } + /** Test waitForTask */ @Test public void testWaitForTask() throws Exception {