Skip to content

Commit 2ca6d80

Browse files
authored
fix: handle tipUsers migration for older feed versions (#1384)
* fix: handle tipUsers migration for older feed versions * chore: clean code * test: add migrationTipUser test for feed service * chore: clean code * fix: implement upgradeToV8 for tipUsers migration and add tests * refactor: remove legacy migration function and its tests * chore: clean code
1 parent 3e8de30 commit 2ca6d80

File tree

4 files changed

+58
-8
lines changed

4 files changed

+58
-8
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { afterEach } from "node:test"
2+
3+
import { describe, expect, it } from "vitest"
4+
5+
import { browserDB } from "./db"
6+
7+
describe("upgradeToV8", () => {
8+
afterEach(async () => {
9+
await browserDB.delete()
10+
})
11+
12+
it("should set tipUsers to an empty array if tipUsers is not an array", async () => {
13+
const insertFeeds = [
14+
{ id: 1, tipUsers: {} },
15+
{ id: 2, tipUsers: null },
16+
{ id: 3, tipUsers: [{ name: "user1" }] },
17+
]
18+
// @ts-expect-error
19+
await browserDB.feeds.bulkAdd(insertFeeds)
20+
21+
const feeds = await browserDB.feeds.toArray()
22+
expect(feeds.length).toEqual(3)
23+
expect(feeds[0].tipUsers).toEqual(insertFeeds[0].tipUsers)
24+
expect(feeds[1].tipUsers).toEqual(insertFeeds[1].tipUsers)
25+
expect(feeds[2].tipUsers).toEqual(insertFeeds[2].tipUsers)
26+
27+
await browserDB.transaction("rw", [browserDB.feeds], async (tx) => {
28+
await browserDB.upgradeToV8(tx)
29+
})
30+
const feedsAfterMigrate = await browserDB.feeds.toArray()
31+
expect(feedsAfterMigrate.length).toEqual(3)
32+
expect(feedsAfterMigrate[0].tipUsers).toEqual([])
33+
expect(feedsAfterMigrate[1].tipUsers).toEqual(null)
34+
expect(feedsAfterMigrate[2].tipUsers).toEqual([{ name: "user1" }])
35+
})
36+
})

apps/renderer/src/database/db.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
dbSchemaV5,
1111
dbSchemaV6,
1212
dbSchemaV7,
13+
dbSchemaV8,
1314
} from "./db_schema"
1415
import type { DB_Cleaner } from "./schemas/cleaner"
1516
import type { DB_Entry, DB_EntryRelated } from "./schemas/entry"
@@ -49,6 +50,7 @@ class BrowserDB extends Dexie {
4950
this.version(5).stores(dbSchemaV5)
5051
this.version(6).stores(dbSchemaV6)
5152
this.version(7).stores(dbSchemaV7)
53+
this.version(8).stores(dbSchemaV8).upgrade(this.upgradeToV8)
5254

5355
this.entries = this.table("entries")
5456
this.feeds = this.table("feeds")
@@ -64,6 +66,15 @@ class BrowserDB extends Dexie {
6466
const session = trans.table("feedUnreads")
6567
session.delete("feedId")
6668
}
69+
70+
async upgradeToV8(trans: Transaction) {
71+
// Fix https://github.com/RSSNext/Follow/issues/1308
72+
const session = trans.table("feeds")
73+
return session.toCollection().modify((feed) => {
74+
if (!feed.tipUsers || Array.isArray(feed.tipUsers)) return
75+
feed.tipUsers = []
76+
})
77+
}
6778
}
6879

6980
export const browserDB = new BrowserDB()

apps/renderer/src/database/db_schema.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,5 @@ export const dbSchemaV7 = {
3838
...dbSchemaV6,
3939
inboxes: "&id",
4040
}
41+
42+
export const dbSchemaV8 = dbSchemaV7

apps/renderer/src/initialize/migrates/index.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ declare global {
99
__app_is_upgraded__: boolean
1010
}
1111
}
12-
export const doMigration = () => {
13-
const lastVersion = localStorage.getItem(appVersionKey)
14-
15-
if (lastVersion && lastVersion !== APP_VERSION) {
16-
appLog(`Upgrade from ${lastVersion} to ${APP_VERSION}`)
17-
window.__app_is_upgraded__ = true
1812

19-
// NOTE: Add migration logic here
13+
export const doMigration = async () => {
14+
const lastVersion = localStorage.getItem(appVersionKey)
15+
if (!lastVersion || lastVersion === APP_VERSION) {
16+
localStorage.setItem(appVersionKey, APP_VERSION)
17+
return
2018
}
21-
localStorage.setItem(appVersionKey, APP_VERSION)
19+
// NOTE: Add migration logic here
20+
21+
appLog(`Upgrade from ${lastVersion} to ${APP_VERSION}`)
22+
window.__app_is_upgraded__ = true
2223
}

0 commit comments

Comments
 (0)