Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 14 additions & 8 deletions backend/__tests__/api/controllers/user.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ describe("user controller test", () => {
});
});
describe("getTestActivity", () => {
const getUserMock = vi.spyOn(UserDal, "getUser");
const getUserMock = vi.spyOn(UserDal, "getPartialUser");
afterAll(() => {
getUserMock.mockReset();
});
Expand Down Expand Up @@ -303,7 +303,7 @@ describe("user controller test", () => {
});

describe("toggle ban", () => {
const getUserMock = vi.spyOn(UserDal, "getUser");
const getUserMock = vi.spyOn(UserDal, "getPartialUser");
const setBannedMock = vi.spyOn(UserDal, "setBanned");
const georgeUserBannedMock = vi.spyOn(GeorgeQueue, "userBanned");
const isAdminMock = vi.spyOn(AdminUuids, "isAdmin");
Expand Down Expand Up @@ -340,7 +340,10 @@ describe("user controller test", () => {
.expect(200);

//THEN
expect(getUserMock).toHaveBeenLastCalledWith(uid, "toggle ban");
expect(getUserMock).toHaveBeenLastCalledWith(uid, "toggle ban", [
"banned",
"discordId",
]);
expect(setBannedMock).toHaveBeenCalledWith(uid, true);
expect(georgeUserBannedMock).toHaveBeenCalledWith("discordId", true);
});
Expand Down Expand Up @@ -392,7 +395,10 @@ describe("user controller test", () => {
.expect(200);

//THEN
expect(getUserMock).toHaveBeenLastCalledWith(uid, "toggle ban");
expect(getUserMock).toHaveBeenLastCalledWith(uid, "toggle ban", [
"banned",
"discordId",
]);
expect(setBannedMock).toHaveBeenCalledWith(uid, false);
expect(georgeUserBannedMock).toHaveBeenCalledWith("discordId", false);
});
Expand Down Expand Up @@ -425,7 +431,7 @@ describe("user controller test", () => {
});

describe("delete user", () => {
const getUserMock = vi.spyOn(UserDal, "getUser");
const getUserMock = vi.spyOn(UserDal, "getPartialUser");
const deleteUserMock = vi.spyOn(UserDal, "deleteUser");
const firebaseDeleteUserMock = vi.spyOn(AuthUtils, "deleteUser");
const deleteAllApeKeysMock = vi.spyOn(ApeKeys, "deleteAllApeKeys");
Expand Down Expand Up @@ -537,7 +543,7 @@ describe("user controller test", () => {
});
});
describe("link discord", () => {
const getUserMock = vi.spyOn(UserDal, "getUser");
const getUserMock = vi.spyOn(UserDal, "getPartialUser");
const isDiscordIdAvailableMock = vi.spyOn(UserDal, "isDiscordIdAvailable");
const isStateValidForUserMock = vi.spyOn(
DiscordUtils,
Expand Down Expand Up @@ -601,7 +607,7 @@ describe("user controller test", () => {
});
});
describe("getCurrentTestActivity", () => {
const getUserMock = vi.spyOn(UserDal, "getUser");
const getUserMock = vi.spyOn(UserDal, "getPartialUser");

afterEach(() => {
getUserMock.mockReset();
Expand Down Expand Up @@ -635,7 +641,7 @@ describe("user controller test", () => {
});
});
describe("getStreak", () => {
const getUserMock = vi.spyOn(UserDal, "getUser");
const getUserMock = vi.spyOn(UserDal, "getPartialUser");

afterEach(() => {
getUserMock.mockReset();
Expand Down
42 changes: 42 additions & 0 deletions backend/__tests__/dal/user.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -849,4 +849,46 @@ describe("UserDal", () => {
expect(year2024[93]).toEqual(2);
});
});
describe("getPartialUser", () => {
it("should throw for unknown user", async () => {
expect(async () =>
UserDAL.getPartialUser("1234", "stack", [])
).rejects.toThrowError("User not found\nStack: stack");
});

it("should get streak", async () => {
//GIVEN
let user = await UserTestData.createUser({
streak: {
hourOffset: 1,
length: 5,
lastResultTimestamp: 4711,
maxLength: 23,
},
});

//WHEN
const partial = await UserDAL.getPartialUser(user.uid, "streak", [
"streak",
]);

//THEN
expect(partial).toStrictEqual({
_id: user._id,
streak: {
hourOffset: 1,
length: 5,
lastResultTimestamp: 4711,
maxLength: 23,
},
});
});
});
describe("updateEmail", () => {
it("throws for nonexisting user", async () => {
expect(async () =>
UserDAL.updateEmail(123, "test@example.com")
).rejects.toThrowError("User not found\nStack: update email");
});
});
});
8 changes: 4 additions & 4 deletions backend/src/api/controllers/quote.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import _ from "lodash";
import { v4 as uuidv4 } from "uuid";
import { getUser, updateQuoteRatings } from "../../dal/user";
import { getPartialUser, updateQuoteRatings } from "../../dal/user";
import * as ReportDAL from "../../dal/report";
import * as NewQuotesDAL from "../../dal/new-quotes";
import * as QuoteRatingsDAL from "../../dal/quote-ratings";
Expand All @@ -21,7 +21,7 @@ export async function getQuotes(
): Promise<MonkeyResponse> {
const { uid } = req.ctx.decodedToken;
const quoteMod: boolean | undefined | string = (
await getUser(uid, "get quotes")
await getPartialUser(uid, "get quotes", ["quoteMod"])
).quoteMod;
let quoteModString: string;
if (quoteMod === true) {
Expand Down Expand Up @@ -63,7 +63,7 @@ export async function approveQuote(
const { uid } = req.ctx.decodedToken;
const { quoteId, editText, editSource } = req.body;

const { name } = await getUser(uid, "approve quote");
const { name } = await getPartialUser(uid, "approve quote", ["name"]);

if (!name) {
throw new MonkeyError(500, "Missing name field");
Expand Down Expand Up @@ -103,7 +103,7 @@ export async function submitRating(
const { uid } = req.ctx.decodedToken;
const { quoteId, rating, language } = req.body;

const user = await getUser(uid, "submit rating");
const user = await getPartialUser(uid, "submit rating", ["quoteRatings"]);

const normalizedQuoteId = parseInt(quoteId as string, 10);
const normalizedRating = Math.round(parseInt(rating as string, 10));
Expand Down
2 changes: 1 addition & 1 deletion backend/src/api/controllers/result.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ export async function updateTags(
result.numbers = false;
}

const user = await UserDAL.getUser(uid, "update tags");
const user = await UserDAL.getPartialUser(uid, "update tags", ["tags"]);
const tagPbs = await UserDAL.checkIfTagPb(uid, user, result);
return new MonkeyResponse("Result tags updated", {
tagPbs,
Expand Down
67 changes: 53 additions & 14 deletions backend/src/api/controllers/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,11 @@ export async function sendVerificationEmail(
throw new MonkeyError(400, "Email already verified");
}

const userInfo = await UserDAL.getUser(uid, "request verification email");
const userInfo = await UserDAL.getPartialUser(
uid,
"request verification email",
["uid", "name", "email"]
);

if (userInfo.email !== email) {
throw new MonkeyError(
Expand Down Expand Up @@ -150,9 +154,10 @@ export async function sendForgotPasswordEmail(

try {
const uid = (await FirebaseAdmin().auth().getUserByEmail(email)).uid;
const userInfo = await UserDAL.getUser(
const userInfo = await UserDAL.getPartialUser(
uid,
"request forgot password email"
"request forgot password email",
["name"]
);

const link = await FirebaseAdmin()
Expand All @@ -179,7 +184,12 @@ export async function deleteUser(
): Promise<MonkeyResponse> {
const { uid } = req.ctx.decodedToken;

const userInfo = await UserDAL.getUser(uid, "delete user");
const userInfo = await UserDAL.getPartialUser(uid, "delete user", [
"banned",
"name",
"email",
"discordId",
]);

if (userInfo.banned === true) {
await BlocklistDal.add(userInfo);
Expand Down Expand Up @@ -215,7 +225,12 @@ export async function resetUser(
): Promise<MonkeyResponse> {
const { uid } = req.ctx.decodedToken;

const userInfo = await UserDAL.getUser(uid, "reset user");
const userInfo = await UserDAL.getPartialUser(uid, "reset user", [
"banned",
"discordId",
"email",
"name",
]);
if (userInfo.banned) {
throw new MonkeyError(403, "Banned users cannot reset their account");
}
Expand Down Expand Up @@ -247,7 +262,12 @@ export async function updateName(
const { uid } = req.ctx.decodedToken;
const { name } = req.body;

const user = await UserDAL.getUser(uid, "update name");
const user = await UserDAL.getPartialUser(uid, "update name", [
"name",
"banned",
"needsToChangeName",
"lastNameChange",
]);

if (user.banned) {
throw new MonkeyError(403, "Banned users cannot change their name");
Expand Down Expand Up @@ -486,7 +506,10 @@ export async function linkDiscord(
throw new MonkeyError(403, "Invalid user token");
}

const userInfo = await UserDAL.getUser(uid, "link discord");
const userInfo = await UserDAL.getPartialUser(uid, "link discord", [
"banned",
"discordId",
]);
if (userInfo.banned) {
throw new MonkeyError(403, "Banned accounts cannot link with Discord");
}
Expand Down Expand Up @@ -538,7 +561,10 @@ export async function unlinkDiscord(
): Promise<MonkeyResponse> {
const { uid } = req.ctx.decodedToken;

const userInfo = await UserDAL.getUser(uid, "unlink discord");
const userInfo = await UserDAL.getPartialUser(uid, "unlink discord", [
"banned",
"discordId",
]);

if (userInfo.banned) {
throw new MonkeyError(403, "Banned accounts cannot unlink Discord");
Expand Down Expand Up @@ -822,7 +848,10 @@ export async function updateProfile(
const { uid } = req.ctx.decodedToken;
const { bio, keyboard, socialProfiles, selectedBadgeId } = req.body;

const user = await UserDAL.getUser(uid, "update user profile");
const user = await UserDAL.getPartialUser(uid, "update user profile", [
"banned",
"inventory",
]);

if (user.banned) {
throw new MonkeyError(403, "Banned users cannot update their profile");
Expand Down Expand Up @@ -908,7 +937,9 @@ export async function setStreakHourOffset(
const { uid } = req.ctx.decodedToken;
const { hourOffset } = req.body;

const user = await UserDAL.getUser(uid, "update user profile");
const user = await UserDAL.getPartialUser(uid, "update user profile", [
"streak",
]);

if (
user.streak?.hourOffset !== undefined &&
Expand All @@ -927,7 +958,10 @@ export async function toggleBan(
): Promise<MonkeyResponse> {
const { uid } = req.body;

const user = await UserDAL.getUser(uid, "toggle ban");
const user = await UserDAL.getPartialUser(uid, "toggle ban", [
"banned",
"discordId",
]);
const discordId = user.discordId;
const discordIdIsValid = discordId !== undefined && discordId !== "";

Expand Down Expand Up @@ -1036,7 +1070,10 @@ export async function getTestActivity(
): Promise<MonkeyResponse> {
const { uid } = req.ctx.decodedToken;
const premiumFeaturesEnabled = req.ctx.configuration.users.premium.enabled;
const user = await UserDAL.getUser(uid, "testActivity");
const user = await UserDAL.getPartialUser(uid, "testActivity", [
"testActivity",
"premium",
]);
const userHasPremium = await UserDAL.checkIfUserIsPremium(uid, user);

if (!premiumFeaturesEnabled) {
Expand All @@ -1063,7 +1100,9 @@ export async function getCurrentTestActivity(
): Promise<MonkeyResponse> {
const { uid } = req.ctx.decodedToken;

const user = await UserDAL.getUser(uid, "current test activity");
const user = await UserDAL.getPartialUser(uid, "current test activity", [
"testActivity",
]);
const data = generateCurrentTestActivity(user.testActivity);
return new MonkeyResponse("Current test activity data retrieved", data);
}
Expand All @@ -1073,7 +1112,7 @@ export async function getStreak(
): Promise<MonkeyResponse> {
const { uid } = req.ctx.decodedToken;

const user = await UserDAL.getUser(uid, "streak");
const user = await UserDAL.getPartialUser(uid, "streak", ["streak"]);

return new MonkeyResponse("Streak data retrieved", user.streak);
}
Loading