diff --git a/src/db/schema/v8.ts b/src/db/schema/v8.ts index 44fca26e60a8575893b6ca1dd4407215ec7c3ebd..96890f97322fb1b7b407a93d9c09d6ddc977e525 100644 --- a/src/db/schema/v8.ts +++ b/src/db/schema/v8.ts @@ -62,18 +62,27 @@ export class Schema implements IDbSchema { } log.warn("Migrating rooms from roomstore, this may take a while..."); const rooms = await this.roomStore.select({}); + log.info(`Found ${rooms.length} rooms in the DB`); // Matrix room only entrys are useless. const entrys = rooms.filter((r) => r.remote); + log.info(`Filtered out rooms without remotes. Have ${entrys.length} entries`); + let migrated = 0; for (const e of entrys) { const matrix = new MatrixStoreRoom(e.matrix_id); try { const remote = new RemoteStoreRoom(e.remote_id, e.remote); await store.roomStore.linkRooms(matrix, remote); log.info(`Migrated ${matrix.roomId}`); + migrated++; } catch (ex) { log.error(`Failed to link ${matrix.roomId}: `, ex); } } + if (migrated !== entrys.length) { + log.error(`Didn't migrate all rooms, ${entrys.length - migrated} failed to be migrated.`); + } else { + log.info("Migrated all rooms successfully"); + } } public async rollBack(store: DiscordStore): Promise<void> { diff --git a/test/db/test_roomstore.ts b/test/db/test_roomstore.ts index 45f9f756739b996505f3e7cb0b54e25518189207..fea079ebd855053468ffcb166036c80cc3b04b50 100644 --- a/test/db/test_roomstore.ts +++ b/test/db/test_roomstore.ts @@ -193,3 +193,75 @@ describe("RoomStore", () => { }); }); }); +describe("RoomStore.schema.v8", () => { + it("will successfully migrate rooms", async () => { + const SCHEMA_VERSION = 8; + store = new DiscordStore(":memory:"); + const roomStore = { + select: () => { + return [ + { + _id: "DGFUYs4hlXNDmmw0", + id: "123", + matrix: {extras: {}}, + matrix_id: "!badroom:localhost", + }, + { + _id: "Dd37MWDw57dAQz5p", + data: {}, + id: "!xdnLTCNErGnwsGnmnm:localhost discord_282616294245662720_514843269599985674_bridged", + matrix: { + extras: {}, + }, + matrix_id: "!bridged1:localhost", + remote: { + discord_channel: "514843269599985674", + discord_guild: "282616294245662720", + discord_type: "text", + plumbed: false, + }, + remote_id: "discord_282616294245662720_514843269599985674_bridged", + }, + { + _id: "H3XEftQWj8BZYuCe", + data: {}, + id: "!oGkfjmeNEkJdFasVRF:localhost discord_282616294245662720_520332167952334849", + matrix: { + extras: {}, + }, + matrix_id: "!bridged2:localhost", + remote: { + discord_channel: "514843269599985674", + discord_guild: "282616294245662720", + discord_type: "text", + plumbed: true, + update_icon: true, + update_name: false, + update_topic: true, + }, + remote_id: "discord_282616294245662720_520332167952334849", + }, + ]; + }, + }; + await store.init(SCHEMA_VERSION, roomStore); + expect(await store.roomStore.getEntriesByMatrixId("!badroom:localhost")).to.be.empty; + const bridge1 = (await store.roomStore.getEntriesByMatrixId("!bridged1:localhost"))[0]; + expect(bridge1).to.exist; + expect(bridge1.remote).to.not.be.null; + expect(bridge1.remote!.data.discord_channel).to.be.equal("514843269599985674"); + expect(bridge1.remote!.data.discord_guild).to.be.equal("282616294245662720"); + expect(bridge1.remote!.data.discord_type).to.be.equal("text"); + expect(!!bridge1.remote!.data.plumbed).to.be.false; + const bridge2 = (await store.roomStore.getEntriesByMatrixId("!bridged2:localhost"))[0]; + expect(bridge2).to.exist; + expect(bridge2.remote).to.not.be.null; + expect(bridge2.remote!.data.discord_channel).to.be.equal("514843269599985674"); + expect(bridge2.remote!.data.discord_guild).to.be.equal("282616294245662720"); + expect(bridge2.remote!.data.discord_type).to.be.equal("text"); + expect(!!bridge2.remote!.data.plumbed).to.be.true; + expect(!!bridge2.remote!.data.update_icon).to.be.true; + expect(!!bridge2.remote!.data.update_name).to.be.false; + expect(!!bridge2.remote!.data.update_topic).to.be.true; + }); +});