Merge branch 'fix-leaky-journal' into 'develop'
fix leaky journal by running uniq on addToCollection entries Closes #1214 See merge request pleroma/pleroma-fe!1687
This commit is contained in:
		
						commit
						2e3d4d7728
					
				
					 2 changed files with 24 additions and 3 deletions
				
			
		| 
						 | 
					@ -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 a new issue