Skip to content

Commit ea102e6

Browse files
authored
Add delete task api for v0.30.0 (#1382)
Add delete task api for v0.30.0 (#1382)
1 parent b98549d commit ea102e6

File tree

5 files changed

+210
-3
lines changed

5 files changed

+210
-3
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,12 @@ client.getTasks(parameters: TasksQuery): Promise<TasksResults>
441441
client.getTask(uid: number): Promise<Task>
442442
```
443443

444+
#### [Delete tasks](https://docs.meilisearch.com/reference/api/tasks.html#delete-task)
445+
446+
```ts
447+
client.deleteTasks(parameters: DeleteTasksQuery = {}): Promise<EnqueuedTask>
448+
```
449+
444450
#### [Cancel tasks](https://docs.meilisearch.com/reference/api/tasks.html#cancel-task)
445451

446452
```ts

src/clients/client.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
TasksResults,
3131
EnqueuedTaskObject,
3232
CancelTasksQuery,
33+
DeleteTasksQuery,
3334
} from '../types'
3435
import { HttpRequests } from '../http-requests'
3536
import { TaskClient, Task } from '../task'
@@ -264,6 +265,19 @@ class Client {
264265
async cancelTasks(parameters: CancelTasksQuery = {}): Promise<EnqueuedTask> {
265266
return await this.tasks.cancelTasks(parameters)
266267
}
268+
269+
/**
270+
* Delete a list of tasks.
271+
* @memberof MeiliSearch
272+
* @method deleteTasks
273+
* @param {DeleteTasksQuery} [parameters={}] - Parameters to filter the tasks.
274+
*
275+
* @returns {Promise<EnqueuedTask>} Promise containing an EnqueuedTask
276+
*/
277+
async deleteTasks(parameters: DeleteTasksQuery = {}): Promise<EnqueuedTask> {
278+
return await this.tasks.deleteTasks(parameters)
279+
}
280+
267281
///
268282
/// KEYS
269283
///

src/task.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
TaskObject,
99
CancelTasksQuery,
1010
TasksResultsObject,
11+
DeleteTasksQuery,
1112
} from './types'
1213
import { HttpRequests, toQueryParams } from './http-requests'
1314
import { sleep } from './utils'
@@ -153,6 +154,25 @@ class TaskClient {
153154

154155
return new EnqueuedTask(task)
155156
}
157+
158+
/**
159+
* Delete a list tasks.
160+
* @memberof Tasks
161+
* @method deleteTasks
162+
* @param {DeleteTasksQuery} [parameters={}] - Parameters to filter the tasks.
163+
*
164+
* @returns {Promise<EnqueuedTask>} Promise containing an EnqueuedTask
165+
*/
166+
async deleteTasks(parameters: DeleteTasksQuery = {}): Promise<EnqueuedTask> {
167+
const url = `tasks`
168+
169+
const task = await this.httpRequest.delete(
170+
url,
171+
{},
172+
toQueryParams<DeleteTasksQuery>(parameters)
173+
)
174+
return new EnqueuedTask(task)
175+
}
156176
}
157177

158178
export { TaskClient, Task }

src/types/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ export const enum TaskTypes {
231231
DOCUMENTS_ADDITION_OR_UPDATE = 'documentAdditionOrUpdate',
232232
DOCUMENT_DELETION = 'documentDeletion',
233233
SETTINGS_UPDATE = 'settingsUpdate',
234+
TASK_DELETION = 'taskDeletion',
234235
SNAPSHOT_CREATION = 'snapshotCreation',
235236
TASK_CANCELATION = 'taskCancelation',
236237
}
@@ -251,6 +252,7 @@ export type TasksQuery = {
251252
from?: number
252253
}
253254
export type CancelTasksQuery = Omit<TasksQuery, 'limit' | 'from'> & {}
255+
export type DeleteTasksQuery = Omit<TasksQuery, 'limit' | 'from'> & {}
254256

255257
export type EnqueuedTaskObject = {
256258
taskUid: number
@@ -309,6 +311,9 @@ export type TaskObject = Omit<EnqueuedTaskObject, 'taskUid'> & {
309311
// Number of tasks that were canceled
310312
canceledTasks?: number
311313

314+
// Number of tasks that were deleted
315+
deletedTasks?: number
316+
312317
// Query parameters used to filter the tasks
313318
originalQuery?: string
314319
}

tests/task.test.ts

Lines changed: 165 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,12 @@ describe.each([{ permission: 'Master' }, { permission: 'Admin' }])(
148148
await client.waitForTask(task1.taskUid)
149149
await client.waitForTask(task2.taskUid)
150150

151-
const tasks = await client.getTasks({ from: 1, limit: 1 })
151+
const tasks = await client.getTasks({ from: task1.taskUid, limit: 1 })
152152

153153
expect(tasks.results.length).toEqual(1)
154-
expect(tasks.from).toEqual(1)
154+
expect(tasks.from).toEqual(task1.taskUid)
155155
expect(tasks.limit).toEqual(1)
156-
expect(tasks.next).toEqual(0)
156+
expect(tasks.next).toEqual(task1.taskUid - 1)
157157
})
158158

159159
// get tasks: status
@@ -522,6 +522,168 @@ describe.each([{ permission: 'Master' }, { permission: 'Admin' }])(
522522
expect(task.details?.originalQuery).toContain('afterFinishedAt')
523523
})
524524

525+
// delete: uid
526+
test(`${permission} key: Delete a task using the uid filter`, async () => {
527+
const client = await getClient(permission)
528+
const addDocuments = await client
529+
.index(index.uid)
530+
.addDocuments([{ id: 1 }])
531+
532+
const deleteTask = await client.deleteTasks({
533+
uid: [addDocuments.taskUid],
534+
})
535+
const task = await client.waitForTask(deleteTask.taskUid)
536+
537+
expect(deleteTask.type).toEqual(TaskTypes.TASK_DELETION)
538+
expect(task.details?.deletedTasks).toBeDefined()
539+
await expect(client.getTask(addDocuments.taskUid)).rejects.toHaveProperty(
540+
'code',
541+
ErrorStatusCode.TASK_NOT_FOUND
542+
)
543+
})
544+
545+
// delete: indexUid
546+
test(`${permission} key: Delete a task using the indexUid filter`, async () => {
547+
const client = await getClient(permission)
548+
const addDocuments = await client
549+
.index(index.uid)
550+
.addDocuments([{ id: 1 }])
551+
552+
const enqueuedTask = await client.deleteTasks({
553+
indexUid: [index.uid],
554+
})
555+
const deleteTask = await client.waitForTask(enqueuedTask.taskUid)
556+
557+
expect(deleteTask.type).toEqual(TaskTypes.TASK_DELETION)
558+
await expect(client.getTask(addDocuments.taskUid)).rejects.toHaveProperty(
559+
'code',
560+
ErrorStatusCode.TASK_NOT_FOUND
561+
)
562+
})
563+
564+
// delete: type
565+
test(`${permission} key: Delete a task using the type filter`, async () => {
566+
const client = await getClient(permission)
567+
568+
const enqueuedTask = await client.deleteTasks({
569+
type: [
570+
TaskTypes.DOCUMENTS_ADDITION_OR_UPDATE,
571+
TaskTypes.DOCUMENT_DELETION,
572+
],
573+
})
574+
const deleteTask = await client.waitForTask(enqueuedTask.taskUid)
575+
576+
expect(deleteTask.type).toEqual(TaskTypes.TASK_DELETION)
577+
expect(deleteTask.details?.originalQuery).toEqual(
578+
'type=documentAdditionOrUpdate%2CdocumentDeletion'
579+
)
580+
})
581+
582+
// delete: status
583+
test(`${permission} key: Delete a task using the status filter`, async () => {
584+
const client = await getClient(permission)
585+
586+
const enqueuedTask = await client.deleteTasks({
587+
status: [TaskStatus.TASK_ENQUEUED, TaskStatus.TASK_PROCESSING],
588+
})
589+
const task = await client.waitForTask(enqueuedTask.taskUid)
590+
591+
expect(task.type).toEqual(TaskTypes.TASK_DELETION)
592+
expect(task.details?.originalQuery).toEqual(
593+
'status=enqueued%2Cprocessing'
594+
)
595+
})
596+
597+
// delete: beforeEnqueuedAt
598+
test(`${permission} key: Delete a task using beforeEnqueuedAt filter`, async () => {
599+
const client = await getClient(permission)
600+
601+
const currentTimeStamp = Date.now()
602+
const currentTime = new Date(currentTimeStamp)
603+
const enqueuedTask = await client.deleteTasks({
604+
beforeEnqueuedAt: currentTime,
605+
})
606+
const task = await client.waitForTask(enqueuedTask.taskUid)
607+
608+
expect(task.type).toEqual(TaskTypes.TASK_DELETION)
609+
expect(task.details?.originalQuery).toContain('beforeEnqueuedAt')
610+
})
611+
612+
// delete: afterEnqueuedAt
613+
test(`${permission} key: Delete a task using afterEnqueuedAt filter`, async () => {
614+
const client = await getClient(permission)
615+
616+
const currentTimeStamp = Date.now()
617+
const currentTime = new Date(currentTimeStamp)
618+
const enqueuedTask = await client.deleteTasks({
619+
afterEnqueuedAt: currentTime,
620+
})
621+
const task = await client.waitForTask(enqueuedTask.taskUid)
622+
623+
expect(task.type).toEqual(TaskTypes.TASK_DELETION)
624+
expect(task.details?.originalQuery).toContain('afterEnqueuedAt')
625+
})
626+
627+
// delete: beforeStartedAt
628+
test(`${permission} key: Delete a task using beforeStartedAt filter`, async () => {
629+
const client = await getClient(permission)
630+
631+
const currentTimeStamp = Date.now()
632+
const currentTime = new Date(currentTimeStamp)
633+
const enqueuedTask = await client.deleteTasks({
634+
beforeStartedAt: currentTime,
635+
})
636+
const task = await client.waitForTask(enqueuedTask.taskUid)
637+
638+
expect(task.type).toEqual(TaskTypes.TASK_DELETION)
639+
expect(task.details?.originalQuery).toContain('beforeStartedAt')
640+
})
641+
642+
// delete: afterStartedAt
643+
test(`${permission} key: Delete a task using afterStartedAt filter`, async () => {
644+
const client = await getClient(permission)
645+
646+
const currentTimeStamp = Date.now()
647+
const currentTime = new Date(currentTimeStamp)
648+
const enqueuedTask = await client.deleteTasks({
649+
afterStartedAt: currentTime,
650+
})
651+
const task = await client.waitForTask(enqueuedTask.taskUid)
652+
653+
expect(task.type).toEqual(TaskTypes.TASK_DELETION)
654+
expect(task.details?.originalQuery).toContain('afterStartedAt')
655+
})
656+
657+
// delete: beforeFinishedAt
658+
test(`${permission} key: Delete a task using beforeFinishedAt filter`, async () => {
659+
const client = await getClient(permission)
660+
661+
const currentTimeStamp = Date.now()
662+
const currentTime = new Date(currentTimeStamp)
663+
const enqueuedTask = await client.deleteTasks({
664+
beforeFinishedAt: currentTime,
665+
})
666+
const task = await client.waitForTask(enqueuedTask.taskUid)
667+
668+
expect(task.type).toEqual(TaskTypes.TASK_DELETION)
669+
expect(task.details?.originalQuery).toContain('beforeFinishedAt')
670+
})
671+
672+
// delete: afterFinishedAt
673+
test(`${permission} key: Delete a task using afterFinishedAt filter`, async () => {
674+
const client = await getClient(permission)
675+
676+
const currentTimeStamp = Date.now()
677+
const currentTime = new Date(currentTimeStamp)
678+
const enqueuedTask = await client.deleteTasks({
679+
afterFinishedAt: currentTime,
680+
})
681+
const task = await client.waitForTask(enqueuedTask.taskUid)
682+
683+
expect(task.type).toEqual(TaskTypes.TASK_DELETION)
684+
expect(task.details?.originalQuery).toContain('afterFinishedAt')
685+
})
686+
525687
test(`${permission} key: Get all indexes tasks with index instance`, async () => {
526688
const client = await getClient(permission)
527689
await client.index(index.uid).addDocuments([{ id: 1 }])

0 commit comments

Comments
 (0)