From 3fe34c7758c47f5f45ea2fc0de3ff81b459d1d5e Mon Sep 17 00:00:00 2001 From: zkldi Date: Tue, 12 Oct 2021 22:58:54 +0100 Subject: [PATCH] Add an admin delete score endpoint. --- server/src/lib/delete-scores/delete-scores.ts | 2 +- .../server/router/api/v1/admin/router.test.ts | 28 ++++++++++++++++++- .../src/server/router/api/v1/admin/router.ts | 27 ++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/server/src/lib/delete-scores/delete-scores.ts b/server/src/lib/delete-scores/delete-scores.ts index 985a3ae59..0703c857f 100644 --- a/server/src/lib/delete-scores/delete-scores.ts +++ b/server/src/lib/delete-scores/delete-scores.ts @@ -188,5 +188,5 @@ export async function RevertImport(importDocument: ImportDocument) { scoreID: { $in: importDocument.scoreIDs }, }); - await RemoveMultipleScores(scores); + await DeleteMultipleScores(scores); } diff --git a/server/src/server/router/api/v1/admin/router.test.ts b/server/src/server/router/api/v1/admin/router.test.ts index 974f5bdb6..5ece3f9f4 100644 --- a/server/src/server/router/api/v1/admin/router.test.ts +++ b/server/src/server/router/api/v1/admin/router.test.ts @@ -1,10 +1,14 @@ +import db from "external/mongo/db"; import { ONE_MINUTE } from "lib/constants/time"; import { ChangeRootLogLevel, GetLogLevel } from "lib/logger/logger"; import { ServerConfig } from "lib/setup/config"; import t from "tap"; - +import deepmerge from "deepmerge"; import { CreateFakeAuthCookie } from "test-utils/fake-auth"; import mockApi from "test-utils/mock-api"; +import ResetDBState from "test-utils/resets"; +import { TestingIIDXSPScore } from "test-utils/test-data"; +import { ScoreDocument } from "tachi-common"; const LOG_LEVEL = ServerConfig.LOG_LEVEL; @@ -58,3 +62,25 @@ t.test("POST /api/v1/admin/change-log-level", async (t) => { t.end(); }); + +t.test("POST /api/v1/admin/delete-score", async (t) => { + t.beforeEach(ResetDBState); + + await db.scores.insert( + deepmerge(TestingIIDXSPScore, { + scoreID: "deleteme", + }) + ); + + const res = await mockApi.post("/api/v1/admin/delete-score").send({ + scoreID: "deleteme", + }); + + t.equal(res.statusCode, 200); + + const dbScore = await db.scores.findOne({ scoreID: "deleteme" }); + + t.equal(dbScore, null, "Should remove teh score from the database."); + + t.end(); +}); diff --git a/server/src/server/router/api/v1/admin/router.ts b/server/src/server/router/api/v1/admin/router.ts index 7e9bd16da..85c754856 100644 --- a/server/src/server/router/api/v1/admin/router.ts +++ b/server/src/server/router/api/v1/admin/router.ts @@ -10,6 +10,7 @@ import { ServerConfig, ServerTypeInfo } from "lib/setup/config"; import { Game, UserAuthLevels } from "tachi-common"; import db from "external/mongo/db"; +import { DeleteScore } from "lib/delete-scores/delete-scores"; const logger = CreateLogCtx(__filename); @@ -207,4 +208,30 @@ router.post( } ); +/** + * Force Delete anyones score. + * + * @param scoreID - The scoreID to delete. + * + * @name POST /api/v1/admin/delete-score + */ +router.post("/delete-score", prValidate({ scoreID: "string" }), async (req, res) => { + const score = await db.scores.findOne({ scoreID: req.body.scoreID }); + + if (!score) { + return res.status(404).json({ + success: false, + description: `This score does not exist.`, + }); + } + + await DeleteScore(score); + + return res.status(200).json({ + success: true, + description: `Removed score.`, + body: {}, + }); +}); + export default router;