Skip to content

Commit e37aa2e

Browse files
committed
Added support for resetting settings via revision number (#52)
This is the first step in adding migrations. This commit adds the support for resetting the user settings when you change the "__revision__" value of a settings namespace.
1 parent c8e8230 commit e37aa2e

File tree

4 files changed

+42
-4
lines changed

4 files changed

+42
-4
lines changed

src/config.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,9 @@ export const defaultConfiguration = {
131131
defaults: {
132132
'osjs/default-application': {},
133133
'osjs/session': [],
134-
'osjs/desktop': {},
134+
'osjs/desktop': {
135+
__revision__: 0
136+
},
135137
'osjs/locale': {}
136138
}
137139
},

src/core.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ export default class Core extends CoreBase {
144144
this.user = user;
145145

146146
if (this.has('osjs/settings')) {
147-
this.make('osjs/settings').load()
147+
this.make('osjs/settings').load(true)
148148
.then(() => done())
149149
.catch(() => done());
150150
} else {

src/providers/settings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export default class SettingsServiceProvider extends ServiceProvider {
5858
init() {
5959
this.core.singleton('osjs/settings', () => ({
6060
save: () => this.settings.save(),
61-
load: () => this.settings.load(),
61+
load: migrate => this.settings.load(migrate),
6262
clear: (...args) => this.settings.clear(...args),
6363
get: (...args) => this.settings.get(...args),
6464
set: (...args) => this.settings.set(...args)

src/settings.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,10 @@ export default class Settings {
106106

107107
/**
108108
* Loads settings
109+
* @param {boolean} [migrate] Run migrations
109110
* @return {Promise<boolean, Error>}
110111
*/
111-
load() {
112+
load(migrate) {
112113
const defaults = this.core.config('settings.defaults', {});
113114

114115
return this.adapter.load()
@@ -117,6 +118,9 @@ export default class Settings {
117118
arrayMerge: (dest, source) => source
118119
});
119120

121+
return migrate ? this.migrate() : Promise.resolve();
122+
})
123+
.then(() => {
120124
this.core.emit('osjs/settings:load');
121125

122126
return true;
@@ -128,6 +132,38 @@ export default class Settings {
128132
});
129133
}
130134

135+
/**
136+
* Runs migrations for settings
137+
*/
138+
migrate() {
139+
const defaults = this.core.config('settings.defaults', {});
140+
141+
const revisionsChanged = Object.keys(defaults)
142+
.filter(key => {
143+
const currentRevision = defaults[key].__revision__;
144+
const userRevision = this.settings[key]
145+
? this.settings[key].__revision__
146+
: undefined;
147+
148+
if (typeof currentRevision === 'undefined') {
149+
return false;
150+
}
151+
152+
return userRevision < currentRevision;
153+
});
154+
155+
if (revisionsChanged.length > 0) {
156+
revisionsChanged.forEach(key => {
157+
this.settings[key] = merge(defaults[key], {});
158+
});
159+
160+
return this.save()
161+
.catch(err => console.warn('Settings#migrate', 'failed to save after migration', err));
162+
}
163+
164+
return Promise.resolve();
165+
}
166+
131167
/**
132168
* Gets a settings entry by key
133169
*

0 commit comments

Comments
 (0)