Skip to content

Commit

Permalink
refactor(types): shared config and preset types (#5024)
Browse files Browse the repository at this point in the history
* build: include all shared types files instead of just one

* move config property value types to a shared file

* backend build issues

* shared preset and config types
preset and config ape types

* typo

* ignoring unused warnings

* fixed merge
  • Loading branch information
Miodec authored Feb 8, 2024
1 parent 67c10a9 commit cdfc783
Show file tree
Hide file tree
Showing 56 changed files with 572 additions and 577 deletions.
2 changes: 1 addition & 1 deletion backend/__tests__/dal/result.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as ResultDal from "../../src/dal/result";
import { ObjectId } from "mongodb";
import * as UserDal from "../../src/dal/user";

type MonkeyTypesResult = SharedTypes.DBResult<SharedTypes.Mode>;
type MonkeyTypesResult = SharedTypes.DBResult<SharedTypes.Config.Mode>;

let uid: string = "";
const timestamp = Date.now() - 60000;
Expand Down
3 changes: 2 additions & 1 deletion backend/src/api/controllers/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -580,7 +580,8 @@ export async function updateLbMemory(
): Promise<MonkeyResponse> {
const { uid } = req.ctx.decodedToken;
const { mode, language, rank } = req.body;
const mode2 = req.body.mode2 as SharedTypes.Mode2<SharedTypes.Mode>;
const mode2 = req.body
.mode2 as SharedTypes.Config.Mode2<SharedTypes.Config.Mode>;

await UserDAL.updateLbMemory(uid, mode, mode2, language, rank);
return new MonkeyResponse("Leaderboard memory updated");
Expand Down
42 changes: 25 additions & 17 deletions backend/src/dal/preset.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import MonkeyError from "../utils/error";
import * as db from "../init/db";
import { ObjectId, Filter } from "mongodb";
import { ObjectId, Filter, Collection, WithId } from "mongodb";

const MAX_PRESETS = 10;
const COLLECTION_NAME = "presets";

function getPresetKeyFilter(uid: string, keyId: string): Filter<any> {
type DBConfigPreset = SharedTypes.WithObjectId<SharedTypes.DBConfigPreset>;

function getPresetKeyFilter(
uid: string,
keyId: string
): Filter<DBConfigPreset> {
return {
_id: new ObjectId(keyId),
uid,
Expand All @@ -16,10 +20,11 @@ interface PresetCreationResult {
presetId: string;
}

// TODO: Add typings for presets/configs, must look into shared type declarations.
export async function getPresets(uid: string): Promise<any[]> {
const presets = await db
.collection(COLLECTION_NAME)
export const getPresetsCollection = (): Collection<WithId<DBConfigPreset>> =>
db.collection<DBConfigPreset>("presets");

export async function getPresets(uid: string): Promise<DBConfigPreset[]> {
const presets = await getPresetsCollection()
.find({ uid })
.sort({ timestamp: -1 })
.toArray(); // this needs to be changed to later take patreon into consideration
Expand All @@ -36,9 +41,12 @@ export async function addPreset(
throw new MonkeyError(409, "Too many presets");
}

const preset = await db
.collection(COLLECTION_NAME)
.insertOne({ uid, name, config } as any);
const preset = await getPresetsCollection().insertOne({
_id: new ObjectId(),
uid,
name,
config,
});
return {
presetId: preset.insertedId.toHexString(),
};
Expand All @@ -54,24 +62,24 @@ export async function editPreset(
config !== undefined && config !== null && Object.keys(config).length > 0
? { name, config }
: { name };
await db
.collection(COLLECTION_NAME)
.updateOne(getPresetKeyFilter(uid, presetId), { $set: presetUpdates });
await getPresetsCollection().updateOne(getPresetKeyFilter(uid, presetId), {
$set: presetUpdates,
});
}

export async function removePreset(
uid: string,
presetId: string
): Promise<void> {
const deleteResult = await db
.collection(COLLECTION_NAME)
.deleteOne(getPresetKeyFilter(uid, presetId));
const deleteResult = await getPresetsCollection().deleteOne(
getPresetKeyFilter(uid, presetId)
);

if (deleteResult.deletedCount === 0) {
throw new MonkeyError(404, "Preset not found");
}
}

export async function deleteAllPresets(uid: string): Promise<void> {
await db.collection(COLLECTION_NAME).deleteMany({ uid });
await getPresetsCollection().deleteMany({ uid });
}
2 changes: 1 addition & 1 deletion backend/src/dal/result.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import * as db from "../init/db";

import { getUser, getTags } from "./user";

type DBResult = SharedTypes.DBResult<SharedTypes.Mode>;
type DBResult = SharedTypes.DBResult<SharedTypes.Config.Mode>;

export async function addResult(
uid: string,
Expand Down
9 changes: 6 additions & 3 deletions backend/src/dal/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ import { flattenObjectDeep, isToday, isYesterday } from "../utils/misc";

const SECONDS_PER_HOUR = 3600;

type Result = Omit<SharedTypes.DBResult<SharedTypes.Mode>, "_id" | "name">;
type Result = Omit<
SharedTypes.DBResult<SharedTypes.Config.Mode>,
"_id" | "name"
>;

// Export for use in tests
export const getUsersCollection = (): Collection<WithId<MonkeyTypes.User>> =>
Expand Down Expand Up @@ -385,8 +388,8 @@ export async function removeTagPb(uid: string, _id: string): Promise<void> {

export async function updateLbMemory(
uid: string,
mode: SharedTypes.Mode,
mode2: SharedTypes.Mode2<SharedTypes.Mode>,
mode: SharedTypes.Config.Mode,
mode2: SharedTypes.Config.Mode2<SharedTypes.Config.Mode>,
language: string,
rank: number
): Promise<void> {
Expand Down
2 changes: 1 addition & 1 deletion backend/src/types/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ declare namespace MonkeyTypes {
_id: ObjectId;
acc: number;
consistency: number;
difficulty: SharedTypes.Difficulty;
difficulty: SharedTypes.Config.Difficulty;
lazyMode: boolean;
language: string;
punctuation: boolean;
Expand Down
9 changes: 6 additions & 3 deletions backend/src/utils/pb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ interface CheckAndUpdatePbResult {
lbPersonalBests?: MonkeyTypes.LbPersonalBests;
}

type Result = Omit<SharedTypes.DBResult<SharedTypes.Mode>, "_id" | "name">;
type Result = Omit<
SharedTypes.DBResult<SharedTypes.Config.Mode>,
"_id" | "name"
>;

export function canFunboxGetPb(result: Result): boolean {
const funbox = result.funbox;
Expand All @@ -32,7 +35,7 @@ export function checkAndUpdatePb(
result: Result
): CheckAndUpdatePbResult {
const mode = result.mode;
const mode2 = result.mode2 as SharedTypes.Mode2<"time">;
const mode2 = result.mode2 as SharedTypes.Config.Mode2<"time">;

const userPb = userPersonalBests ?? {};
userPb[mode] ??= {};
Expand Down Expand Up @@ -155,7 +158,7 @@ function updateLeaderboardPersonalBests(
}

const mode = result.mode;
const mode2 = result.mode2 as SharedTypes.Mode2<"time">;
const mode2 = result.mode2 as SharedTypes.Config.Mode2<"time">;

lbPersonalBests[mode] = lbPersonalBests[mode] ?? {};
const lbMode2 = lbPersonalBests[mode][mode2] as MonkeyTypes.LbPersonalBests;
Expand Down
2 changes: 1 addition & 1 deletion backend/src/utils/prometheus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ export function setLeaderboard(
}

export function incrementResult(
res: SharedTypes.Result<SharedTypes.Mode>
res: SharedTypes.Result<SharedTypes.Config.Mode>
): void {
const {
mode,
Expand Down
2 changes: 1 addition & 1 deletion backend/src/utils/result.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ObjectId } from "mongodb";

type Result = SharedTypes.DBResult<SharedTypes.Mode>;
type Result = SharedTypes.DBResult<SharedTypes.Config.Mode>;

export function buildDbResult(
completedEvent: SharedTypes.CompletedEvent,
Expand Down
8 changes: 6 additions & 2 deletions backend/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,12 @@
"ts-node": {
"files": true
},
"files": ["./src/types/types.d.ts", "../shared-types/types.d.ts"],
"include": ["./src/**/*"],
"files": [
"./src/types/types.d.ts",
"../shared-types/types.d.ts",
"../shared-types/config.d.ts"
],
"include": ["./src/**/*", "../shared-types/**/*.d.ts"],
"exclude": [
"node_modules",
"build",
Expand Down
6 changes: 3 additions & 3 deletions frontend/__tests__/test/config.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import DefaultConfig from "../../src/ts/constants/default-config";
describe("config.ts", () => {
describe("mergeWithDefaultConfig", () => {
it("should carry over properties from the default config", () => {
const partialConfig = {} as Partial<MonkeyTypes.Config>;
const partialConfig = {} as Partial<SharedTypes.Config>;

const result = mergeWithDefaultConfig(partialConfig);
expect(result).toEqual(expect.objectContaining(DefaultConfig));
Expand All @@ -15,7 +15,7 @@ describe("config.ts", () => {
it("should not merge properties which are not in the default config (legacy properties)", () => {
const partialConfig = {
legacy: true,
} as Partial<MonkeyTypes.Config>;
} as Partial<SharedTypes.Config>;

const result = mergeWithDefaultConfig(partialConfig);
expect(result).toEqual(expect.objectContaining(DefaultConfig));
Expand All @@ -27,7 +27,7 @@ describe("config.ts", () => {
hideExtraLetters: true,
time: 120,
accountChart: ["off", "off", "off", "off"],
} as Partial<MonkeyTypes.Config>;
} as Partial<SharedTypes.Config>;

const result = mergeWithDefaultConfig(partialConfig);
expect(result.mode).toEqual("quote");
Expand Down
14 changes: 12 additions & 2 deletions frontend/src/ts/account/pb-tables.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,18 @@ export function update(
$(`.page${source} .profile .pbsTime`).html("");
$(`.page${source} .profile .pbsWords`).html("");

const timeMode2s: SharedTypes.Mode2<"time">[] = ["15", "30", "60", "120"];
const wordMode2s: SharedTypes.Mode2<"words">[] = ["10", "25", "50", "100"];
const timeMode2s: SharedTypes.Config.Mode2<"time">[] = [
"15",
"30",
"60",
"120",
];
const wordMode2s: SharedTypes.Config.Mode2<"words">[] = [
"10",
"25",
"50",
"100",
];

timeMode2s.forEach((mode2) => {
text += buildPbHtml(personalBests, "time", mode2);
Expand Down
4 changes: 3 additions & 1 deletion frontend/src/ts/account/result-filters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -590,7 +590,9 @@ $(".pageAccount .topFilters button.currentConfigFilter").on("click", () => {
"thicc",
];
filterName.forEach((ql, index) => {
if (Config.quoteLength.includes(index as MonkeyTypes.QuoteLength)) {
if (
Config.quoteLength.includes(index as SharedTypes.Config.QuoteLength)
) {
filters["quoteLength"][ql] = true;
} else {
filters["quoteLength"][ql] = false;
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/ts/ape/endpoints/configs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default class Configs {
}

async save(
config: MonkeyTypes.Config
config: SharedTypes.Config
): Ape.EndpointResponse<Ape.Configs.PostConfig> {
return await this.httpClient.patch(BASE_PATH, { payload: { config } });
}
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/ts/ape/endpoints/leaderboards.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const BASE_PATH = "/leaderboards";

interface LeaderboardQuery {
language: string;
mode: SharedTypes.Mode;
mode: SharedTypes.Config.Mode;
mode2: string;
isDaily?: boolean;
daysBefore?: number;
Expand Down
10 changes: 6 additions & 4 deletions frontend/src/ts/ape/endpoints/presets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ export default class Presets {
this.httpClient = httpClient;
}

async get(): Ape.EndpointResponse {
async get(): Ape.EndpointResponse<Ape.Presets.GetPresets> {
return await this.httpClient.get(BASE_PATH);
}

async add(
presetName: string,
configChanges: MonkeyTypes.ConfigChanges
): Ape.EndpointResponse {
): Ape.EndpointResponse<Ape.Presets.PostPreset> {
const payload = {
name: presetName,
config: configChanges,
Expand All @@ -25,7 +25,7 @@ export default class Presets {
presetId: string,
presetName: string,
configChanges: MonkeyTypes.ConfigChanges
): Ape.EndpointResponse {
): Ape.EndpointResponse<Ape.Presets.PatchPreset> {
const payload = {
_id: presetId,
name: presetName,
Expand All @@ -35,7 +35,9 @@ export default class Presets {
return await this.httpClient.patch(BASE_PATH, { payload });
}

async delete(presetId: string): Ape.EndpointResponse {
async delete(
presetId: string
): Ape.EndpointResponse<Ape.Presets.DeltePreset> {
return await this.httpClient.delete(`${BASE_PATH}/${presetId}`);
}
}
2 changes: 1 addition & 1 deletion frontend/src/ts/ape/endpoints/results.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default class Results {
}

async save(
result: SharedTypes.Result<SharedTypes.Mode>
result: SharedTypes.Result<SharedTypes.Config.Mode>
): Ape.EndpointResponse {
return await this.httpClient.post(BASE_PATH, {
payload: { result },
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/ts/ape/endpoints/users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ export default class Users {
});
}

async updateLeaderboardMemory<M extends SharedTypes.Mode>(
async updateLeaderboardMemory<M extends SharedTypes.Config.Mode>(
mode: string,
mode2: SharedTypes.Mode2<M>,
mode2: SharedTypes.Config.Mode2<M>,
language: string,
rank: number
): Ape.EndpointResponse {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/ts/ape/types/configs.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ declare namespace Ape.Configs {
type GetConfig = {
_id: string;
uid: string;
config: Partial<MonkeyTypes.Config>;
config: Partial<SharedTypes.Config>;
};
type PostConfig = null;
}
10 changes: 10 additions & 0 deletions frontend/src/ts/ape/types/presets.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
// for some reason when using the dot notaion, the types are not being recognized as used
declare namespace Ape.Presets {
type GetPresets = SharedTypes.DBConfigPreset[];
type PostPreset = {
presetId: string;
};
type PatchPreset = null;
type DeltePreset = null;
}
2 changes: 1 addition & 1 deletion frontend/src/ts/commandline/lists/presets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ function update(): void {
const snapshot = DB.getSnapshot();
subgroup.list = [];
if (!snapshot || !snapshot.presets || snapshot.presets.length === 0) return;
snapshot.presets.forEach((preset: MonkeyTypes.Preset) => {
snapshot.presets.forEach((preset: MonkeyTypes.SnapshotPreset) => {
const dis = preset.display;

subgroup.list.push({
Expand Down
Loading

0 comments on commit cdfc783

Please sign in to comment.