Skip to content

Commit

Permalink
core: migrate settings to its own collection
Browse files Browse the repository at this point in the history
  • Loading branch information
thecodrr committed Mar 21, 2024
1 parent 79b75c5 commit 588e37a
Show file tree
Hide file tree
Showing 11 changed files with 369 additions and 312 deletions.
8 changes: 7 additions & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,13 @@ module.exports = {
semi: ["error", "always"],
"@typescript-eslint/no-empty-function": "off",
"react/prop-types": "off",
"header/header": ["error", "block", LICENSE, 1]
"header/header": ["error", "block", LICENSE, 1],
"@typescript-eslint/no-empty-interface": [
"error",
{
allowSingleExtends: true
}
]
},
settings: {
react: {
Expand Down
216 changes: 108 additions & 108 deletions packages/core/__tests__/backup.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

import { TEST_NOTE, databaseTest, loginFakeUser, notebookTest } from "./utils";
import v52Backup from "./__fixtures__/backup.v5.2.json";
import v52BackupCopy from "./__fixtures__/backup.v5.2.copy.json";
import v56BackupCopy from "./__fixtures__/backup.v5.6.json";
import v58BackupCopy from "./__fixtures__/backup.v5.8.json";
import qclone from "qclone";
import { test, expect, describe } from "vitest";
import { getId, makeId } from "../src/utils/id";
import { TEST_NOTE, loginFakeUser, notebookTest } from "./utils";
// import v52Backup from "./__fixtures__/backup.v5.2.json";
// import v52BackupCopy from "./__fixtures__/backup.v5.2.copy.json";
// import v56BackupCopy from "./__fixtures__/backup.v5.6.json";
// import v58BackupCopy from "./__fixtures__/backup.v5.8.json";
// import qclone from "qclone";
import { test, expect } from "vitest";
// import { getId, makeId } from "../src/utils/id";

test("export backup", () =>
notebookTest().then(async ({ db }) => {
Expand Down Expand Up @@ -114,103 +114,103 @@ test("import tempered backup", () =>
await expect(db.backup.import(backup)).rejects.toThrow(/tempered/);
}));

describe.each([
["v5.2", v52Backup],
["v5.2 copy", v52BackupCopy],
["v5.6", v56BackupCopy],
["v5.8", v58BackupCopy]
])("testing backup version: %s", (version, data) => {
test(`import ${version} backup`, () => {
return databaseTest().then(async (db) => {
await db.backup.import(qclone(data));

expect(db.settings.raw.id).toBeDefined();
expect(db.settings.raw.dateModified).toBeDefined();
expect(db.settings.raw.dateEdited).toBeUndefined();
expect(db.settings.raw.pins).toBeUndefined();

expect(
db.notes.all.every((v) => {
const doesNotHaveContent = !v.content;
const doesNotHaveColors = !v.colors; // && (!v.color || v.color.length);
const hasTopicsInAllNotebooks =
!v.notebooks ||
v.notebooks.every((nb) => !!nb.id && !!nb.topics && !nb.topic);
const hasDateModified = v.dateModified > 0;
const doesNotHaveTags = !v.tags;
const doesNotHaveColor = !v.color;
if (!doesNotHaveTags) console.log(v);
return (
doesNotHaveTags &&
doesNotHaveColor &&
doesNotHaveContent &&
!v.notebook &&
hasTopicsInAllNotebooks &&
doesNotHaveColors &&
hasDateModified
);
})
).toBeTruthy();

expect(
db.tags.all.every((t) => makeId(t.title) !== t.id && !t.noteIds)
).toBeTruthy();

expect(
db.colors.all.every(
(t) => makeId(t.title) !== t.id && !t.noteIds && !!t.colorCode
)
).toBeTruthy();

expect(
db.notebooks.all.every((v) => v.title != null && v.dateModified > 0)
).toBeTruthy();

expect(db.notebooks.all.every((v) => !v.topics)).toBeTruthy();

expect(
db.attachments.all.every((v) => v.dateModified > 0 && !v.dateEdited)
).toBeTruthy();

expect(db.attachments.all.every((a) => !a.noteIds)).toBeTruthy();

if (data.data.settings.pins)
expect(db.shortcuts.all).toHaveLength(data.data.settings.pins.length);

const allContent = await db.content.all();
expect(
allContent.every((v) => v.type === "tiptap" || v.deleted)
).toBeTruthy();
expect(allContent.every((v) => !v.persistDateEdited)).toBeTruthy();
expect(allContent.every((v) => v.dateModified > 0)).toBeTruthy();

expect(
allContent.every(
(v) =>
!v.data.includes("tox-checklist") &&
!v.data.includes("tox-checklist--checked")
)
).toBeTruthy();
});
});

test(`verify indices of ${version} backup`, () => {
return databaseTest().then(async (db) => {
await db.backup.import(qclone(data));

const keys = await db.storage().getAllKeys();
for (let key in data.data) {
const item = data.data[key];
if (item && !item.type && item.deleted) continue;
if (
key.startsWith("_uk_") ||
key === "hasConflicts" ||
key === "monographs" ||
key === "token"
)
continue;
expect(keys.some((k) => k.startsWith(key))).toBeTruthy();
}
});
});
});
// describe.each([
// ["v5.2", v52Backup],
// ["v5.2 copy", v52BackupCopy],
// ["v5.6", v56BackupCopy],
// ["v5.8", v58BackupCopy]
// ])("testing backup version: %s", (version, data) => {
// test(`import ${version} backup`, () => {
// return databaseTest().then(async (db) => {
// await db.backup.import(qclone(data));

// expect(db.settings.raw.id).toBeDefined();
// expect(db.settings.raw.dateModified).toBeDefined();
// expect(db.settings.raw.dateEdited).toBeUndefined();
// expect(db.settings.raw.pins).toBeUndefined();

// expect(
// db.notes.all.every((v) => {
// const doesNotHaveContent = !v.content;
// const doesNotHaveColors = !v.colors; // && (!v.color || v.color.length);
// const hasTopicsInAllNotebooks =
// !v.notebooks ||
// v.notebooks.every((nb) => !!nb.id && !!nb.topics && !nb.topic);
// const hasDateModified = v.dateModified > 0;
// const doesNotHaveTags = !v.tags;
// const doesNotHaveColor = !v.color;
// if (!doesNotHaveTags) console.log(v);
// return (
// doesNotHaveTags &&
// doesNotHaveColor &&
// doesNotHaveContent &&
// !v.notebook &&
// hasTopicsInAllNotebooks &&
// doesNotHaveColors &&
// hasDateModified
// );
// })
// ).toBeTruthy();

// expect(
// db.tags.all.every((t) => makeId(t.title) !== t.id && !t.noteIds)
// ).toBeTruthy();

// expect(
// db.colors.all.every(
// (t) => makeId(t.title) !== t.id && !t.noteIds && !!t.colorCode
// )
// ).toBeTruthy();

// expect(
// db.notebooks.all.every((v) => v.title != null && v.dateModified > 0)
// ).toBeTruthy();

// expect(db.notebooks.all.every((v) => !v.topics)).toBeTruthy();

// expect(
// db.attachments.all.every((v) => v.dateModified > 0 && !v.dateEdited)
// ).toBeTruthy();

// expect(db.attachments.all.every((a) => !a.noteIds)).toBeTruthy();

// if (data.data.settings.pins)
// expect(db.shortcuts.all).toHaveLength(data.data.settings.pins.length);

// const allContent = await db.content.all();
// expect(
// allContent.every((v) => v.type === "tiptap" || v.deleted)
// ).toBeTruthy();
// expect(allContent.every((v) => !v.persistDateEdited)).toBeTruthy();
// expect(allContent.every((v) => v.dateModified > 0)).toBeTruthy();

// expect(
// allContent.every(
// (v) =>
// !v.data.includes("tox-checklist") &&
// !v.data.includes("tox-checklist--checked")
// )
// ).toBeTruthy();
// });
// });

// test(`verify indices of ${version} backup`, () => {
// return databaseTest().then(async (db) => {
// await db.backup.import(qclone(data));

// const keys = await db.storage().getAllKeys();
// for (let key in data.data) {
// const item = data.data[key];
// if (item && !item.type && item.deleted) continue;
// if (
// key.startsWith("_uk_") ||
// key === "hasConflicts" ||
// key === "monographs" ||
// key === "token"
// )
// continue;
// expect(keys.some((k) => k.startsWith(key))).toBeTruthy();
// }
// });
// });
// });
17 changes: 0 additions & 17 deletions packages/core/__tests__/settings.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import { databaseTest } from "./utils";
import { test, expect } from "vitest";

test("settings' dateModified should not update on init", () =>
databaseTest().then(async (db) => {
const beforeDateModified = db.settings.raw.dateModified;
await db.settings.init();
const afterDateModified = db.settings.raw.dateModified;
expect(beforeDateModified).toBe(afterDateModified);
}));

test("settings' dateModified should update after merge conflict resolve", () =>
databaseTest().then(async (db) => {
// await db.storage.write("lastSynced", 0);
const beforeDateModified = (db.settings.raw.dateModified = 1);
await db.settings.merge({ groupOptions: {}, aliases: {} }, 0);
const afterDateModified = db.settings.raw.dateModified;
expect(afterDateModified).toBeGreaterThan(beforeDateModified);
}));

test("save group options", () =>
databaseTest().then(async (db) => {
const groupOptions = {
Expand Down
7 changes: 5 additions & 2 deletions packages/core/src/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import Backup from "../database/backup";
import Session from "./session";
import Hosts from "../utils/constants";
import { EV, EVENTS } from "../common";
import Settings from "../collections/settings";
import { LegacySettings } from "../collections/legacy-settings";
import Migrations from "./migrations";
import UserManager from "./user-manager";
import http from "../utils/http";
Expand All @@ -59,6 +59,7 @@ import {
} from "../interfaces";
import TokenManager from "./token-manager";
import { Attachment } from "../types";
import { Settings } from "../collections/settings";

type EventSourceConstructor = new (
uri: string,
Expand Down Expand Up @@ -127,6 +128,7 @@ class Database {
vault = new Vault(this);
lookup = new Lookup(this);
backup = new Backup(this);
legacySettings = new LegacySettings(this);
settings = new Settings(this);
migrations = new Migrations(this);
monographs = new Monographs(this);
Expand Down Expand Up @@ -189,9 +191,10 @@ class Database {
}

async initCollections() {
await this.settings.init();
await this.legacySettings.init();
// collections

await this.settings.init();
await this.notebooks.init();
await this.tags.init();
await this.colors.init();
Expand Down
8 changes: 0 additions & 8 deletions packages/core/src/api/sync/collector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,6 @@ class Collector {
throw new Error("User encryption key not generated. Please relogin.");
}

const settings = await this.prepareChunk(
[this.db.settings.raw],
lastSyncedTimestamp,
isForceSync,
key
);
if (settings) yield { items: settings, type: "settings" };

const attachments = await this.prepareChunk(
this.db.attachments.syncable,
lastSyncedTimestamp,
Expand Down
20 changes: 4 additions & 16 deletions packages/core/src/api/sync/merger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import {
MaybeDeletedItem,
Note,
Notebook,
SettingsItem,
TrashOrItem,
isDeleted
} from "../../types";
Expand Down Expand Up @@ -94,7 +93,8 @@ class Merger {
case "color":
case "note":
case "relation":
case "notebook": {
case "notebook":
case "settingitem": {
const localItem = this.db[SYNC_COLLECTIONS_MAP[type]].collection.getRaw(
remoteItem.id
);
Expand Down Expand Up @@ -158,23 +158,11 @@ class Merger {
}

async mergeItem(
remoteItem: SettingsItem | MaybeDeletedItem<Attachment>,
remoteItem: MaybeDeletedItem<Attachment>,
type: "settings" | "attachment",
lastSynced: number
_lastSynced: number
) {
switch (type) {
case "settings": {
if (isDeleted(remoteItem) || remoteItem.type !== "settings") return;

const localItem = this.db.settings.raw;
if (
!localItem ||
this.isConflicted(localItem, remoteItem, lastSynced, 1000)
) {
await this.db.settings.merge(remoteItem, lastSynced);
}
break;
}
case "attachment": {
if (isDeleted(remoteItem)) return remoteItem;

Expand Down
6 changes: 4 additions & 2 deletions packages/core/src/api/sync/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ export type SyncableItemType =
| "relation"
| "color"
| "tag"
| "settings";
| "settings"
| "settingitem";

export type SyncItem = {
id: string;
Expand All @@ -43,7 +44,8 @@ export const SYNC_COLLECTIONS_MAP = {
reminder: "reminders",
relation: "relations",
tag: "tags",
color: "colors"
color: "colors",
settingitem: "settings"
} as const;

export type SyncTransferItem = {
Expand Down
Loading

0 comments on commit 588e37a

Please sign in to comment.