diff --git a/src/routes/getUserInfo.ts b/src/routes/getUserInfo.ts index 274ae6b..ac2b925 100644 --- a/src/routes/getUserInfo.ts +++ b/src/routes/getUserInfo.ts @@ -98,6 +98,15 @@ async function dbGetActiveWarningReasonForUser(userID: HashedUserID): Promise { + try { + const row = await db.prepare("get", `SELECT count(*) as "userCount" FROM "shadowBannedUsers" WHERE "userID" = ? LIMIT 1`, [userID]); + return row?.userCount > 0 ?? false; + } catch (err) { + return false; + } +} + type cases = Record const executeIfFunction = (f: any) => @@ -118,6 +127,7 @@ const dbGetValue = async (userID: HashedUserID, property: string): Promise { const userID = req.query.userID as UserID; const hashedUserID: HashedUserID = userID ? getHash(userID) : req.query.publicUserID as HashedUserID; - const allProperties: string[] = ["userID", "userName", "minutesSaved", "segmentCount", "ignoredSegmentCount", + const defaultProperties: string[] = ["userID", "userName", "minutesSaved", "segmentCount", "ignoredSegmentCount", "viewCount", "ignoredViewCount", "warnings", "warningReason", "reputation", "vip", "lastSegmentID"]; + const allProperties: string[] = [...defaultProperties, "banned"]; let paramValues: string[] = req.query.values ? JSON.parse(req.query.values as string) : req.query.value ? Array.isArray(req.query.value) ? req.query.value : [req.query.value] - : allProperties; + : defaultProperties; if (!Array.isArray(paramValues)) { return res.status(400).send("Invalid values JSON"); } diff --git a/src/routes/postSkipSegments.ts b/src/routes/postSkipSegments.ts index 1db9d4e..6cad4a8 100644 --- a/src/routes/postSkipSegments.ts +++ b/src/routes/postSkipSegments.ts @@ -616,7 +616,7 @@ export async function postSkipSegments(req: Request, res: Response): Promise { await db.prepare("run", insertWarningQuery, [getHash("getuserinfo_warning_2"), 40, "getuserinfo_vip", 0, "warning2-0"]); await db.prepare("run", insertWarningQuery, [getHash("getuserinfo_warning_3"), 50, "getuserinfo_vip", 1, "warning3-0"]); await db.prepare("run", insertWarningQuery, [getHash("getuserinfo_warning_3"), 60, "getuserinfo_vip", 0, "warning3-1"]); + + const insertBanQuery = 'INSERT INTO "shadowBannedUsers" ("userID") VALUES (?)'; + await db.prepare("run", insertBanQuery, [getHash("getuserinfo_ban_01")]); }); it("Should be able to get a 200", (done: Done) => { @@ -172,7 +175,7 @@ describe("getUserInfo", () => { assert.strictEqual(res.status, 200); const data = await res.json(); const expected = { - warningReason: "warning0-0" + warningReason: "warning0-0", }; assert.ok(partialDeepEquals(data, expected)); done(); // pass @@ -232,4 +235,32 @@ describe("getUserInfo", () => { }) .catch(err => done(err)); }); + + it("Should get ban data for banned user (only appears when specifically requested)", (done: Done) => { + fetch(`${getbaseURL()}/api/userInfo?userID=getuserinfo_ban_01&value=banned`) + .then(async res => { + assert.strictEqual(res.status, 200); + const data = await res.json(); + const expected = { + banned: true + }; + assert.ok(partialDeepEquals(data, expected)); + done(); // pass + }) + .catch(err => done(err)); + }); + + it("Should get ban data for unbanned user (only appears when specifically requested)", (done: Done) => { + fetch(`${getbaseURL()}/api/userInfo?userID=getuserinfo_notban_01&value=banned`) + .then(async res => { + assert.strictEqual(res.status, 200); + const data = await res.json(); + const expected = { + banned: false + }; + assert.ok(partialDeepEquals(data, expected)); + done(); // pass + }) + .catch(err => done(err)); + }); });