mirror of
https://github.com/streetwriters/notesnook.git
synced 2025-12-23 23:19:40 +01:00
core: re-insert only migrated items
Previously, we were re-inserting all items regardless of whether they were changed or not. This raised a lot of issues, not to mention unnecessary load on our servers because after each migration all the data is re-synced. Since migration takes place independently on each device, this multiplies exponentially. Hopefully after this update, this will only happen much more granually.
This commit is contained in:
@@ -201,7 +201,8 @@ export default class Backup {
|
|||||||
this._db,
|
this._db,
|
||||||
collections,
|
collections,
|
||||||
(id) => data[id],
|
(id) => data[id],
|
||||||
version
|
version,
|
||||||
|
true
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import { sendMigrationProgressEvent } from "../common";
|
|||||||
import { migrateCollection, migrateItem } from "../migrations";
|
import { migrateCollection, migrateItem } from "../migrations";
|
||||||
|
|
||||||
class Migrator {
|
class Migrator {
|
||||||
async migrate(db, collections, get, version) {
|
async migrate(db, collections, get, version, restore = false) {
|
||||||
for (let collection of collections) {
|
for (let collection of collections) {
|
||||||
if (!collection.index || !collection.dbCollection) continue;
|
if (!collection.index || !collection.dbCollection) continue;
|
||||||
|
|
||||||
@@ -56,23 +56,26 @@ class Migrator {
|
|||||||
await collection.dbCollection?._collection?.addItem(item);
|
await collection.dbCollection?._collection?.addItem(item);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const itemId = item.id;
|
const itemId = item.id;
|
||||||
item = await migrateItem(
|
const migrated = await migrateItem(
|
||||||
item,
|
item,
|
||||||
version,
|
version,
|
||||||
item.type || collection.type || collection.dbCollection.type,
|
item.type || collection.type || collection.dbCollection.type,
|
||||||
db
|
db
|
||||||
);
|
);
|
||||||
|
|
||||||
if (collection.dbCollection.merge) {
|
if (migrated || restore) {
|
||||||
await collection.dbCollection.merge(item);
|
if (collection.dbCollection.merge) {
|
||||||
} else if (collection.dbCollection.add) {
|
await collection.dbCollection.merge(item);
|
||||||
await collection.dbCollection.add(item);
|
} else if (collection.dbCollection.add) {
|
||||||
}
|
await collection.dbCollection.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
// if id changed after migration, we need to delete the old one.
|
// if id changed after migration, we need to delete the old one.
|
||||||
if (item.id !== itemId) {
|
if (item.id !== itemId) {
|
||||||
await collection.dbCollection?._collection?.deleteItem(itemId);
|
await collection.dbCollection?._collection?.deleteItem(itemId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,12 +33,12 @@ const migrations = [
|
|||||||
attachment: replaceDateEditedWithDateModified(true),
|
attachment: replaceDateEditedWithDateModified(true),
|
||||||
trash: replaceDateEditedWithDateModified(),
|
trash: replaceDateEditedWithDateModified(),
|
||||||
tiny: (item) => {
|
tiny: (item) => {
|
||||||
item = replaceDateEditedWithDateModified(false)(item);
|
replaceDateEditedWithDateModified(false)(item);
|
||||||
|
|
||||||
if (!item.data || item.data.iv) return item;
|
if (!item.data || item.data.iv) return true;
|
||||||
|
|
||||||
item.data = removeToxClassFromChecklist(wrapTablesWithDiv(item.data));
|
item.data = removeToxClassFromChecklist(wrapTablesWithDiv(item.data));
|
||||||
return item;
|
return true;
|
||||||
},
|
},
|
||||||
settings: replaceDateEditedWithDateModified(true)
|
settings: replaceDateEditedWithDateModified(true)
|
||||||
}
|
}
|
||||||
@@ -47,9 +47,9 @@ const migrations = [
|
|||||||
version: 5.3,
|
version: 5.3,
|
||||||
items: {
|
items: {
|
||||||
tiny: (item) => {
|
tiny: (item) => {
|
||||||
if (!item.data || item.data.iv) return item;
|
if (!item.data || item.data.iv) return false;
|
||||||
item.data = decodeWrappedTableHtml(item.data);
|
item.data = decodeWrappedTableHtml(item.data);
|
||||||
return item;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -57,10 +57,10 @@ const migrations = [
|
|||||||
version: 5.4,
|
version: 5.4,
|
||||||
items: {
|
items: {
|
||||||
tiny: (item) => {
|
tiny: (item) => {
|
||||||
if (!item.data || item.data.iv) return item;
|
if (!item.data || item.data.iv) return false;
|
||||||
item.type = "tiptap";
|
item.type = "tiptap";
|
||||||
item.data = tinyToTiptap(item.data);
|
item.data = tinyToTiptap(item.data);
|
||||||
return item;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -72,16 +72,16 @@ const migrations = [
|
|||||||
version: 5.6,
|
version: 5.6,
|
||||||
items: {
|
items: {
|
||||||
notebook: (item) => {
|
notebook: (item) => {
|
||||||
if (!item.topics) return item;
|
if (!item.topics) return false;
|
||||||
|
|
||||||
item.topics = item.topics.map((topic) => {
|
item.topics = item.topics.map((topic) => {
|
||||||
delete topic.notes;
|
delete topic.notes;
|
||||||
return topic;
|
return topic;
|
||||||
});
|
});
|
||||||
return item;
|
return item.topics.length > 0;
|
||||||
},
|
},
|
||||||
settings: async (item, db) => {
|
settings: async (item, db) => {
|
||||||
if (!item.pins) return item;
|
if (!item.pins) return false;
|
||||||
|
|
||||||
for (const pin of item.pins) {
|
for (const pin of item.pins) {
|
||||||
if (!pin.data) continue;
|
if (!pin.data) continue;
|
||||||
@@ -94,7 +94,7 @@ const migrations = [
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
delete item.pins;
|
delete item.pins;
|
||||||
return item;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -102,26 +102,28 @@ const migrations = [
|
|||||||
version: 5.7,
|
version: 5.7,
|
||||||
items: {
|
items: {
|
||||||
tiny: (item) => {
|
tiny: (item) => {
|
||||||
if (!item.data || item.data.iv) return item;
|
if (!item.data || item.data.iv) return false;
|
||||||
item.type = "tiptap";
|
item.type = "tiptap";
|
||||||
return changeSessionContentType(item);
|
return changeSessionContentType(item);
|
||||||
},
|
},
|
||||||
content: (item) => {
|
content: (item) => {
|
||||||
if (!item.data || item.data.iv) return item;
|
if (!item.data || item.data.iv) return false;
|
||||||
|
const oldType = item.type;
|
||||||
item.type = "tiptap";
|
item.type = "tiptap";
|
||||||
return item;
|
return oldType !== item.type;
|
||||||
},
|
},
|
||||||
shortcut: (item) => {
|
shortcut: (item) => {
|
||||||
if (item.id === item.item.id) return item;
|
if (item.id === item.item.id) return false;
|
||||||
item.id = item.item.id;
|
item.id = item.item.id;
|
||||||
return item;
|
return true;
|
||||||
},
|
},
|
||||||
tiptap: (item) => {
|
tiptap: (item) => {
|
||||||
return changeSessionContentType(item);
|
return changeSessionContentType(item);
|
||||||
},
|
},
|
||||||
notehistory: (item) => {
|
notehistory: (item) => {
|
||||||
|
const oldType = item.type;
|
||||||
item.type = "session";
|
item.type = "session";
|
||||||
return item;
|
return oldType !== item.type;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
collection: async (collection) => {
|
collection: async (collection) => {
|
||||||
@@ -144,15 +146,17 @@ export async function migrateItem(item, version, type, database) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let count = 0;
|
||||||
for (; migrationStartIndex < migrations.length; ++migrationStartIndex) {
|
for (; migrationStartIndex < migrations.length; ++migrationStartIndex) {
|
||||||
const migration = migrations[migrationStartIndex];
|
const migration = migrations[migrationStartIndex];
|
||||||
if (migration.version === CURRENT_DATABASE_VERSION) break;
|
if (migration.version === CURRENT_DATABASE_VERSION) break;
|
||||||
|
|
||||||
const itemMigrator = migration.items && migration.items[type];
|
const itemMigrator = migration.items && migration.items[type];
|
||||||
if (!itemMigrator) continue;
|
if (!itemMigrator) continue;
|
||||||
item = await itemMigrator(item, database);
|
if (await itemMigrator(item, database)) count++;
|
||||||
}
|
}
|
||||||
return item;
|
|
||||||
|
return count > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function migrateCollection(collection, version) {
|
export async function migrateCollection(collection, version) {
|
||||||
@@ -182,7 +186,7 @@ function replaceDateEditedWithDateModified(removeDateEditedProperty = false) {
|
|||||||
item.dateModified = item.dateEdited;
|
item.dateModified = item.dateEdited;
|
||||||
if (removeDateEditedProperty) delete item.dateEdited;
|
if (removeDateEditedProperty) delete item.dateEdited;
|
||||||
delete item.persistDateEdited;
|
delete item.persistDateEdited;
|
||||||
return item;
|
return true;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,6 +284,7 @@ function changeSessionContentType(item) {
|
|||||||
if (item.id.endsWith("_content")) {
|
if (item.id.endsWith("_content")) {
|
||||||
item.contentType = item.type;
|
item.contentType = item.type;
|
||||||
item.type = "sessioncontent";
|
item.type = "sessioncontent";
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return item;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user