Skip to content

Commit 64c0d2c

Browse files
Add batch delete rows
1 parent c5b0d70 commit 64c0d2c

2 files changed

Lines changed: 66 additions & 0 deletions

File tree

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

Lines changed: 30 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,29 @@ function getEqualityFilterType(
252256

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

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

Lines changed: 36 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,41 @@ 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+
const result = await batchDeleteRows({
342+
tableId: 5,
343+
tokenOrResolver: 'token',
344+
rowIds: [1, 2, 3],
345+
});
346+
347+
expect(result).toBe('mock result');
348+
expect(acquireMock).toBeCalledTimes(1);
349+
expect(releaseMock).toBeCalledTimes(1);
350+
expect(makeOpenOpsTablesPostMock).toBeCalledTimes(1);
351+
expect(makeOpenOpsTablesPostMock).toHaveBeenCalledWith(
352+
'api/database/rows/table/5/batch-delete/',
353+
{ items: [1, 2, 3] },
354+
'some header',
355+
);
356+
expect(createAxiosHeadersMock).toHaveBeenCalledWith('token');
357+
});
358+
});
359+
324360
describe('getRowByPrimaryKeyValue', () => {
325361
beforeEach(() => {
326362
jest.clearAllMocks();

0 commit comments

Comments
 (0)