From 6b426592bb6459be71c9d7cd0dc00dc3b0b319cd Mon Sep 17 00:00:00 2001 From: zkldi Date: Fri, 1 Oct 2021 01:35:39 +0100 Subject: [PATCH] Add some new endpoint work for manipulating UGPT Gamespecific settings --- .../_game/_playtype/settings/router.test.ts | 56 +++++++++++++++++++ .../games/_game/_playtype/settings/router.ts | 31 ++++++++++ .../src/test-utils/mock-db/game-settings.json | 5 +- 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/server/src/server/router/api/v1/users/_userID/games/_game/_playtype/settings/router.test.ts b/server/src/server/router/api/v1/users/_userID/games/_game/_playtype/settings/router.test.ts index 85d3e95be..13fd80340 100644 --- a/server/src/server/router/api/v1/users/_userID/games/_game/_playtype/settings/router.test.ts +++ b/server/src/server/router/api/v1/users/_userID/games/_game/_playtype/settings/router.test.ts @@ -20,6 +20,9 @@ t.test("GET /api/v1/users/:userID/games/:game/:playtype/settings", (t) => { preferredSessionAlg: null, preferredProfileAlg: null, stats: [], + gameSpecific: { + display2DXTra: false, + }, }, }); @@ -60,6 +63,59 @@ t.test("PATCH /api/v1/users/:userID/games/:game/:playtype/settings", (t) => { preferredSessionAlg: null, preferredProfileAlg: null, stats: [], + gameSpecific: { + display2DXTra: false, + }, + }, + }, + "Should only update the mutated properties." + ); + + const data = await db["game-settings"].findOne({ + userID: 1, + game: "iidx", + playtype: "SP", + }); + + t.equal(data?.preferences.preferredScoreAlg, "ktRating"); + + t.end(); + }); + + t.test("Should update a user's game specific settings.", async (t) => { + await db["api-tokens"].insert({ + userID: 1, + identifier: "api_token", + permissions: { + customise_profile: true, + }, + token: "api_token", + }); + + const res = await mockApi + .patch("/api/v1/users/1/games/iidx/SP/settings") + .set("Authorization", "Bearer api_token") + .send({ + preferredScoreAlg: "ktRating", + gameSpecific: { + display2DXTra: true, + }, + }); + + t.strictSame( + res.body.body, + { + userID: 1, + game: "iidx", + playtype: "SP", + preferences: { + preferredScoreAlg: "ktRating", + preferredSessionAlg: null, + preferredProfileAlg: null, + stats: [], + gameSpecific: { + display2DXTra: true, + }, }, }, "Should only update the mutated properties." diff --git a/server/src/server/router/api/v1/users/_userID/games/_game/_playtype/settings/router.ts b/server/src/server/router/api/v1/users/_userID/games/_game/_playtype/settings/router.ts index b47005dd3..f74f217f9 100644 --- a/server/src/server/router/api/v1/users/_userID/games/_game/_playtype/settings/router.ts +++ b/server/src/server/router/api/v1/users/_userID/games/_game/_playtype/settings/router.ts @@ -35,6 +35,8 @@ router.patch( preferredScoreAlg: p.optional(p.nullable(p.isIn(gptConfig.scoreRatingAlgs))), preferredSessionAlg: p.optional(p.nullable(p.isIn(gptConfig.sessionRatingAlgs))), preferredProfileAlg: p.optional(p.nullable(p.isIn(gptConfig.profileRatingAlgs))), + // This is a pretty stupid IIFE level hack, ah well. + gameSpecific: p.any, }); if (err) { @@ -44,6 +46,29 @@ router.patch( }); } + if (req.body.gameSpecific) { + let schema = {}; + + if (game === "iidx") { + schema = { + display2DXTra: "boolean", + }; + } + const err = p( + req.body, + { gameSpecific: p.optional(schema) }, + {}, + { allowExcessKeys: true } + ); + + if (err) { + return res.status(400).json({ + success: false, + description: FormatPrError(err, "Invalid game-settings."), + }); + } + } + const updateQuery: Record = {}; // @warning Slightly icky dynamic prop assignment instead of copypasta. @@ -55,6 +80,12 @@ router.patch( } } + if (req.body.gameSpecific) { + for (const key in req.body.gameSpecific) { + updateQuery[`preferences.gameSpecific.${key}`] = req.body.gameSpecific[key]; + } + } + if (Object.keys(updateQuery).length === 0) { const settings = await db["game-settings"].findOne({ userID: user.id, diff --git a/server/src/test-utils/mock-db/game-settings.json b/server/src/test-utils/mock-db/game-settings.json index b0857ff71..8ffa629fd 100644 --- a/server/src/test-utils/mock-db/game-settings.json +++ b/server/src/test-utils/mock-db/game-settings.json @@ -7,7 +7,10 @@ "preferredScoreAlg": null, "preferredSessionAlg": null, "preferredProfileAlg": null, - "stats": [] + "stats": [], + "gameSpecific": { + "display2DXTra": false + } } } ] \ No newline at end of file