add upgrader to migrate data from old version

This commit is contained in:
marlon-erler
2024-07-27 00:33:42 +02:00
parent 1a1649bbb9
commit 78040b2d16
8 changed files with 551 additions and 12 deletions
+222 -3
View File
@@ -325,7 +325,7 @@
const stringEntryObjectValue = stringEntryObject[referenceKey];
if (referenceValue == void 0) return false;
if (referenceValue[0] == "-") {
const strippedReferenceValue = referenceValue.substring(1);
const strippedReferenceValue = referenceValue.toString().substring(1);
if (strippedReferenceValue == "" && stringEntryObjectValue != void 0 && stringEntryObjectValue != "") {
return false;
}
@@ -352,7 +352,7 @@
const stringEntryObjectValue = stringEntryObject[key];
if (stringEntryObjectValue == void 0 || stringEntryObjectValue == "")
continue;
values.add(stringEntryObjectValue);
values.add(stringEntryObjectValue.toString());
}
return [...values.values()];
}
@@ -361,7 +361,7 @@
const stringsInObject = getStringsOfObject(object);
const wordsInObject = [];
for (const string of stringsInObject) {
const lowercaseWordsInString = string.toLocaleLowerCase().split(" ").filter((word) => word != "");
const lowercaseWordsInString = string.toString().toLowerCase().split(" ").filter((word) => word != "");
wordsInObject.push(...lowercaseWordsInString);
}
const lowercaseWordsInQuery = query.toLowerCase().split(" ").filter((word) => word != "");
@@ -418,6 +418,12 @@
this.itemToString = itemToString;
}
};
function getLocalStorageItemAndClear(key) {
const value = localStorage.getItem(key);
localStorage.removeItem(key);
console.log(localStorage.getItem(key));
return value;
}
function stringify(data) {
return JSON.stringify(data, null, 4);
}
@@ -441,6 +447,18 @@
if (doesMatchReference == false) return null;
return parsed;
}
function parseOrFallback(inputString) {
try {
return JSON.parse(inputString);
} catch {
return inputString;
}
}
function parseArray(inputString) {
const parsed = parseOrFallback(inputString);
if (Array.isArray(parsed) == false) return [];
return parsed;
}
function localeCompare(a, b) {
return a.localeCompare(b);
}
@@ -2446,6 +2464,9 @@
// src/View/translations.ts
var englishTranslations = {
updater: {
migrated: "Migrated"
},
general: {
deleteItemButtonAudioLabel: "delete item",
searchButtonAudioLabel: "search",
@@ -4634,6 +4655,203 @@
};
};
// src/Upgrader/v1.ts
var v1Upgrader = class {
// init
constructor(settingsModel2, connectionModel2, chatListModel2) {
this.settingsModel = settingsModel2;
this.connectionModel = connectionModel2;
this.chatListModel = chatListModel2;
this.migrateSettings();
this.migrateConnections();
this.migrateChats();
}
// general
migrateSettings = () => {
const name = getLocalStorageItemAndClear("sender-name");
if (name != null) {
const parsedName = parseOrFallback(name);
this.settingsModel.setName(parsedName);
}
const firstDayOfWeek = getLocalStorageItemAndClear("first-day-of-week");
if (firstDayOfWeek != null) {
const parsedFirstDayOfWeek = parseOrFallback(firstDayOfWeek);
this.settingsModel.setFirstDayOfWeek(parsedFirstDayOfWeek);
}
};
migrateConnections = () => {
const previousAddressString = getLocalStorageItemAndClear("previous-addresses");
if (previousAddressString == null) return;
const previousAddresses = parseArray(previousAddressString);
for (const address of previousAddresses) {
if (typeof address != "string") continue;
this.connectionModel.storeAddress(address);
}
};
// chats
migrateChats = () => {
const chatIdString = getLocalStorageItemAndClear("chat-ids");
if (chatIdString == null) return;
const chatIds = parseArray(chatIdString);
for (const chatId of chatIds) {
if (typeof chatId != "string") continue;
this.migrateChatById(chatId);
}
};
migrateChatById = (id) => {
const primaryChannel = getLocalStorageItemAndClear(
storageKeys.primaryChannel(id)
);
if (primaryChannel == null) return;
const parsedPriamryChannel = parseOrFallback(primaryChannel);
const chatModel = this.chatListModel.createChat(parsedPriamryChannel);
const secondaryChannelString = getLocalStorageItemAndClear(
storageKeys.secondaryChannels(id)
);
if (secondaryChannelString != null) {
const potentialSecondaryChannels = parseArray(
secondaryChannelString
);
const confirmedSecondaryChannels = [];
for (const secondaryChannel of potentialSecondaryChannels) {
if (typeof secondaryChannel != "string") continue;
confirmedSecondaryChannels.push(secondaryChannel);
}
chatModel.setSecondaryChannels(confirmedSecondaryChannels);
}
const encryptionKey = getLocalStorageItemAndClear(
storageKeys.encyptionKey(id)
);
if (encryptionKey != null) {
const parsedEncryptionKey = parseOrFallback(encryptionKey);
chatModel.setEncryptionKey(parsedEncryptionKey);
}
const messagesString = getLocalStorageItemAndClear(storageKeys.messages(id)) ?? "";
const messageOutboxString = getLocalStorageItemAndClear(storageKeys.outbox(id)) ?? "";
const potentialMessages = parseArray(messagesString);
const potentialMessagesInOutbox = parseArray(messageOutboxString);
const addMessages = (potentialMessages2, status) => {
for (const potentialMessage of potentialMessages2) {
const isV1ChatMessage = checkMatchesObjectStructure(
potentialMessage,
V1ChatMessageReference
);
if (isV1ChatMessage == false) continue;
const v1ChatMessage = potentialMessage;
const convertedChatMessage = {
dataVersion: "v2",
id: v4_default(),
channel: v1ChatMessage.channel,
sender: v1ChatMessage.sender,
body: v1ChatMessage.body,
dateSent: v1ChatMessage.isoDate,
status,
stringifiedFile: ""
};
chatModel.addMessage(convertedChatMessage);
if (status == "outbox" /* Outbox */) {
this.connectionModel.sendMessageOrStore(convertedChatMessage);
}
}
};
addMessages(potentialMessages, "received" /* Received */);
addMessages(potentialMessagesInOutbox, "outbox" /* Outbox */);
const objectsString = getLocalStorageItemAndClear(storageKeys.objects(id)) ?? "";
const objectOutboxString = getLocalStorageItemAndClear(storageKeys.itemOutbox(id)) ?? "";
const potentialObjects = parseArray(objectsString);
const potentialObjectsInOutbox = parseArray(objectOutboxString);
const addObjects = (potentialObjects2) => {
const board = chatModel.fileModel.boardsAndTasksModel.createBoard(
translations.updater.migrated
);
chatModel.fileModel.boardsAndTasksModel.updateBoard(board);
for (const potentialObjectEntry of potentialObjects2) {
const potentialObject = potentialObjectEntry[1];
const isV1MessageObject = checkIsV1MessageObject(potentialObject);
if (isV1MessageObject == false) continue;
const objectId = potentialObject.id;
const objectName = potentialObject.title;
const contentVersions = Object.values(
potentialObject.contentVersions
);
for (const potentialVersion of contentVersions) {
const isV1MessageObjectContent = checkIsV1MessageObjectContent(potentialVersion);
if (isV1MessageObjectContent == false) continue;
const convertedTaskFileContent = {
dataVersion: "v2",
fileId: objectId,
fileContentId: FileModel2.generateFileContentId(
potentialVersion.isoDateVersionCreated
),
creationDate: potentialVersion.isoDateVersionCreated,
type: "task",
name: objectName ?? "",
boardId: board.fileId ?? "",
description: potentialVersion.noteContent ?? "",
category: potentialVersion.categoryName ?? "",
status: potentialVersion.status ?? "",
priority: potentialVersion.priority ?? "",
date: potentialVersion.date ?? "",
time: potentialVersion.time ?? ""
};
console.log(convertedTaskFileContent);
chatModel.fileModel.handleFileContent(convertedTaskFileContent);
}
}
};
addObjects([...potentialObjects, ...potentialObjectsInOutbox]);
};
};
var storageKeys = {
viewType(id) {
return id + "view-type";
},
hasUnread(id) {
return id + "has-unread-messages";
},
primaryChannel(id) {
return id + "primary-channel";
},
secondaryChannels(id) {
return id + "secondary-channels";
},
encyptionKey(id) {
return id + "encryption-key";
},
messages(id) {
return id + "messages";
},
objects(id) {
return id + "items";
},
outbox(id) {
return id + "outbox";
},
itemOutbox(id) {
return id + "item-outbox";
},
composingMessage(id) {
return id + "composing-message";
}
};
var V1ChatMessageReference = {
channel: "",
sender: "",
body: "",
isoDate: ""
};
function checkIsV1MessageObject(object) {
if (object.id == void 0) return false;
if (object.title == void 0) return false;
if (object.contentVersions == void 0) return false;
return true;
}
function checkIsV1MessageObjectContent(object) {
if (object.id == void 0) return false;
if (object.isoDateVersionCreated == void 0) return false;
return true;
}
// src/index.tsx
var storageModel = new StorageModel();
var settingsModel = new SettingsModel(storageModel);
@@ -4643,6 +4861,7 @@
settingsModel,
connectionModel
);
new v1Upgrader(settingsModel, connectionModel, chatListModel);
var coreVieWModel = new CoreViewModel();
var storageViewModel = new StorageViewModel(coreVieWModel, storageModel);
var settingsViewModel = new SettingsViewModel(coreVieWModel, settingsModel);