From 104d3e22a4085941be62e85f87d54432f7209073 Mon Sep 17 00:00:00 2001 From: zkldi <20380519+zkldi@users.noreply.github.com> Date: Tue, 1 Mar 2022 16:05:06 +0000 Subject: [PATCH] Assorted critical PMS database fixes. --- server/src/external/mongo/sequence-docs.ts | 13 ++++++ server/src/lib/jobs/bms-table-sync.ts | 12 ++++++ server/src/scripts/sync-database.ts | 48 ++++++++------------- server/src/test-utils/mock-db/counters.json | 4 +- server/src/utils/db.ts | 28 ++++++++++++ server/src/utils/misc.ts | 8 ++++ 6 files changed, 80 insertions(+), 33 deletions(-) diff --git a/server/src/external/mongo/sequence-docs.ts b/server/src/external/mongo/sequence-docs.ts index e4036bdad..2b50d07c0 100644 --- a/server/src/external/mongo/sequence-docs.ts +++ b/server/src/external/mongo/sequence-docs.ts @@ -24,6 +24,15 @@ export async function InitSequenceDocs() { } ); + const largestPMSSongID = await db.songs.pms.findOne( + {}, + { + sort: { + id: -1, + }, + } + ); + const Counters = [ { counterName: "users", @@ -33,6 +42,10 @@ export async function InitSequenceDocs() { counterName: "bms-song-id", value: largestBMSSongID ? largestBMSSongID.id + 1 : 1, }, + { + counterName: "pms-song-id", + value: largestPMSSongID ? largestPMSSongID.id + 1 : 1, + }, ]; logger.verbose( diff --git a/server/src/lib/jobs/bms-table-sync.ts b/server/src/lib/jobs/bms-table-sync.ts index 54c19377f..5ee519f04 100644 --- a/server/src/lib/jobs/bms-table-sync.ts +++ b/server/src/lib/jobs/bms-table-sync.ts @@ -108,6 +108,7 @@ import CreateLogCtx from "lib/logger/logger"; import fetch from "node-fetch"; import { ChartDocument } from "tachi-common"; import { CreateFolderID } from "utils/folder"; +import { FormatBMSTables } from "utils/misc"; // this seems to be all we care about interface TableJSONDoc { @@ -151,6 +152,17 @@ async function ImportTableLevels(tableJSON: TableJSONDoc[], prefix: string) { } ); + await db.songs.bms.update( + { + id: chart.songID, + }, + { + $set: { + "data.tableString": FormatBMSTables(tableFolders), + }, + } + ); + success++; } diff --git a/server/src/scripts/sync-database.ts b/server/src/scripts/sync-database.ts index b55b61603..61453742b 100644 --- a/server/src/scripts/sync-database.ts +++ b/server/src/scripts/sync-database.ts @@ -18,11 +18,17 @@ import { TableDocument, } from "tachi-common"; import { RecalcAllScores } from "utils/calculations/recalc-scores"; +import { UpdateGameSongIDCounter } from "utils/db"; import { InitaliseFolderChartLookup } from "utils/folder"; interface SyncInstructions { pattern: RegExp; - handler: (c: any[], collection: ICollection, logger: KtLogger) => Promise; + handler: ( + c: any[], + collection: ICollection, + logger: KtLogger, + collectionName: string + ) => Promise; } async function RemoveNotPresent( @@ -125,11 +131,12 @@ async function GenericUpsert( const syncInstructions: SyncInstructions[] = [ { - pattern: /^charts-bms$/u, + pattern: /^charts-(b|p)ms/u, handler: async ( charts: ChartDocument[], collection: ICollection, - logger + logger, + collectionName ) => { const r = await GenericUpsert(charts, collection, "chartID", logger, false); @@ -137,33 +144,7 @@ const syncInstructions: SyncInstructions[] = [ await InitaliseFolderChartLookup(); await UpdateIsPrimaryStatus(); - const largestBMSSongID = await db.songs.bms.findOne( - {}, - { - sort: { - id: -1, - }, - } - ); - - if (!largestBMSSongID) { - logger.severe( - `No BMS charts loaded, yet BMS sync was attempted? Lost state on bms-song-id counter. Panicking.`, - r - ); - throw new Error(`No BMS charts loaded, yet BMS sync was attempted.`); - } - - await db.counters.update( - { - counterName: "bms-song-id", - }, - { - $set: { - value: largestBMSSongID.id + 1, - }, - } - ); + await UpdateGameSongIDCounter(collectionName.includes("bms") ? "bms" : "pms"); await RecalcAllScores({ chartID: { $in: r.changedFields }, @@ -259,7 +240,12 @@ async function SynchroniseDBWithSeeds() { for (const syncInst of syncInstructions) { if (collectionName.match(syncInst.pattern)) { spawnLogger.verbose(`Starting handler...`); - await syncInst.handler(data, monkDB.get(collectionName), spawnLogger); + await syncInst.handler( + data, + monkDB.get(collectionName), + spawnLogger, + collectionName + ); matchedSomething = true; break; } diff --git a/server/src/test-utils/mock-db/counters.json b/server/src/test-utils/mock-db/counters.json index 999290e8a..7e0099572 100644 --- a/server/src/test-utils/mock-db/counters.json +++ b/server/src/test-utils/mock-db/counters.json @@ -8,11 +8,11 @@ "value": 2 }, { - "counterName": "usc-song-id", + "counterName": "bms-song-id", "value": 2 }, { - "counterName": "bms-song-id", + "counterName": "pms-song-id", "value": 2 } ] \ No newline at end of file diff --git a/server/src/utils/db.ts b/server/src/utils/db.ts index 4f5ebe8b2..248859f56 100644 --- a/server/src/utils/db.ts +++ b/server/src/utils/db.ts @@ -68,3 +68,31 @@ export async function GetRelevantSongsAndCharts( return { songs, charts }; } + +export async function UpdateGameSongIDCounter(game: "bms" | "pms") { + const largestSongID = await db.songs[game].findOne( + {}, + { + sort: { id: -1 }, + projection: { id: 1 }, + } + ); + + if (!largestSongID) { + logger.severe( + `No ${game} charts loaded, yet BMS sync was attempted? Lost state on ${game}-song-id counter. Panicking.` + ); + throw new Error(`No BMS charts loaded, yet BMS sync was attempted.`); + } + + await db.counters.update( + { + counterName: `${game}-song-id`, + }, + { + $set: { + value: largestSongID.id + 1, + }, + } + ); +} diff --git a/server/src/utils/misc.ts b/server/src/utils/misc.ts index 61d3be3a8..95a067ab9 100644 --- a/server/src/utils/misc.ts +++ b/server/src/utils/misc.ts @@ -183,3 +183,11 @@ export function asyncExec(command: string) { }); }); } + +export function FormatBMSTables(bmsTables: { table: string; level: string }[]) { + if (bmsTables.length === 0) { + return null; + } + + return bmsTables.map((e) => `${e.table}${e.level}`).join(", "); +}