fix leaky journal by running uniq on addToCollection entries
This commit is contained in:
parent
da94c94fbe
commit
1512431973
|
@ -1,5 +1,5 @@
|
||||||
import { toRaw } from 'vue'
|
import { toRaw } from 'vue'
|
||||||
import { isEqual, cloneDeep, set, get, clamp, flatten, groupBy, findLastIndex, takeRight } from 'lodash'
|
import { isEqual, cloneDeep, set, get, clamp, flatten, groupBy, findLastIndex, takeRight, uniqWith } from 'lodash'
|
||||||
import { CURRENT_UPDATE_COUNTER } from 'src/components/update_notification/update_notification.js'
|
import { CURRENT_UPDATE_COUNTER } from 'src/components/update_notification/update_notification.js'
|
||||||
|
|
||||||
export const VERSION = 1
|
export const VERSION = 1
|
||||||
|
@ -149,12 +149,21 @@ const _mergeJournal = (...journals) => {
|
||||||
if (path.startsWith('collections')) {
|
if (path.startsWith('collections')) {
|
||||||
const lastRemoveIndex = findLastIndex(journal, ({ operation }) => operation === 'removeFromCollection')
|
const lastRemoveIndex = findLastIndex(journal, ({ operation }) => operation === 'removeFromCollection')
|
||||||
// everything before last remove is unimportant
|
// everything before last remove is unimportant
|
||||||
|
let remainder
|
||||||
if (lastRemoveIndex > 0) {
|
if (lastRemoveIndex > 0) {
|
||||||
return journal.slice(lastRemoveIndex)
|
remainder = journal.slice(lastRemoveIndex)
|
||||||
} else {
|
} else {
|
||||||
// everything else doesn't need trimming
|
// everything else doesn't need trimming
|
||||||
return journal
|
remainder = journal
|
||||||
}
|
}
|
||||||
|
return uniqWith(remainder, (a, b) => {
|
||||||
|
if (a.path !== b.path) { return false }
|
||||||
|
if (a.operation !== b.operation) { return false }
|
||||||
|
if (a.operation === 'addToCollection') {
|
||||||
|
return a.args[0] === b.args[0]
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
})
|
||||||
} else if (path.startsWith('simple')) {
|
} else if (path.startsWith('simple')) {
|
||||||
// Only the last record is important
|
// Only the last record is important
|
||||||
return takeRight(journal)
|
return takeRight(journal)
|
||||||
|
|
|
@ -148,6 +148,18 @@ describe('The serverSideStorage module', () => {
|
||||||
timestamp: state.prefsStorage._journal[1].timestamp
|
timestamp: state.prefsStorage._journal[1].timestamp
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should remove duplicate entries from journal', () => {
|
||||||
|
const state = cloneDeep(defaultState)
|
||||||
|
setPreference(state, { path: 'simple.testing', value: 1 })
|
||||||
|
setPreference(state, { path: 'simple.testing', value: 1 })
|
||||||
|
addCollectionPreference(state, { path: 'collections.testing', value: 2 })
|
||||||
|
addCollectionPreference(state, { path: 'collections.testing', value: 2 })
|
||||||
|
updateCache(state, { username: 'test' })
|
||||||
|
expect(state.prefsStorage.simple.testing).to.eql(1)
|
||||||
|
expect(state.prefsStorage.collections.testing).to.eql([2])
|
||||||
|
expect(state.prefsStorage._journal.length).to.eql(2)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue