Skip to content

Commit 064b668

Browse files
Add batch delete rows (#2178)
Fixes OPS-4016
1 parent c5b0d70 commit 064b668

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

packages/openops/src/lib/openops-tables/rows.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ export interface RowParams {
2525
tokenOrResolver: TokenOrResolver;
2626
}
2727

28+
export interface BatchDeleteRowsParams extends RowParams {
29+
rowIds: number[];
30+
}
31+
2832
export interface GetRowsParams extends RowParams {
2933
filters?: { fieldName: string; value: any; type: ViewFilterTypesEnum }[];
3034
filterType?: FilterType;
@@ -252,3 +256,32 @@ function getEqualityFilterType(
252256

253257
return ViewFilterTypesEnum.equal;
254258
}
259+
260+
export async function batchDeleteRows(
261+
params: BatchDeleteRowsParams,
262+
): Promise<void> {
263+
if (params.rowIds.length === 0) {
264+
return;
265+
}
266+
267+
const url = `api/database/rows/table/${params.tableId}/batch-delete/`;
268+
269+
await executeWithConcurrencyLimit(
270+
async () => {
271+
const authenticationHeader = createAxiosHeaders(params.tokenOrResolver);
272+
return await makeOpenOpsTablesPost(
273+
url,
274+
{ items: params.rowIds },
275+
authenticationHeader,
276+
);
277+
},
278+
(error) => {
279+
logger.error('Error while batch deleting rows:', {
280+
error,
281+
url,
282+
rowIdsCount: params.rowIds.length,
283+
rowIdsSample: params.rowIds.slice(0, 10),
284+
});
285+
},
286+
);
287+
}

packages/openops/test/openops-tables/rows.test.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import {
5454
import { axiosTablesRetryConfig } from '../../src/lib/openops-tables/requests-helpers';
5555
import {
5656
addRow,
57+
batchDeleteRows,
5758
deleteRow,
5859
getRowByPrimaryKeyValue,
5960
getRows,
@@ -321,6 +322,40 @@ describe('delete row', () => {
321322
});
322323
});
323324

325+
describe('batchDeleteRows', () => {
326+
beforeEach(() => {
327+
jest.clearAllMocks();
328+
});
329+
330+
test('does nothing when rowIds is empty', async () => {
331+
await batchDeleteRows({ tableId: 1, tokenOrResolver: 'token', rowIds: [] });
332+
333+
expect(makeOpenOpsTablesPostMock).not.toHaveBeenCalled();
334+
expect(acquireMock).not.toHaveBeenCalled();
335+
});
336+
337+
test('posts to batch-delete endpoint with correct url and body', async () => {
338+
makeOpenOpsTablesPostMock.mockResolvedValue('mock result');
339+
createAxiosHeadersMock.mockReturnValue('some header');
340+
341+
await batchDeleteRows({
342+
tableId: 5,
343+
tokenOrResolver: 'token',
344+
rowIds: [1, 2, 3],
345+
});
346+
347+
expect(acquireMock).toBeCalledTimes(1);
348+
expect(releaseMock).toBeCalledTimes(1);
349+
expect(makeOpenOpsTablesPostMock).toBeCalledTimes(1);
350+
expect(makeOpenOpsTablesPostMock).toHaveBeenCalledWith(
351+
'api/database/rows/table/5/batch-delete/',
352+
{ items: [1, 2, 3] },
353+
'some header',
354+
);
355+
expect(createAxiosHeadersMock).toHaveBeenCalledWith('token');
356+
});
357+
});
358+
324359
describe('getRowByPrimaryKeyValue', () => {
325360
beforeEach(() => {
326361
jest.clearAllMocks();

0 commit comments

Comments
 (0)