Skip to content

Commit 6e83eaf

Browse files
committed
[IMP] mail, im_livechat: manage downgrade of local storage
This commit adds versioning to local storage entries, so that when version is more recent than current version, business code can have a strategy to drop the values. This strategy is the one used by local storage field: older versions are most updated and upgraded fields so 19.1 is implicitly valid for 19.2 and 19.3. 20.0 is invalid as it can potentially be affected by unknown upgrade scripts of current version (19.3), thus it's dropped. Part of Task-5003012
1 parent 13c04eb commit 6e83eaf

File tree

6 files changed

+30
-26
lines changed

6 files changed

+30
-26
lines changed

addons/mail/static/src/core/common/upgrade/upgrade_helpers.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,12 @@ function getUpgradeMap() {
104104
*/
105105
function applyUpgrade(upgradeData) {
106106
const oldEntry = new LocalStorageEntry(upgradeData.key);
107-
const oldValue = oldEntry.rawGet() ?? oldEntry.get();
108-
if (oldValue === undefined) {
107+
const parsed = oldEntry.parse();
108+
const oldValue = parsed ?? oldEntry.get();
109+
if (
110+
oldValue === null ||
111+
(parsed && parsed.version && parseVersion(upgradeData.version).isLowerThan(parsed.version))
112+
) {
109113
return; // could not upgrade (cannot parse or more recent version)
110114
}
111115
const { key, value } =
@@ -114,5 +118,5 @@ function applyUpgrade(upgradeData) {
114118
: upgradeData.upgrade;
115119
oldEntry.remove();
116120
const newEntry = new LocalStorageEntry(key);
117-
newEntry.set(value);
121+
newEntry.set(value, upgradeData.version);
118122
}

addons/mail/static/src/core/common/upgrade/upgrade_service.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ export const discussUpgradeService = {
77
dependencies: [],
88
start() {
99
const lse = new LocalStorageEntry("discuss.upgrade.version");
10-
const oldVersion = lse.get() ?? "1.0";
10+
const parsed = lse.parse();
11+
const oldVersion = parsed?.version ?? "1.0";
1112
const currentVersion = getCurrentLocalStorageVersion();
12-
lse.set(currentVersion);
13+
lse.set(true, currentVersion);
1314
if (parseVersion(oldVersion).isLowerThan(currentVersion)) {
1415
upgradeFrom(oldVersion);
1516
}

addons/mail/static/src/model/model_internal.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { toRaw } from "@odoo/owl";
22
import { ATTR_SYM, MANY_SYM, ONE_SYM } from "./misc";
3+
import { parseVersion } from "@mail/utils/common/misc";
4+
import { getCurrentLocalStorageVersion } from "@mail/utils/common/local_storage";
35

46
export class ModelInternal {
57
/** @type {Map<string, boolean>} */
@@ -75,12 +77,13 @@ export class ModelInternal {
7577
function fieldLocalStorageCompute() {
7678
const record = toRaw(this)._raw;
7779
const lse = record._.fieldsLocalStorage.get(fieldName);
78-
const value = lse.get();
79-
if (value === undefined) {
80+
const parsed = lse.parse();
81+
const currentOdooVersion = getCurrentLocalStorageVersion();
82+
if (!parsed || parseVersion(currentOdooVersion).isLowerThan(parsed.version)) {
8083
lse.remove();
8184
return this[fieldName];
8285
}
83-
return value;
86+
return parsed.value;
8487
}
8588
);
8689

addons/mail/static/src/model/store_internal.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { RecordInternal } from "./record_internal";
66
import { deserializeDate, deserializeDateTime } from "@web/core/l10n/dates";
77
import { IS_DELETED_SYM, isCommand, isMany } from "./misc";
88
import { browser } from "@web/core/browser/browser";
9-
import { parseRawValue } from "@mail/utils/common/local_storage";
9+
import { getCurrentLocalStorageVersion, parseRawValue } from "@mail/utils/common/local_storage";
1010

1111
const Markup = markup().constructor;
1212

@@ -55,7 +55,7 @@ export class StoreInternal extends RecordInternal {
5555
record._proxy[fieldName] = record._.fieldsDefault.get(fieldName);
5656
} else {
5757
const parsed = parseRawValue(ev.newValue);
58-
if (!parsed) {
58+
if (!parsed || parsed.version !== getCurrentLocalStorageVersion()) {
5959
record._proxy[fieldName] = record._.fieldsDefault.get(fieldName);
6060
} else {
6161
record._proxy[fieldName] = parsed.value;

addons/mail/static/src/utils/common/local_storage.js

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,32 +26,28 @@ export class LocalStorageEntry {
2626
this.key = key;
2727
}
2828
get() {
29-
const rawValue = this.rawGet();
30-
if (rawValue === null) {
31-
return undefined;
32-
}
33-
return parseRawValue(rawValue)?.value;
29+
return browser.localStorage.getItem(this.key);
30+
}
31+
parse() {
32+
return parseRawValue(this.get());
3433
}
35-
set(value) {
36-
const oldValue = this.get();
37-
if (oldValue !== undefined && oldValue === value) {
34+
set(value, version = getCurrentLocalStorageVersion()) {
35+
const parsed = this.parse();
36+
if (parsed && parsed.value === value && parsed.version === version) {
3837
return;
3938
}
40-
browser.localStorage.setItem(this.key, toRawValue(value));
41-
}
42-
rawGet() {
43-
return browser.localStorage.getItem(this.key);
39+
browser.localStorage.setItem(this.key, toRawValue(value, version));
4440
}
4541
remove() {
46-
if (this.rawGet() === null) {
42+
if (this.get() === null) {
4743
return;
4844
}
4945
browser.localStorage.removeItem(this.key);
5046
}
5147
}
5248

53-
export function toRawValue(value) {
54-
return JSON.stringify({ value });
49+
export function toRawValue(value, version = getCurrentLocalStorageVersion()) {
50+
return JSON.stringify({ value, version });
5551
}
5652

5753
/**

addons/mail/static/tests/mail_test_helpers.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ export function setDiscussSidebarCategoryFoldState(categoryId, val) {
785785
export function isDiscussSidebarCategoryFolded(categoryId) {
786786
const localId = DiscussAppCategory.localId(categoryId);
787787
const lse = new LocalStorageEntry(makeRecordFieldLocalId(localId, "is_open"));
788-
return !(lse.get() ?? true);
788+
return !(lse.parse()?.value ?? true);
789789
}
790790

791791
export function assertChatHub({ opened = [], folded = [] }) {

0 commit comments

Comments
 (0)