Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 34 additions & 5 deletions redisinsight/ui/src/slices/browser/keys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,15 @@ import { fetchReJSON } from './rejson'
import { setHashInitialState, fetchHashFields } from './hash'
import { setListInitialState, fetchListElements } from './list'
import { fetchStreamEntries, setStreamInitialState } from './stream'
import { fetchMoreRedisearchKeysAction, fetchRedisearchKeysAction, resetRedisearchKeysData, setLastBatchRedisearchKeys, setQueryRedisearch } from './redisearch'
import {
deleteRedisearchKeyFromList,
editRedisearchKeyFromList,
fetchMoreRedisearchKeysAction,
fetchRedisearchKeysAction,
resetRedisearchKeysData,
setLastBatchRedisearchKeys,
setQueryRedisearch,
} from './redisearch'
import { addErrorNotification, addMessageNotification } from '../app/notifications'
import { KeysStore, KeyViewType, SearchMode } from '../interfaces/keys'
import { AppDispatch, RootState } from '../store'
Expand Down Expand Up @@ -197,7 +205,7 @@ const keysSlice = createSlice({
error: payload,
}
},
deleteKeyFromList: (state, { payload }) => {
deletePatternKeyFromList: (state, { payload }) => {
remove(state.data?.keys, (key) => isEqualBuffers(key.name, payload))

state.data = {
Expand Down Expand Up @@ -229,10 +237,11 @@ const keysSlice = createSlice({
error: payload,
}
},
editKeyFromList: (state, { payload }) => {
editPatternKeyFromList: (state, { payload }) => {
const keys = state.data.keys.map((key) => {
if (isEqualBuffers(key.name, payload?.key)) {
key.name = payload?.newKey
key.nameString = bufferToString(payload?.newKey)
}
return key
})
Expand Down Expand Up @@ -352,8 +361,8 @@ export const {
deleteKey,
deleteKeySuccess,
deleteKeyFailure,
deleteKeyFromList,
editKeyFromList,
deletePatternKeyFromList,
editPatternKeyFromList,
updateSelectedKeyLength,
setPatternSearchMatch,
setFilter,
Expand Down Expand Up @@ -948,3 +957,23 @@ export function resetKeysData(searchMode: SearchMode) {
? resetPatternKeysData()
: resetRedisearchKeysData()
}

export function deleteKeyFromList(key: RedisResponseBuffer) {
return async (dispatch: AppDispatch, stateInit: () => RootState) => {
const state = stateInit()

return state.browser.keys?.searchMode === SearchMode.Pattern
? dispatch(deletePatternKeyFromList(key))
: dispatch(deleteRedisearchKeyFromList(key))
}
}

export function editKeyFromList(key: RedisResponseBuffer) {
return async (dispatch: AppDispatch, stateInit: () => RootState) => {
const state = stateInit()

return state.browser.keys?.searchMode === SearchMode.Pattern
? dispatch(editPatternKeyFromList(key))
: dispatch(editRedisearchKeyFromList(key))
}
}
32 changes: 30 additions & 2 deletions redisinsight/ui/src/slices/browser/redisearch.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import axios, { AxiosError } from 'axios'
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import successMessages from 'uiSrc/components/notifications/success-messages'
import { remove } from 'lodash'

import successMessages from 'uiSrc/components/notifications/success-messages'
import { ApiEndpoints } from 'uiSrc/constants'
import { apiService } from 'uiSrc/services'
import { getApiErrorMessage, getUrl, isStatusSuccessful, Nullable } from 'uiSrc/utils'
import { bufferToString, getApiErrorMessage, getUrl, isEqualBuffers, isStatusSuccessful, Nullable } from 'uiSrc/utils'
import { DEFAULT_SEARCH_MATCH } from 'uiSrc/constants/api'
import { IKeyPropTypes } from 'uiSrc/constants/prop-types/keys'
import ApiErrors from 'uiSrc/constants/apiErrors'
Expand Down Expand Up @@ -150,6 +151,31 @@ const redisearchSlice = createSlice({
resetRedisearchKeysData: (state) => {
state.data.keys.length = 0
},

deleteRedisearchKeyFromList: (state, { payload }) => {
remove(state.data?.keys, (key) => isEqualBuffers(key.name, payload))

state.data = {
...state.data,
total: state.data.total - 1,
scanned: state.data.scanned - 1,
}
},

editRedisearchKeyFromList: (state, { payload }) => {
const keys = state.data.keys.map((key) => {
if (isEqualBuffers(key.name, payload?.key)) {
key.name = payload?.newKey
key.nameString = bufferToString(payload?.newKey)
}
return key
})

state.data = {
...state.data,
keys,
}
},
},
})

Expand All @@ -172,6 +198,8 @@ export const {
setLastBatchRedisearchKeys,
setQueryRedisearch,
resetRedisearchKeysData,
deleteRedisearchKeyFromList,
editRedisearchKeyFromList,
} = redisearchSlice.actions

// Selectors
Expand Down
4 changes: 2 additions & 2 deletions redisinsight/ui/src/slices/tests/browser/hash.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ import {
} from 'uiSrc/utils/test-utils'
import successMessages from 'uiSrc/components/notifications/success-messages'
import { bufferToString, stringToBuffer } from 'uiSrc/utils'
import { deleteRedisearchKeyFromList } from 'uiSrc/slices/browser/redisearch'
import {
defaultSelectedKeyAction,
refreshKeyInfo,
deleteKeySuccess,
deleteKeyFromList,
updateSelectedKeyRefreshTime,
} from '../../browser/keys'
import reducer, {
Expand Down Expand Up @@ -642,7 +642,7 @@ describe('hash slice', () => {
removeHashFieldsSuccess(),
removeFieldsFromList(fields),
deleteKeySuccess(),
deleteKeyFromList(key),
deleteRedisearchKeyFromList(key),
addMessageNotification(successMessages.DELETED_KEY(key))
]

Expand Down
20 changes: 10 additions & 10 deletions redisinsight/ui/src/slices/tests/browser/keys.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ import reducer, {
deleteKey,
deleteKeySuccess,
deleteKeyFailure,
deleteKeyFromList,
editKeyFromList,
deletePatternKeyFromList,
editPatternKeyFromList,
defaultSelectedKeyActionSuccess,
editKey,
defaultSelectedKeyActionFailure,
Expand Down Expand Up @@ -717,7 +717,7 @@ describe('keys slice', () => {
})
})

describe('editKeyFromList', () => {
describe('editPatternKeyFromList', () => {
it('should properly set the state before the edit key', () => {
// Arrange

Expand All @@ -735,12 +735,12 @@ describe('keys slice', () => {
const state = {
...initialState,
data: {
keys: [{ name: data.newKey }],
keys: [{ name: data.newKey, nameString: data.newKey }],
},
}

// Act
const nextState = reducer(initialStateMock, editKeyFromList(data))
const nextState = reducer(initialStateMock, editPatternKeyFromList(data))

// Assert
const rootState = Object.assign(initialStateDefault, {
Expand Down Expand Up @@ -1196,7 +1196,7 @@ describe('keys slice', () => {
})

describe('deleteKey', () => {
it('call both deleteKey, deleteKeySuccess and deleteKeyFromList when delete is successed', async () => {
it('call both deleteKey, deleteKeySuccess and deletePatternKeyFromList when delete is successed', async () => {
// Arrange
const data = {
name: 'string',
Expand All @@ -1215,15 +1215,15 @@ describe('keys slice', () => {
const expectedActions = [
deleteKey(),
deleteKeySuccess(),
deleteKeyFromList(data.name),
deletePatternKeyFromList(data.name),
addMessageNotification(successMessages.DELETED_KEY(data.name)),
]
expect(store.getActions()).toEqual(expectedActions)
})
})

describe('editKey', () => {
it('call both editKey, editKeySuccess and editKeyFromList when editing is successed', async () => {
it('call both editKey, editKeySuccess and editPatternKeyFromList when editing is successed', async () => {
// Arrange
const key = 'string'
const newKey = 'string2'
Expand All @@ -1235,7 +1235,7 @@ describe('keys slice', () => {
await store.dispatch<any>(editKey(key, newKey))

// Assert
const expectedActions = [defaultSelectedKeyAction(), editKeyFromList({ key, newKey })]
const expectedActions = [defaultSelectedKeyAction(), editPatternKeyFromList({ key, newKey })]
expect(store.getActions()).toEqual(expectedActions)
})
})
Expand Down Expand Up @@ -1277,7 +1277,7 @@ describe('keys slice', () => {
const expectedActions = [
defaultSelectedKeyAction(),
deleteKeySuccess(),
deleteKeyFromList(key),
deletePatternKeyFromList(key),
defaultSelectedKeyActionSuccess(),
]
expect(store.getActions()).toEqual(expectedActions)
Expand Down
6 changes: 3 additions & 3 deletions redisinsight/ui/src/slices/tests/browser/list.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import {
mockStore,
} from 'uiSrc/utils/test-utils'
import successMessages from 'uiSrc/components/notifications/success-messages'
import { DeleteListElementsDto, PushElementToListDto } from 'apiSrc/modules/browser/dto'
import { stringToBuffer } from 'uiSrc/utils'
import { deleteRedisearchKeyFromList } from 'uiSrc/slices/browser/redisearch'
import { DeleteListElementsDto, PushElementToListDto } from 'apiSrc/modules/browser/dto'
import {
defaultSelectedKeyAction,
deleteKeyFromList,
deleteKeySuccess,
refreshKeyInfo,
updateSelectedKeyRefreshTime,
Expand Down Expand Up @@ -866,7 +866,7 @@ describe('list slice', () => {
deleteListElements(),
deleteListElementsSuccess(),
deleteKeySuccess(),
deleteKeyFromList(data.keyName),
deleteRedisearchKeyFromList(data.keyName),
addMessageNotification(successMessages.DELETED_KEY(data.keyName))
]

Expand Down
75 changes: 75 additions & 0 deletions redisinsight/ui/src/slices/tests/browser/redisearch.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ import reducer, {
redisearchSelector,
setRedisearchInitialState,
resetRedisearchKeysData,
deleteRedisearchKeyFromList,
editRedisearchKeyFromList,
} from '../../browser/redisearch'

let store: typeof mockedStore
Expand Down Expand Up @@ -582,6 +584,79 @@ describe('redisearch slice', () => {
})
})

describe('deleteRedisearchKeyFromList', () => {
it('should delete keys from list', () => {
const scanned = 5
const total = 5
const strToKey = (name:string) => ({ name: stringToBuffer(name), nameString: name, ttl: 1, size: 1, type: 'hash' })

// Arrange
const state = {
...initialState,
data: {
...initialState.data,
keys: ['1', '2', '3', '5', '6'].map(strToKey),
scanned: scanned - 1,
total: total - 1
}
}

const prevState = {
...initialState,
data: {
...initialState.data,
scanned,
total,
keys: ['1', '2', '3', '4', '5', '6'].map(strToKey),
}
}

// Act
const nextState = reducer(prevState, deleteRedisearchKeyFromList(strToKey('4')?.name))

// Assert
const rootState = Object.assign(initialStateDefault, {
browser: { redisearch: nextState },
})
expect(redisearchSelector(rootState)).toEqual(state)
})
})

describe('editRedisearchKeyFromList', () => {
it('should rename key in the list', () => {
const strToKey = (name:string) => ({ name: stringToBuffer(name), nameString: name, ttl: 1, size: 1, type: 'hash' })

// Arrange
const state = {
...initialState,
data: {
...initialState.data,
keys: ['1', '2', '3', '44', '5', '6'].map(strToKey),
}
}

const prevState = {
...initialState,
data: {
...initialState.data,
keys: ['1', '2', '3', '4', '5', '6'].map(strToKey),
}
}

// Act
const nextState = reducer(
prevState,
editRedisearchKeyFromList({ key: strToKey('4')?.name, newKey: strToKey('44')?.name }),
)

// Assert
const rootState = Object.assign(initialStateDefault, {
browser: { redisearch: nextState },
})
expect(redisearchSelector(rootState)).toEqual(state)
})
})

describe('thunks', () => {
describe('fetchRedisearchListAction', () => {
it('call both fetchRedisearchListAction, loadListSuccess when fetch is successed', async () => {
Expand Down
4 changes: 2 additions & 2 deletions redisinsight/ui/src/slices/tests/browser/set.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import {
import { addErrorNotification, addMessageNotification } from 'uiSrc/slices/app/notifications'
import successMessages from 'uiSrc/components/notifications/success-messages'
import { stringToBuffer } from 'uiSrc/utils'
import { deleteRedisearchKeyFromList } from 'uiSrc/slices/browser/redisearch'
import {
defaultSelectedKeyAction,
deleteKeyFromList,
deleteKeySuccess,
refreshKeyInfo,
updateSelectedKeyRefreshTime,
Expand Down Expand Up @@ -675,7 +675,7 @@ describe('set slice', () => {
removeSetMembersSuccess(),
removeMembersFromList(members),
deleteKeySuccess(),
deleteKeyFromList(key),
deleteRedisearchKeyFromList(key),
addMessageNotification(successMessages.DELETED_KEY(key))
]

Expand Down
4 changes: 2 additions & 2 deletions redisinsight/ui/src/slices/tests/browser/zset.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ import {
import { addErrorNotification, addMessageNotification } from 'uiSrc/slices/app/notifications'
import successMessages from 'uiSrc/components/notifications/success-messages'
import { stringToBuffer } from 'uiSrc/utils'
import { deleteRedisearchKeyFromList } from 'uiSrc/slices/browser/redisearch'
import { AddMembersToZSetDto, ZSetMemberDto } from 'apiSrc/modules/browser/dto'
import {
defaultSelectedKeyAction,
deleteKeyFromList,
deleteKeySuccess,
refreshKeyInfo,
updateSelectedKeyRefreshTime,
Expand Down Expand Up @@ -966,7 +966,7 @@ describe('zset slice', () => {
removeZsetMembersSuccess(),
removeMembersFromList(members),
deleteKeySuccess(),
deleteKeyFromList(key),
deleteRedisearchKeyFromList(key),
addMessageNotification(successMessages.DELETED_KEY(key))
]

Expand Down