Skip to content

Commit

Permalink
feat(State migration): clean removed settings
Browse files Browse the repository at this point in the history
  • Loading branch information
AlejandroAkbal committed Apr 23, 2023
1 parent 7ae1213 commit 88eae3c
Show file tree
Hide file tree
Showing 5 changed files with 497 additions and 274 deletions.
92 changes: 52 additions & 40 deletions assets/js/MigrateState.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,63 +6,75 @@
* @returns {Object} migrated state
*/
export function migrateState(state) {
const INITIAL_STATE_VERSION = state.version
const INITIAL_STATE_VERSION = state.version

if (INITIAL_STATE_VERSION == null) {
throw new Error('Invalid initial state version')
}
if (INITIAL_STATE_VERSION == null) {
throw new Error('Invalid initial state version')
}

switch (INITIAL_STATE_VERSION) {
case 0:
state = migrateVersion0State(state)
break
switch (INITIAL_STATE_VERSION) {
case 0:
state = migrateVersion0State(state)
break

default:
console.debug(
`No migration necessary for state version "${INITIAL_STATE_VERSION}"`
)
return state
}
default:
console.debug(`No migration necessary for state version "${INITIAL_STATE_VERSION}"`)
return state
}

console.debug(`Migrated state to version "${state.version}"`)
console.debug(`Migrated state to version "${state.version}"`)

// Recursively migrate the state
return migrateState(state)
// Recursively migrate the state
return migrateState(state)
}

/**
* @param {Object} state
* @returns {Object}
*/
function migrateVersion0State(state) {
const posts = state.user.custom.savedPosts
const posts = state.user.custom.savedPosts

posts.map((post) => {
const POST_TAGS = post.data.tags
posts.map((post) => {
const POST_TAGS = post.data.tags

// Convert array to object
if (Array.isArray(POST_TAGS)) {
post.data.tags = {
character: [],
copyright: [],
artist: [],
general: POST_TAGS,
meta: []
}
}
// Convert array to object
if (Array.isArray(POST_TAGS)) {
post.data.tags = {
artist: [],
character: [],
copyright: [],
general: POST_TAGS,
meta: []
}
}

// Rename "source" to "sources"
if ('source' in post.data) {
post.data.sources = post.data.source
// Rename "source" to "sources"
if ('source' in post.data) {
post.data.sources = post.data.source

delete post.data.source
}
delete post.data.source
}

return post
})
return post
})

// Update the state version
state.version = 1
// Update the state version
state.version = 1

return state
return state
}

export function cleanState(state) {
// Remove settings that no longer exist (missing title key)
// state.user.settings is an oject, not an array
Object.keys(state.user.settings).forEach((key) => {
const setting = state.user.settings[key]

if (!('name' in setting)) {
delete state.user.settings[key]
}
})

return state
}
71 changes: 37 additions & 34 deletions assets/js/StateHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,44 @@
import { cloneDeep } from 'lodash-es'

export function createStateFromStore(store) {
const STATE = {
version: store.getters['getVersion'],

user: {
custom: {
boorus: store.getters['user/getCustomBoorus'],
tagCollections: store.getters['user/getCustomTagCollections'],
savedPosts: store.getters['user/getCustomSavedPosts']
}
}
}

return cloneDeep(STATE)
const STATE = {
version: store.getters.getVersion,

user: {
custom: {
boorus: store.getters['user/getCustomBoorus'],
tagCollections: store.getters['user/getCustomTagCollections'],
savedPosts: store.getters['user/getCustomSavedPosts']
},

settings: store.getters['user/getUserSettings']
}
}

return cloneDeep(STATE)
}

export function restoreStateToStore(state, store) {
if (!state.version) {
throw new Error('Invalid state')
}

// TODO: Think about what happens when an old state version is restored
store.commit('setVersion', state.version)

if (state.user.custom.boorus) {
store.commit('user/setCustomBoorus', state.user.custom.boorus)
}

if (state.user.custom.tagCollections) {
store.commit(
'user/setCustomTagCollections',
state.user.custom.tagCollections
)
}

if (state.user.custom.savedPosts) {
store.commit('user/setCustomSavedPosts', state.user.custom.savedPosts)
}
if (!state.version) {
throw new Error('Invalid state')
}

// TODO: Think about what happens when an old state version is restored
store.commit('setVersion', state.version)

if (state.user.custom.boorus) {
store.commit('user/setCustomBoorus', state.user.custom.boorus)
}

if (state.user.custom.tagCollections) {
store.commit('user/setCustomTagCollections', state.user.custom.tagCollections)
}

if (state.user.custom.savedPosts) {
store.commit('user/setCustomSavedPosts', state.user.custom.savedPosts)
}

if (state.user.settings) {
store.commit('user/setSettings', state.user.settings)
}
}
17 changes: 8 additions & 9 deletions plugins/g.migrate-state.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import {
createStateFromStore,
restoreStateToStore
} from '~/assets/js/StateHelper'
import { migrateState } from '~/assets/js/MigrateState'
import { createStateFromStore, restoreStateToStore } from '~/assets/js/StateHelper'
import { cleanState, migrateState } from '~/assets/js/MigrateState'

export default (context) => {
const { store } = context
const { store } = context

const STATE = createStateFromStore(store)
let state = createStateFromStore(store)

const MIGRATED_STATE = migrateState(STATE)
state = migrateState(state)

restoreStateToStore(MIGRATED_STATE, store)
state = cleanState(state)

restoreStateToStore(state, store)
}
4 changes: 4 additions & 0 deletions store/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,10 @@ export const getters = {
}

export const mutations = {
setSettings(state, value) {
state.settings = value
},

setSettingValue(state, { setting, value }) {
state.settings[setting].value = value
},
Expand Down
Loading

0 comments on commit 88eae3c

Please sign in to comment.