diff --git a/redisinsight/api/src/modules/bulk-actions/constants/index.ts b/redisinsight/api/src/modules/bulk-actions/constants/index.ts index a9e3c937ef..5f80c61296 100644 --- a/redisinsight/api/src/modules/bulk-actions/constants/index.ts +++ b/redisinsight/api/src/modules/bulk-actions/constants/index.ts @@ -7,6 +7,7 @@ export enum BulkActionsServerEvents { export enum BulkActionType { Delete = 'delete', Upload = 'upload', + Unlink = 'unlink', } export enum BulkActionStatus { diff --git a/redisinsight/api/src/modules/bulk-actions/models/runners/simple/unlink.bulk-action.simple.runner.spec.ts b/redisinsight/api/src/modules/bulk-actions/models/runners/simple/unlink.bulk-action.simple.runner.spec.ts new file mode 100644 index 0000000000..c7487975c3 --- /dev/null +++ b/redisinsight/api/src/modules/bulk-actions/models/runners/simple/unlink.bulk-action.simple.runner.spec.ts @@ -0,0 +1,55 @@ +import { + mockSocket, + mockBulkActionsAnalytics, + mockCreateBulkActionDto, + mockStandaloneRedisClient, +} from 'src/__mocks__'; +import { UnlinkBulkActionSimpleRunner } from 'src/modules/bulk-actions/models/runners/simple/unlink.bulk-action.simple.runner'; +import { BulkAction } from 'src/modules/bulk-actions/models/bulk-action'; +import { RedisDataType } from 'src/modules/browser/keys/dto'; +import { BulkActionFilter } from 'src/modules/bulk-actions/models/bulk-action-filter'; + +const mockBulkActionFilter = Object.assign(new BulkActionFilter(), { + count: 10_000, + match: '*', + type: RedisDataType.Set, +}); + +const bulkAction = new BulkAction( + mockCreateBulkActionDto.id, + mockCreateBulkActionDto.databaseId, + mockCreateBulkActionDto.type, + mockBulkActionFilter, + mockSocket, + mockBulkActionsAnalytics as any, +); + +const mockKey = 'mockedKey'; +const mockKeyBuffer = Buffer.from(mockKey); + +describe('UnlinkBulkActionSimpleRunner', () => { + const client = mockStandaloneRedisClient; + let unlinkRunner: UnlinkBulkActionSimpleRunner; + + beforeEach(() => { + unlinkRunner = new UnlinkBulkActionSimpleRunner(bulkAction, client); + }); + + it('prepareCommands 3 commands', () => { + const commands = unlinkRunner.prepareCommands([ + mockKeyBuffer, + mockKeyBuffer, + mockKeyBuffer, + ]); + expect(commands).toEqual([ + ['unlink', mockKeyBuffer], + ['unlink', mockKeyBuffer], + ['unlink', mockKeyBuffer], + ]); + }); + + it('prepareCommands 0 commands', () => { + const commands = unlinkRunner.prepareCommands([]); + expect(commands).toEqual([]); + }); +}); diff --git a/redisinsight/api/src/modules/bulk-actions/models/runners/simple/unlink.bulk-action.simple.runner.ts b/redisinsight/api/src/modules/bulk-actions/models/runners/simple/unlink.bulk-action.simple.runner.ts new file mode 100644 index 0000000000..7cd666297a --- /dev/null +++ b/redisinsight/api/src/modules/bulk-actions/models/runners/simple/unlink.bulk-action.simple.runner.ts @@ -0,0 +1,8 @@ +import { AbstractBulkActionSimpleRunner } from 'src/modules/bulk-actions/models/runners/simple/abstract.bulk-action.simple.runner'; +import { RedisClientCommand } from 'src/modules/redis/client'; + +export class UnlinkBulkActionSimpleRunner extends AbstractBulkActionSimpleRunner { + prepareCommands(keys: Buffer[]): RedisClientCommand[] { + return keys.map((key) => ['unlink', key]); + } +} diff --git a/redisinsight/api/src/modules/bulk-actions/providers/bulk-actions.provider.spec.ts b/redisinsight/api/src/modules/bulk-actions/providers/bulk-actions.provider.spec.ts index 6b2edaa377..fa071007c2 100644 --- a/redisinsight/api/src/modules/bulk-actions/providers/bulk-actions.provider.spec.ts +++ b/redisinsight/api/src/modules/bulk-actions/providers/bulk-actions.provider.spec.ts @@ -91,6 +91,16 @@ describe('BulkActionsProvider', () => { expect(service['bulkActions'].size).toEqual(2); }); + it('should support unlink type', async () => { + const bulkAction = await service.create( + mockSessionMetadata, + { ...mockCreateBulkActionDto, type: BulkActionType.Unlink }, + mockSocket1, + ); + + expect(bulkAction).toBeInstanceOf(BulkAction); + expect(service['bulkActions'].size).toEqual(1); + }); it('should fail when unsupported runner class', async () => { try { await service.create( diff --git a/redisinsight/api/src/modules/bulk-actions/providers/bulk-actions.provider.ts b/redisinsight/api/src/modules/bulk-actions/providers/bulk-actions.provider.ts index 04d900986d..a939bc6531 100644 --- a/redisinsight/api/src/modules/bulk-actions/providers/bulk-actions.provider.ts +++ b/redisinsight/api/src/modules/bulk-actions/providers/bulk-actions.provider.ts @@ -12,6 +12,7 @@ import { BulkActionType, } from 'src/modules/bulk-actions/constants'; import { DeleteBulkActionSimpleRunner } from 'src/modules/bulk-actions/models/runners/simple/delete.bulk-action.simple.runner'; +import { UnlinkBulkActionSimpleRunner } from 'src/modules/bulk-actions/models/runners/simple/unlink.bulk-action.simple.runner'; import { BulkActionsAnalytics } from 'src/modules/bulk-actions/bulk-actions.analytics'; import { ClientContext, SessionMetadata } from 'src/common/models'; import { DatabaseClientFactory } from 'src/modules/database/providers/database.client.factory'; @@ -80,6 +81,8 @@ export class BulkActionsProvider { switch (dto.type) { case BulkActionType.Delete: return DeleteBulkActionSimpleRunner; + case BulkActionType.Unlink: + return UnlinkBulkActionSimpleRunner; default: throw new BadRequestException( `Unsupported type: ${dto.type} for Bulk Actions`, diff --git a/redisinsight/ui/src/components/bulk-actions-config/BulkActionsConfig.spec.tsx b/redisinsight/ui/src/components/bulk-actions-config/BulkActionsConfig.spec.tsx index ce6ebf2ff2..e873e82f44 100644 --- a/redisinsight/ui/src/components/bulk-actions-config/BulkActionsConfig.spec.tsx +++ b/redisinsight/ui/src/components/bulk-actions-config/BulkActionsConfig.spec.tsx @@ -67,7 +67,7 @@ const deletingMock = [ id: '123', databaseId: '1', db: 1, - type: BulkActionsType.Delete, + type: BulkActionsType.Unlink, filter: { type: null, match: '*', diff --git a/redisinsight/ui/src/components/bulk-actions-config/BulkActionsConfig.tsx b/redisinsight/ui/src/components/bulk-actions-config/BulkActionsConfig.tsx index 3bb4494ef9..285d3d20d0 100644 --- a/redisinsight/ui/src/components/bulk-actions-config/BulkActionsConfig.tsx +++ b/redisinsight/ui/src/components/bulk-actions-config/BulkActionsConfig.tsx @@ -96,7 +96,7 @@ const BulkActionsConfig = () => { id, databaseId: instanceId, db: db || 0, - type: BulkActionsType.Delete, + type: BulkActionsType.Unlink, filter: { type: filter, match: search || '*', diff --git a/redisinsight/ui/src/constants/bulkActions.ts b/redisinsight/ui/src/constants/bulkActions.ts index 2c5f8f7663..e08e947af8 100644 --- a/redisinsight/ui/src/constants/bulkActions.ts +++ b/redisinsight/ui/src/constants/bulkActions.ts @@ -9,6 +9,7 @@ export enum BulkActionsServerEvent { export enum BulkActionsType { Delete = 'delete', Upload = 'upload', + Unlink = 'unlink', } export enum BulkActionsStatus {