diff --git a/packages/openops/src/lib/openops-tables/rows.ts b/packages/openops/src/lib/openops-tables/rows.ts index 9df8b942ab..5e0c022b89 100644 --- a/packages/openops/src/lib/openops-tables/rows.ts +++ b/packages/openops/src/lib/openops-tables/rows.ts @@ -443,11 +443,16 @@ export async function batchDeleteRows( await executeWithConcurrencyLimit( async () => { const authenticationHeader = createAxiosHeaders(params.tokenOrResolver); - return await makeOpenOpsTablesPost( - url, - { items: params.rowIds }, - authenticationHeader, - ); + + for ( + let index = 0; + index < params.rowIds.length; + index += MAX_BATCH_ROWS + ) { + const items = params.rowIds.slice(index, index + MAX_BATCH_ROWS); + + await makeOpenOpsTablesPost(url, { items }, authenticationHeader); + } }, (error) => { logger.error('Error while batch deleting rows:', { diff --git a/packages/openops/test/openops-tables/rows.test.ts b/packages/openops/test/openops-tables/rows.test.ts index 0e07c6c251..d8ec3e4888 100644 --- a/packages/openops/test/openops-tables/rows.test.ts +++ b/packages/openops/test/openops-tables/rows.test.ts @@ -485,6 +485,42 @@ describe('batchDeleteRows', () => { ); expect(createAxiosHeadersMock).toHaveBeenCalledWith('token'); }); + + test('Should split batch delete requests into chunks of 200', async () => { + const rowIds = Array.from({ length: 450 }, (_, index) => index + 1); + + makeOpenOpsTablesPostMock.mockResolvedValue('mock result'); + createAxiosHeadersMock.mockReturnValue('some header'); + + await batchDeleteRows({ + tableId: 5, + tokenOrResolver: 'token', + rowIds, + }); + + expect(acquireMock).toBeCalledTimes(1); + expect(releaseMock).toBeCalledTimes(1); + expect(createAxiosHeadersMock).toHaveBeenCalledWith('token'); + expect(makeOpenOpsTablesPostMock).toBeCalledTimes(3); + expect(makeOpenOpsTablesPostMock).toHaveBeenNthCalledWith( + 1, + 'api/database/rows/table/5/batch-delete/', + { items: rowIds.slice(0, 200) }, + 'some header', + ); + expect(makeOpenOpsTablesPostMock).toHaveBeenNthCalledWith( + 2, + 'api/database/rows/table/5/batch-delete/', + { items: rowIds.slice(200, 400) }, + 'some header', + ); + expect(makeOpenOpsTablesPostMock).toHaveBeenNthCalledWith( + 3, + 'api/database/rows/table/5/batch-delete/', + { items: rowIds.slice(400, 450) }, + 'some header', + ); + }); }); describe('truncateTable', () => {