added toggle banned endpoint

This commit is contained in:
Miodec 2023-06-07 14:53:53 +02:00
parent 45eb1e8a40
commit 0107530eae
6 changed files with 57 additions and 0 deletions

View file

@ -831,3 +831,24 @@ export async function reportUser(
return new MonkeyResponse("User reported");
}
export async function toggleBan(
req: MonkeyTypes.Request
): Promise<MonkeyResponse> {
const { uid } = req.body;
const user = await UserDAL.getUser(uid, "toggle ban");
const discordId = user.discordId;
if (user.banned) {
UserDAL.setBanned(uid, false);
if (discordId) GeorgeQueue.userBanned(discordId, false);
} else {
UserDAL.setBanned(uid, true);
if (discordId) GeorgeQueue.userBanned(discordId, true);
}
return new MonkeyResponse(`Ban toggled`, {
banned: !user.banned,
});
}

View file

@ -7,6 +7,7 @@ import {
validateRequest,
validateConfiguration,
checkUserPermissions,
useInProduction,
} from "../../middlewares/api-utils";
import * as RateLimit from "../../middlewares/rate-limit";
import { withApeRateLimiter } from "../../middlewares/ape-rate-limit";
@ -15,6 +16,12 @@ import filterSchema from "../schemas/filter-schema";
const router = Router();
const checkIfUserIsAdmin = checkUserPermissions({
criteria: (user) => {
return !!user.admin;
},
});
const tagNameValidation = joi
.string()
.required()
@ -614,4 +621,11 @@ router.post(
asyncHandler(UserController.sendForgotPasswordEmail)
);
router.post(
"/toggleBan",
RateLimit.onePerMin,
useInProduction([authenticateRequest(), checkIfUserIsAdmin]),
asyncHandler(UserController.toggleBan)
);
export default router;

View file

@ -991,3 +991,11 @@ export async function updateStreak(
return streak.length;
}
export async function setBanned(uid: string, banned: boolean): Promise<void> {
if (banned) {
await getUsersCollection().updateOne({ uid }, { $set: { banned: true } });
} else {
await getUsersCollection().updateOne({ uid }, { $unset: { banned: "" } });
}
}

View file

@ -98,6 +98,13 @@ export async function incrementBadAuth(
} catch (error) {}
}
export const onePerMin = rateLimit({
windowMs: 60 * 1000,
max: 1 * REQUEST_MULTIPLIER,
keyGenerator: getKeyWithUid,
handler: customHandler,
});
// Config Routing
export const configUpdate = rateLimit({
windowMs: ONE_HOUR_MS,

View file

@ -45,6 +45,12 @@ class GeorgeQueue extends MonkeyQueue<GeorgeTask> {
await this.add(taskName, awardChallengeTask);
}
async userBanned(discordId: string, banned: boolean): Promise<void> {
const taskName = "userBanned";
const userBannedTask = buildGeorgeTask(taskName, [discordId, banned]);
await this.add(taskName, userBannedTask);
}
async announceLeaderboardUpdate(
newRecords: any[],
leaderboardId: string

View file

@ -178,6 +178,7 @@ declare namespace MonkeyTypes {
uid: string;
quoteMod?: boolean;
configurationMod?: boolean;
admin?: boolean;
canReport?: boolean;
banned?: boolean;
canManageApeKeys?: boolean;