backend imports

This commit is contained in:
Miodec 2024-07-18 11:19:29 +02:00
parent 795d3b7a8d
commit d715198829
80 changed files with 353 additions and 339 deletions

View file

@ -1,7 +1,7 @@
import { MonkeyResponse } from "../../utils/monkey-response";
import { buildMonkeyMail } from "../../utils/monkey-mail";
import * as UserDAL from "../../dal/user";
import * as ReportDAL from "../../dal/report";
import { MonkeyResponse } from "../../utils/monkey-response.js";
import { buildMonkeyMail } from "../../utils/monkey-mail.js";
import * as UserDAL from "../../dal/user.js";
import * as ReportDAL from "../../dal/report.js";
export async function test(): Promise<MonkeyResponse> {
return new MonkeyResponse("OK");

View file

@ -1,10 +1,10 @@
import _ from "lodash";
import { randomBytes } from "crypto";
import { hash } from "bcrypt";
import * as ApeKeysDAL from "../../dal/ape-keys";
import MonkeyError from "../../utils/error";
import { MonkeyResponse } from "../../utils/monkey-response";
import { base64UrlEncode } from "../../utils/misc";
import * as ApeKeysDAL from "../../dal/ape-keys.js";
import MonkeyError from "../../utils/error.js";
import { MonkeyResponse } from "../../utils/monkey-response.js";
import { base64UrlEncode } from "../../utils/misc.js";
import { ObjectId } from "mongodb";
import { ApeKey } from "@monkeytype/shared-types";
import { PlaySoundOnError } from "@monkeytype/shared-types/config";

View file

@ -1,5 +1,5 @@
import * as ConfigDAL from "../../dal/config";
import { MonkeyResponse } from "../../utils/monkey-response";
import * as ConfigDAL from "../../dal/config.js";
import { MonkeyResponse } from "../../utils/monkey-response.js";
export async function getConfig(
req: MonkeyTypes.Request

View file

@ -1,6 +1,6 @@
import * as Configuration from "../../init/configuration";
import { MonkeyResponse } from "../../utils/monkey-response";
import { CONFIGURATION_FORM_SCHEMA } from "../../constants/base-configuration";
import * as Configuration from "../../init/configuration.js";
import { MonkeyResponse } from "../../utils/monkey-response.js";
import { CONFIGURATION_FORM_SCHEMA } from "../../constants/base-configuration.js";
export async function getConfiguration(
_req: MonkeyTypes.Request

View file

@ -1,15 +1,15 @@
import { MonkeyResponse } from "../../utils/monkey-response";
import * as UserDal from "../../dal/user";
import FirebaseAdmin from "../../init/firebase-admin";
import Logger from "../../utils/logger";
import { MonkeyResponse } from "../../utils/monkey-response.js";
import * as UserDal from "../../dal/user.js";
import FirebaseAdmin from "../../init/firebase-admin.js";
import Logger from "../../utils/logger.js";
import * as DateUtils from "date-fns";
import { UTCDate } from "@date-fns/utc";
import * as ResultDal from "../../dal/result";
import { roundTo2 } from "../../utils/misc";
import * as ResultDal from "../../dal/result.js";
import { roundTo2 } from "../../utils/misc.js";
import { ObjectId } from "mongodb";
import * as LeaderboardDal from "../../dal/leaderboards";
import * as LeaderboardDal from "../../dal/leaderboards.js";
import { isNumber } from "lodash";
import MonkeyError from "../../utils/error";
import MonkeyError from "../../utils/error.js";
type GenerateDataOptions = {
firstTestTimestamp: Date;

View file

@ -3,12 +3,12 @@ import {
getCurrentDayTimestamp,
MILLISECONDS_IN_DAY,
getCurrentWeekTimestamp,
} from "../../utils/misc";
import { MonkeyResponse } from "../../utils/monkey-response";
import * as LeaderboardsDAL from "../../dal/leaderboards";
import MonkeyError from "../../utils/error";
import * as DailyLeaderboards from "../../utils/daily-leaderboards";
import * as WeeklyXpLeaderboard from "../../services/weekly-xp-leaderboard";
} from "../../utils/misc.js";
import { MonkeyResponse } from "../../utils/monkey-response.js";
import * as LeaderboardsDAL from "../../dal/leaderboards.js";
import MonkeyError from "../../utils/error.js";
import * as DailyLeaderboards from "../../utils/daily-leaderboards.js";
import * as WeeklyXpLeaderboard from "../../services/weekly-xp-leaderboard.js";
export async function getLeaderboard(
req: MonkeyTypes.Request

View file

@ -1,5 +1,5 @@
import * as PresetDAL from "../../dal/preset";
import { MonkeyResponse } from "../../utils/monkey-response";
import * as PresetDAL from "../../dal/preset.js";
import { MonkeyResponse } from "../../utils/monkey-response.js";
export async function getPresets(
req: MonkeyTypes.Request

View file

@ -1,5 +1,5 @@
import * as PsaDAL from "../../dal/psa";
import { MonkeyResponse } from "../../utils/monkey-response";
import * as PsaDAL from "../../dal/psa.js";
import { MonkeyResponse } from "../../utils/monkey-response.js";
export async function getPsas(): Promise<MonkeyResponse> {
const data = await PsaDAL.get();

View file

@ -1,5 +1,5 @@
import * as PublicDAL from "../../dal/public";
import { MonkeyResponse } from "../../utils/monkey-response";
import * as PublicDAL from "../../dal/public.js";
import { MonkeyResponse } from "../../utils/monkey-response.js";
export async function getPublicSpeedHistogram(
req: MonkeyTypes.Request

View file

@ -1,13 +1,13 @@
import _ from "lodash";
import { v4 as uuidv4 } from "uuid";
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";
import MonkeyError from "../../utils/error";
import { verify } from "../../utils/captcha";
import Logger from "../../utils/logger";
import { MonkeyResponse } from "../../utils/monkey-response";
import { getPartialUser, updateQuoteRatings } from "../../dal/user.js";
import * as ReportDAL from "../../dal/report.js";
import * as NewQuotesDAL from "../../dal/new-quotes.js";
import * as QuoteRatingsDAL from "../../dal/quote-ratings.js";
import MonkeyError from "../../utils/error.js";
import { verify } from "../../utils/captcha.js";
import Logger from "../../utils/logger.js";
import { MonkeyResponse } from "../../utils/monkey-response.js";
import { ObjectId } from "mongodb";
async function verifyCaptcha(captcha: string): Promise<void> {

View file

@ -1,5 +1,5 @@
import * as ResultDAL from "../../dal/result";
import * as PublicDAL from "../../dal/public";
import * as ResultDAL from "../../dal/result.js";
import * as PublicDAL from "../../dal/public.js";
import {
getCurrentDayTimestamp,
getStartOfDayTimestamp,
@ -8,34 +8,37 @@ import {
roundTo2,
stdDev,
stringToNumberOrDefault,
} from "../../utils/misc";
} from "../../utils/misc.js";
import objectHash from "object-hash";
import Logger from "../../utils/logger";
import Logger from "../../utils/logger.js";
import "dotenv/config";
import { MonkeyResponse } from "../../utils/monkey-response";
import MonkeyError from "../../utils/error";
import { areFunboxesCompatible, isTestTooShort } from "../../utils/validation";
import { MonkeyResponse } from "../../utils/monkey-response.js";
import MonkeyError from "../../utils/error.js";
import {
areFunboxesCompatible,
isTestTooShort,
} from "../../utils/validation.js";
import {
implemented as anticheatImplemented,
validateResult,
validateKeys,
} from "../../anticheat/index";
import MonkeyStatusCodes from "../../constants/monkey-status-codes";
} from "../../anticheat/index.js";
import MonkeyStatusCodes from "../../constants/monkey-status-codes.js";
import {
incrementResult,
incrementDailyLeaderboard,
} from "../../utils/prometheus";
import GeorgeQueue from "../../queues/george-queue";
import { getDailyLeaderboard } from "../../utils/daily-leaderboards";
import AutoRoleList from "../../constants/auto-roles";
import * as UserDAL from "../../dal/user";
import { buildMonkeyMail } from "../../utils/monkey-mail";
import FunboxList from "../../constants/funbox-list";
} from "../../utils/prometheus.js";
import GeorgeQueue from "../../queues/george-queue.js";
import { getDailyLeaderboard } from "../../utils/daily-leaderboards.js";
import AutoRoleList from "../../constants/auto-roles.js";
import * as UserDAL from "../../dal/user.js";
import { buildMonkeyMail } from "../../utils/monkey-mail.js";
import FunboxList from "../../constants/funbox-list.js";
import _ from "lodash";
import * as WeeklyXpLeaderboard from "../../services/weekly-xp-leaderboard";
import * as WeeklyXpLeaderboard from "../../services/weekly-xp-leaderboard.js";
import { UAParser } from "ua-parser-js";
import { canFunboxGetPb } from "../../utils/pb";
import { buildDbResult } from "../../utils/result";
import { canFunboxGetPb } from "../../utils/pb.js";
import { buildDbResult } from "../../utils/result.js";
try {
if (!anticheatImplemented()) throw new Error("undefined");

View file

@ -1,34 +1,34 @@
import _ from "lodash";
import * as UserDAL from "../../dal/user";
import MonkeyError from "../../utils/error";
import Logger from "../../utils/logger";
import { MonkeyResponse } from "../../utils/monkey-response";
import * as DiscordUtils from "../../utils/discord";
import * as UserDAL from "../../dal/user.js";
import MonkeyError from "../../utils/error.js";
import Logger from "../../utils/logger.js";
import { MonkeyResponse } from "../../utils/monkey-response.js";
import * as DiscordUtils from "../../utils/discord.js";
import {
MILLISECONDS_IN_DAY,
buildAgentLog,
isDevEnvironment,
sanitizeString,
} from "../../utils/misc";
import GeorgeQueue from "../../queues/george-queue";
} from "../../utils/misc.js";
import GeorgeQueue from "../../queues/george-queue.js";
import admin, { FirebaseError } from "firebase-admin";
import { deleteAllApeKeys } from "../../dal/ape-keys";
import { deleteAllPresets } from "../../dal/preset";
import { deleteAll as deleteAllResults } from "../../dal/result";
import { deleteConfig } from "../../dal/config";
import { verify } from "../../utils/captcha";
import * as LeaderboardsDAL from "../../dal/leaderboards";
import { purgeUserFromDailyLeaderboards } from "../../utils/daily-leaderboards";
import { deleteAllApeKeys } from "../../dal/ape-keys.js";
import { deleteAllPresets } from "../../dal/preset.js";
import { deleteAll as deleteAllResults } from "../../dal/result.js";
import { deleteConfig } from "../../dal/config.js";
import { verify } from "../../utils/captcha.js";
import * as LeaderboardsDAL from "../../dal/leaderboards.js";
import { purgeUserFromDailyLeaderboards } from "../../utils/daily-leaderboards.js";
import { v4 as uuidv4 } from "uuid";
import { ObjectId } from "mongodb";
import * as ReportDAL from "../../dal/report";
import emailQueue from "../../queues/email-queue";
import FirebaseAdmin from "../../init/firebase-admin";
import * as AuthUtil from "../../utils/auth";
import * as ReportDAL from "../../dal/report.js";
import emailQueue from "../../queues/email-queue.js";
import FirebaseAdmin from "../../init/firebase-admin.js";
import * as AuthUtil from "../../utils/auth.js";
import * as Dates from "date-fns";
import { UTCDateMini } from "@date-fns/utc";
import * as BlocklistDal from "../../dal/blocklist";
import * as BlocklistDal from "../../dal/blocklist.js";
async function verifyCaptcha(captcha: string): Promise<void> {
if (!(await verify(captcha))) {

View file

@ -1,5 +1,5 @@
import { MonkeyResponse } from "../../utils/monkey-response";
import GeorgeQueue from "../../queues/george-queue";
import { MonkeyResponse } from "../../utils/monkey-response.js";
import GeorgeQueue from "../../queues/george-queue.js";
export async function githubRelease(
req: MonkeyTypes.Request

View file

@ -1,14 +1,14 @@
// import joi from "joi";
import { Router } from "express";
import { authenticateRequest } from "../../middlewares/auth";
import * as AdminController from "../controllers/admin";
import { adminLimit } from "../../middlewares/rate-limit";
import { sendForgotPasswordEmail, toggleBan } from "../controllers/user";
import { authenticateRequest } from "../../middlewares/auth.js";
import * as AdminController from "../controllers/admin.js";
import { adminLimit } from "../../middlewares/rate-limit.js";
import { sendForgotPasswordEmail, toggleBan } from "../controllers/user.js";
import joi from "joi";
import { validate } from "../../middlewares/configuration";
import { checkIfUserIsAdmin } from "../../middlewares/permission";
import { asyncHandler } from "../../middlewares/utility";
import { validateRequest } from "../../middlewares/validation";
import { validate } from "../../middlewares/configuration.js";
import { checkIfUserIsAdmin } from "../../middlewares/permission.js";
import { asyncHandler } from "../../middlewares/utility.js";
import { validateRequest } from "../../middlewares/validation.js";
const router = Router();

View file

@ -1,12 +1,12 @@
import joi from "joi";
import { Router } from "express";
import { authenticateRequest } from "../../middlewares/auth";
import * as ApeKeyController from "../controllers/ape-key";
import * as RateLimit from "../../middlewares/rate-limit";
import { checkUserPermissions } from "../../middlewares/permission";
import { validate } from "../../middlewares/configuration";
import { asyncHandler } from "../../middlewares/utility";
import { validateRequest } from "../../middlewares/validation";
import { authenticateRequest } from "../../middlewares/auth.js";
import * as ApeKeyController from "../controllers/ape-key.js";
import * as RateLimit from "../../middlewares/rate-limit.js";
import { checkUserPermissions } from "../../middlewares/permission.js";
import { validate } from "../../middlewares/configuration.js";
import { asyncHandler } from "../../middlewares/utility.js";
import { validateRequest } from "../../middlewares/validation.js";
const apeKeyNameSchema = joi
.string()

View file

@ -1,10 +1,10 @@
import { Router } from "express";
import { authenticateRequest } from "../../middlewares/auth";
import configSchema from "../schemas/config-schema";
import * as ConfigController from "../controllers/config";
import * as RateLimit from "../../middlewares/rate-limit";
import { asyncHandler } from "../../middlewares/utility";
import { validateRequest } from "../../middlewares/validation";
import { authenticateRequest } from "../../middlewares/auth.js";
import configSchema from "../schemas/config-schema.js";
import * as ConfigController from "../controllers/config.js";
import * as RateLimit from "../../middlewares/rate-limit.js";
import { asyncHandler } from "../../middlewares/utility.js";
import { validateRequest } from "../../middlewares/validation.js";
const router = Router();

View file

@ -1,11 +1,11 @@
import joi from "joi";
import { Router } from "express";
import * as ConfigurationController from "../controllers/configuration";
import { authenticateRequest } from "../../middlewares/auth";
import { adminLimit } from "../../middlewares/rate-limit";
import { asyncHandler, useInProduction } from "../../middlewares/utility";
import { checkIfUserIsAdmin } from "../../middlewares/permission";
import { validateRequest } from "../../middlewares/validation";
import * as ConfigurationController from "../controllers/configuration.js";
import { authenticateRequest } from "../../middlewares/auth.js";
import { adminLimit } from "../../middlewares/rate-limit.js";
import { asyncHandler, useInProduction } from "../../middlewares/utility.js";
import { checkIfUserIsAdmin } from "../../middlewares/permission.js";
import { validateRequest } from "../../middlewares/validation.js";
const router = Router();

View file

@ -1,10 +1,10 @@
import { Router } from "express";
import joi from "joi";
import { createTestData } from "../controllers/dev";
import { isDevEnvironment } from "../../utils/misc";
import { validate } from "../../middlewares/configuration";
import { validateRequest } from "../../middlewares/validation";
import { asyncHandler } from "../../middlewares/utility";
import { createTestData } from "../controllers/dev.js";
import { isDevEnvironment } from "../../utils/misc.js";
import { validate } from "../../middlewares/configuration.js";
import { validateRequest } from "../../middlewares/validation.js";
import { asyncHandler } from "../../middlewares/utility.js";
const router = Router();

View file

@ -1,23 +1,23 @@
import _ from "lodash";
import psas from "./psas";
import publicStats from "./public";
import users from "./users";
import psas from "./psas.js";
import publicStats from "./public.js";
import users from "./users.js";
import { join } from "path";
import quotes from "./quotes";
import configs from "./configs";
import results from "./results";
import presets from "./presets";
import apeKeys from "./ape-keys";
import admin from "./admin";
import webhooks from "./webhooks";
import dev from "./dev";
import configuration from "./configuration";
import { version } from "../../version";
import leaderboards from "./leaderboards";
import addSwaggerMiddlewares from "./swagger";
import { asyncHandler } from "../../middlewares/utility";
import { MonkeyResponse } from "../../utils/monkey-response";
import { recordClientVersion } from "../../utils/prometheus";
import quotes from "./quotes.js";
import configs from "./configs.js";
import results from "./results.js";
import presets from "./presets.js";
import apeKeys from "./ape-keys.js";
import admin from "./admin.js";
import webhooks from "./webhooks.js";
import dev from "./dev.js";
import configuration from "./configuration.js";
import { version } from "../../version.js";
import leaderboards from "./leaderboards.js";
import addSwaggerMiddlewares from "./swagger.js";
import { asyncHandler } from "../../middlewares/utility.js";
import { MonkeyResponse } from "../../utils/monkey-response.js";
import { recordClientVersion } from "../../utils/prometheus.js";
import {
Application,
NextFunction,
@ -25,9 +25,9 @@ import {
Router,
static as expressStatic,
} from "express";
import { isDevEnvironment } from "../../utils/misc";
import { getLiveConfiguration } from "../../init/configuration";
import Logger from "../../utils/logger";
import { isDevEnvironment } from "../../utils/misc.js";
import { getLiveConfiguration } from "../../init/configuration.js";
import Logger from "../../utils/logger.js";
const pathOverride = process.env["API_PATH_OVERRIDE"];
const BASE_ROUTE = pathOverride !== undefined ? `/${pathOverride}` : "";

View file

@ -1,12 +1,12 @@
import joi from "joi";
import { Router } from "express";
import * as RateLimit from "../../middlewares/rate-limit";
import { withApeRateLimiter } from "../../middlewares/ape-rate-limit";
import { authenticateRequest } from "../../middlewares/auth";
import * as LeaderboardController from "../controllers/leaderboard";
import { validate } from "../../middlewares/configuration";
import { validateRequest } from "../../middlewares/validation";
import { asyncHandler } from "../../middlewares/utility";
import * as RateLimit from "../../middlewares/rate-limit.js";
import { withApeRateLimiter } from "../../middlewares/ape-rate-limit.js";
import { authenticateRequest } from "../../middlewares/auth.js";
import * as LeaderboardController from "../controllers/leaderboard.js";
import { validate } from "../../middlewares/configuration.js";
import { validateRequest } from "../../middlewares/validation.js";
import { asyncHandler } from "../../middlewares/utility.js";
const BASE_LEADERBOARD_VALIDATION_SCHEMA = {
language: joi

View file

@ -1,11 +1,11 @@
import joi from "joi";
import { authenticateRequest } from "../../middlewares/auth";
import * as PresetController from "../controllers/preset";
import * as RateLimit from "../../middlewares/rate-limit";
import configSchema from "../schemas/config-schema";
import { authenticateRequest } from "../../middlewares/auth.js";
import * as PresetController from "../controllers/preset.js";
import * as RateLimit from "../../middlewares/rate-limit.js";
import configSchema from "../schemas/config-schema.js";
import { Router } from "express";
import { asyncHandler } from "../../middlewares/utility";
import { validateRequest } from "../../middlewares/validation";
import { asyncHandler } from "../../middlewares/utility.js";
import { validateRequest } from "../../middlewares/validation.js";
const router = Router();

View file

@ -1,7 +1,7 @@
import { Router } from "express";
import * as PsaController from "../controllers/psa";
import * as RateLimit from "../../middlewares/rate-limit";
import { asyncHandler } from "../../middlewares/utility";
import * as PsaController from "../controllers/psa.js";
import * as RateLimit from "../../middlewares/rate-limit.js";
import { asyncHandler } from "../../middlewares/utility.js";
const router = Router();

View file

@ -1,9 +1,9 @@
import { Router } from "express";
import * as PublicController from "../controllers/public";
import * as RateLimit from "../../middlewares/rate-limit";
import { asyncHandler } from "../../middlewares/utility";
import * as PublicController from "../controllers/public.js";
import * as RateLimit from "../../middlewares/rate-limit.js";
import { asyncHandler } from "../../middlewares/utility.js";
import joi from "joi";
import { validateRequest } from "../../middlewares/validation";
import { validateRequest } from "../../middlewares/validation.js";
const GET_MODE_STATS_VALIDATION_SCHEMA = {
language: joi

View file

@ -1,12 +1,12 @@
import joi from "joi";
import { authenticateRequest } from "../../middlewares/auth";
import { authenticateRequest } from "../../middlewares/auth.js";
import { Router } from "express";
import * as QuoteController from "../controllers/quote";
import * as RateLimit from "../../middlewares/rate-limit";
import { checkUserPermissions } from "../../middlewares/permission";
import { asyncHandler } from "../../middlewares/utility";
import { validate } from "../../middlewares/configuration";
import { validateRequest } from "../../middlewares/validation";
import * as QuoteController from "../controllers/quote.js";
import * as RateLimit from "../../middlewares/rate-limit.js";
import { checkUserPermissions } from "../../middlewares/permission.js";
import { asyncHandler } from "../../middlewares/utility.js";
import { validate } from "../../middlewares/configuration.js";
import { validateRequest } from "../../middlewares/validation.js";
const router = Router();

View file

@ -1,13 +1,13 @@
import * as ResultController from "../controllers/result";
import resultSchema from "../schemas/result-schema";
import * as RateLimit from "../../middlewares/rate-limit";
import * as ResultController from "../controllers/result.js";
import resultSchema from "../schemas/result-schema.js";
import * as RateLimit from "../../middlewares/rate-limit.js";
import { Router } from "express";
import { authenticateRequest } from "../../middlewares/auth";
import { authenticateRequest } from "../../middlewares/auth.js";
import joi from "joi";
import { withApeRateLimiter } from "../../middlewares/ape-rate-limit";
import { validateRequest } from "../../middlewares/validation";
import { asyncHandler } from "../../middlewares/utility";
import { validate } from "../../middlewares/configuration";
import { withApeRateLimiter } from "../../middlewares/ape-rate-limit.js";
import { validateRequest } from "../../middlewares/validation.js";
import { asyncHandler } from "../../middlewares/utility.js";
import { validate } from "../../middlewares/configuration.js";
const router = Router();

View file

@ -7,7 +7,7 @@ import {
} from "swagger-ui-express";
import publicSwaggerSpec from "../../documentation/public-swagger.json";
import internalSwaggerSpec from "../../documentation/internal-swagger.json";
import { isDevEnvironment } from "../../utils/misc";
import { isDevEnvironment } from "../../utils/misc.js";
const SWAGGER_UI_OPTIONS = {
customCss: ".swagger-ui .topbar { display: none } .try-out { display: none }",

View file

@ -1,15 +1,15 @@
import joi from "joi";
import { authenticateRequest } from "../../middlewares/auth";
import { authenticateRequest } from "../../middlewares/auth.js";
import { Router } from "express";
import * as UserController from "../controllers/user";
import * as RateLimit from "../../middlewares/rate-limit";
import { withApeRateLimiter } from "../../middlewares/ape-rate-limit";
import { containsProfanity, isUsernameValid } from "../../utils/validation";
import filterSchema from "../schemas/filter-schema";
import { asyncHandler } from "../../middlewares/utility";
import { validate } from "../../middlewares/configuration";
import { validateRequest } from "../../middlewares/validation";
import { checkUserPermissions } from "../../middlewares/permission";
import * as UserController from "../controllers/user.js";
import * as RateLimit from "../../middlewares/rate-limit.js";
import { withApeRateLimiter } from "../../middlewares/ape-rate-limit.js";
import { containsProfanity, isUsernameValid } from "../../utils/validation.js";
import filterSchema from "../schemas/filter-schema.js";
import { asyncHandler } from "../../middlewares/utility.js";
import { validate } from "../../middlewares/configuration.js";
import { validateRequest } from "../../middlewares/validation.js";
import { checkUserPermissions } from "../../middlewares/permission.js";
const router = Router();

View file

@ -1,9 +1,9 @@
// import joi from "joi";
import { Router } from "express";
import { authenticateGithubWebhook } from "../../middlewares/auth";
import { asyncHandler } from "../../middlewares/utility";
import { webhookLimit } from "../../middlewares/rate-limit";
import { githubRelease } from "../controllers/webhooks";
import { authenticateGithubWebhook } from "../../middlewares/auth.js";
import { asyncHandler } from "../../middlewares/utility.js";
import { webhookLimit } from "../../middlewares/rate-limit.js";
import { githubRelease } from "../controllers/webhooks.js";
const router = Router();

View file

@ -1,13 +1,13 @@
import cors from "cors";
import helmet from "helmet";
import addApiRoutes from "./api/routes";
import addApiRoutes from "./api/routes/index.js";
import express, { urlencoded, json } from "express";
import contextMiddleware from "./middlewares/context";
import errorHandlingMiddleware from "./middlewares/error";
import contextMiddleware from "./middlewares/context.js";
import errorHandlingMiddleware from "./middlewares/error.js";
import {
badAuthRateLimiterHandler,
rootRateLimiter,
} from "./middlewares/rate-limit";
} from "./middlewares/rate-limit.js";
function buildApp(): express.Application {
const app = express();

View file

@ -1,4 +1,4 @@
import * as db from "../init/db";
import * as db from "../init/db.js";
export async function isAdmin(uid: string): Promise<boolean> {
const doc = await db.collection("admin-uids").findOne({ uid });

View file

@ -1,5 +1,5 @@
import _ from "lodash";
import * as db from "../init/db";
import * as db from "../init/db.js";
import {
Filter,
ObjectId,
@ -7,7 +7,7 @@ import {
Collection,
WithId,
} from "mongodb";
import MonkeyError from "../utils/error";
import MonkeyError from "../utils/error.js";
export const getApeKeysCollection = (): Collection<
WithId<MonkeyTypes.ApeKeyDB>

View file

@ -1,5 +1,5 @@
import { Collection } from "mongodb";
import * as db from "../init/db";
import * as db from "../init/db.js";
import { createHash } from "crypto";
type BlocklistEntryProperties = Pick<

View file

@ -1,5 +1,5 @@
import { UpdateResult } from "mongodb";
import * as db from "../init/db";
import * as db from "../init/db.js";
import _ from "lodash";
const configLegacyProperties = [

View file

@ -1,9 +1,9 @@
import * as db from "../init/db";
import Logger from "../utils/logger";
import * as db from "../init/db.js";
import Logger from "../utils/logger.js";
import { performance } from "perf_hooks";
import { setLeaderboard } from "../utils/prometheus";
import { isDevEnvironment } from "../utils/misc";
import { getCachedConfiguration } from "../init/configuration";
import { setLeaderboard } from "../utils/prometheus.js";
import { isDevEnvironment } from "../utils/misc.js";
import { getCachedConfiguration } from "../init/configuration.js";
export async function get(
mode: string,

View file

@ -3,11 +3,11 @@ import { ObjectId } from "mongodb";
import path from "path";
import { existsSync, writeFileSync } from "fs";
import { readFile } from "node:fs/promises";
import * as db from "../init/db";
import MonkeyError from "../utils/error";
import * as db from "../init/db.js";
import MonkeyError from "../utils/error.js";
import { compareTwoStrings } from "string-similarity";
const PATH_TO_REPO = "../../../../monkeytype-new-quotes";
const PATH_TO_REPO = "../../../../monkeytype-new-quotes.js";
let git;
try {

View file

@ -1,5 +1,5 @@
import MonkeyError from "../utils/error";
import * as db from "../init/db";
import MonkeyError from "../utils/error.js";
import * as db from "../init/db.js";
import { ObjectId, Filter, Collection, WithId } from "mongodb";
const MAX_PRESETS = 10;

View file

@ -1,4 +1,4 @@
import * as db from "../init/db";
import * as db from "../init/db.js";
type PSA = MonkeyTypes.WithObjectId<SharedTypes.PSA>;

View file

@ -1,6 +1,6 @@
import * as db from "../init/db";
import { roundTo2 } from "../utils/misc";
import MonkeyError from "../utils/error";
import * as db from "../init/db.js";
import { roundTo2 } from "../utils/misc.js";
import MonkeyError from "../utils/error.js";
type PublicTypingStatsDB = SharedTypes.PublicTypingStats & { _id: "stats" };
type PublicSpeedStatsDB = {

View file

@ -1,4 +1,4 @@
import * as db from "../init/db";
import * as db from "../init/db.js";
export async function submit(
quoteId: number,

View file

@ -1,5 +1,5 @@
import MonkeyError from "../utils/error";
import * as db from "../init/db";
import MonkeyError from "../utils/error.js";
import * as db from "../init/db.js";
const COLLECTION_NAME = "reports";

View file

@ -1,9 +1,9 @@
import _ from "lodash";
import { Collection, DeleteResult, ObjectId, UpdateResult } from "mongodb";
import MonkeyError from "../utils/error";
import * as db from "../init/db";
import MonkeyError from "../utils/error.js";
import * as db from "../init/db.js";
import { getUser, getTags } from "./user";
import { getUser, getTags } from "./user.js";
type DBResult = MonkeyTypes.WithObjectId<
SharedTypes.DBResult<SharedTypes.Config.Mode>

View file

@ -1,12 +1,12 @@
import _ from "lodash";
import { containsProfanity, isUsernameValid } from "../utils/validation";
import { canFunboxGetPb, checkAndUpdatePb } from "../utils/pb";
import * as db from "../init/db";
import MonkeyError from "../utils/error";
import { containsProfanity, isUsernameValid } from "../utils/validation.js";
import { canFunboxGetPb, checkAndUpdatePb } from "../utils/pb.js";
import * as db from "../init/db.js";
import MonkeyError from "../utils/error.js";
import { Collection, ObjectId, Long, UpdateFilter, Filter } from "mongodb";
import Logger from "../utils/logger";
import { flattenObjectDeep, isToday, isYesterday } from "../utils/misc";
import { getCachedConfiguration } from "../init/configuration";
import Logger from "../utils/logger.js";
import { flattenObjectDeep, isToday, isYesterday } from "../utils/misc.js";
import { getCachedConfiguration } from "../init/configuration.js";
import { getDayOfYear } from "date-fns";
import { UTCDate } from "@date-fns/utc";

View file

@ -1,9 +1,9 @@
import _ from "lodash";
import * as db from "./db";
import * as db from "./db.js";
import { ObjectId } from "mongodb";
import Logger from "../utils/logger";
import { identity } from "../utils/misc";
import { BASE_CONFIGURATION } from "../constants/base-configuration";
import Logger from "../utils/logger.js";
import { identity } from "../utils/misc.js";
import { BASE_CONFIGURATION } from "../constants/base-configuration.js";
const CONFIG_UPDATE_INTERVAL = 10 * 60 * 1000; // 10 Minutes

View file

@ -6,8 +6,8 @@ import {
MongoClientOptions,
WithId,
} from "mongodb";
import MonkeyError from "../utils/error";
import Logger from "../utils/logger";
import MonkeyError from "../utils/error.js";
import Logger from "../utils/logger.js";
let db: Db;
let mongoClient: MongoClient;

View file

@ -1,12 +1,12 @@
import * as nodemailer from "nodemailer";
import Logger from "../utils/logger";
import Logger from "../utils/logger.js";
import fs from "fs";
import { join } from "path";
import mjml2html from "mjml";
import mustache from "mustache";
import { recordEmail } from "../utils/prometheus";
import { EmailTaskContexts, EmailType } from "../queues/email-queue";
import { isDevEnvironment } from "../utils/misc";
import { recordEmail } from "../utils/prometheus.js";
import { EmailTaskContexts, EmailType } from "../queues/email-queue.js";
import { isDevEnvironment } from "../utils/misc.js";
type EmailMetadata = {
subject: string;

View file

@ -1,9 +1,9 @@
import admin, { ServiceAccount } from "firebase-admin";
import Logger from "../utils/logger";
import Logger from "../utils/logger.js";
import { readFileSync, existsSync } from "fs";
import MonkeyError from "../utils/error";
import MonkeyError from "../utils/error.js";
import path from "path";
import { isDevEnvironment } from "../utils/misc";
import { isDevEnvironment } from "../utils/misc.js";
const SERVICE_ACCOUNT_PATH = path.join(
__dirname,

View file

@ -2,8 +2,8 @@ import fs from "fs";
import _ from "lodash";
import { join } from "path";
import IORedis from "ioredis";
import Logger from "../utils/logger";
import { isDevEnvironment } from "../utils/misc";
import Logger from "../utils/logger.js";
import { isDevEnvironment } from "../utils/misc.js";
let connection: IORedis.Redis;
let connected = false;

View file

@ -1,7 +1,7 @@
import { CronJob } from "cron";
import * as db from "../init/db";
import Logger from "../utils/logger";
import { getCachedConfiguration } from "../init/configuration";
import * as db from "../init/db.js";
import Logger from "../utils/logger.js";
import { getCachedConfiguration } from "../init/configuration.js";
const CRON_SCHEDULE = "0 0 0 * * *";
const LOG_MAX_AGE_DAYS = 30;

View file

@ -1,7 +1,7 @@
import updateLeaderboards from "./update-leaderboards";
import deleteOldLogs from "./delete-old-logs";
import logCollectionSizes from "./log-collection-sizes";
import logQueueSizes from "./log-queue-sizes";
import updateLeaderboards from "./update-leaderboards.js";
import deleteOldLogs from "./delete-old-logs.js";
import logCollectionSizes from "./log-collection-sizes.js";
import logQueueSizes from "./log-queue-sizes.js";
export default [
updateLeaderboards,

View file

@ -1,6 +1,6 @@
import { CronJob } from "cron";
import * as db from "../init/db";
import * as Prometheus from "../utils/prometheus";
import * as db from "../init/db.js";
import * as Prometheus from "../utils/prometheus.js";
const CRON_SCHEDULE = "0 */5 * * * *";

View file

@ -1,6 +1,6 @@
import { CronJob } from "cron";
import Queues from "../queues/index";
import { setQueueLength } from "../utils/prometheus";
import Queues from "../queues/index.js";
import { setQueueLength } from "../utils/prometheus.js";
const CRON_SCHEDULE = "0 */5 * * * *";

View file

@ -1,7 +1,7 @@
import { CronJob } from "cron";
import GeorgeQueue from "../queues/george-queue";
import * as LeaderboardsDAL from "../dal/leaderboards";
import { getCachedConfiguration } from "../init/configuration";
import GeorgeQueue from "../queues/george-queue.js";
import * as LeaderboardsDAL from "../dal/leaderboards.js";
import { getCachedConfiguration } from "../init/configuration.js";
const CRON_SCHEDULE = "30 14/15 * * * *";
const RECENT_AGE_MINUTES = 10;

View file

@ -1,11 +1,11 @@
import MonkeyError from "../utils/error";
import MonkeyError from "../utils/error.js";
import { Response, NextFunction, RequestHandler } from "express";
import statuses from "../constants/monkey-status-codes";
import statuses from "../constants/monkey-status-codes.js";
import rateLimit, {
RateLimitRequestHandler,
Options,
} from "express-rate-limit";
import { isDevEnvironment } from "../utils/misc";
import { isDevEnvironment } from "../utils/misc.js";
const REQUEST_MULTIPLIER = isDevEnvironment() ? 1 : 1;

View file

@ -1,16 +1,16 @@
import { compare } from "bcrypt";
import { getApeKey, updateLastUsedOn } from "../dal/ape-keys";
import MonkeyError from "../utils/error";
import { verifyIdToken } from "../utils/auth";
import { base64UrlDecode, isDevEnvironment } from "../utils/misc";
import { getApeKey, updateLastUsedOn } from "../dal/ape-keys.js";
import MonkeyError from "../utils/error.js";
import { verifyIdToken } from "../utils/auth.js";
import { base64UrlDecode, isDevEnvironment } from "../utils/misc.js";
import { NextFunction, Response, Handler } from "express";
import statuses from "../constants/monkey-status-codes";
import statuses from "../constants/monkey-status-codes.js";
import {
incrementAuth,
recordAuthTime,
recordRequestCountry,
// recordRequestForUid,
} from "../utils/prometheus";
} from "../utils/prometheus.js";
import crypto from "crypto";
import { performance } from "perf_hooks";

View file

@ -1,5 +1,5 @@
import { Response, NextFunction, RequestHandler } from "express";
import MonkeyError from "../utils/error";
import MonkeyError from "../utils/error.js";
export type ValidationOptions<T> = {
criteria: (data: T) => boolean;

View file

@ -1,4 +1,4 @@
import { getCachedConfiguration } from "../init/configuration";
import { getCachedConfiguration } from "../init/configuration.js";
import { Response, NextFunction } from "express";
async function contextMiddleware(

View file

@ -1,17 +1,20 @@
import * as db from "../init/db";
import * as db from "../init/db.js";
import { v4 as uuidv4 } from "uuid";
import Logger from "../utils/logger";
import MonkeyError from "../utils/error";
import { incrementBadAuth } from "./rate-limit";
import Logger from "../utils/logger.js";
import MonkeyError from "../utils/error.js";
import { incrementBadAuth } from "./rate-limit.js";
import { NextFunction, Response } from "express";
import { MonkeyResponse, handleMonkeyResponse } from "../utils/monkey-response";
import {
MonkeyResponse,
handleMonkeyResponse,
} from "../utils/monkey-response.js";
import {
recordClientErrorByVersion,
recordServerErrorByVersion,
} from "../utils/prometheus";
import { isDevEnvironment } from "../utils/misc";
} from "../utils/prometheus.js";
import { isDevEnvironment } from "../utils/misc.js";
import { ObjectId } from "mongodb";
import { version } from "../version";
import { version } from "../version.js";
type DBError = {
_id: ObjectId;

View file

@ -1,9 +1,9 @@
import _ from "lodash";
import MonkeyError from "../utils/error";
import MonkeyError from "../utils/error.js";
import { Response, NextFunction, RequestHandler } from "express";
import { getUser } from "../dal/user";
import { isAdmin } from "../dal/admin-uids";
import { ValidationOptions } from "./configuration";
import { getUser } from "../dal/user.js";
import { isAdmin } from "../dal/admin-uids.js";
import { ValidationOptions } from "./configuration.js";
/**
* Check if the user is an admin before handling request.

View file

@ -1,9 +1,9 @@
import _ from "lodash";
import MonkeyError from "../utils/error";
import MonkeyError from "../utils/error.js";
import { Response, NextFunction } from "express";
import { RateLimiterMemory } from "rate-limiter-flexible";
import rateLimit, { Options } from "express-rate-limit";
import { isDevEnvironment } from "../utils/misc";
import { isDevEnvironment } from "../utils/misc.js";
const REQUEST_MULTIPLIER = isDevEnvironment() ? 100 : 1;

View file

@ -1,7 +1,10 @@
import _ from "lodash";
import { Response, NextFunction, RequestHandler } from "express";
import { handleMonkeyResponse, MonkeyResponse } from "../utils/monkey-response";
import { isDevEnvironment } from "../utils/misc";
import {
handleMonkeyResponse,
MonkeyResponse,
} from "../utils/monkey-response.js";
import { isDevEnvironment } from "../utils/misc.js";
export const emptyMiddleware = (
_req: MonkeyTypes.Request,

View file

@ -1,6 +1,6 @@
import _ from "lodash";
import joi from "joi";
import MonkeyError from "../utils/error";
import MonkeyError from "../utils/error.js";
import { Response, NextFunction, RequestHandler } from "express";
type ValidationSchema = {

View file

@ -1,4 +1,4 @@
import { MonkeyQueue } from "./monkey-queue";
import { MonkeyQueue } from "./monkey-queue.js";
const QUEUE_NAME = "email-tasks";

View file

@ -1,5 +1,5 @@
import { LbEntryWithRank } from "../utils/daily-leaderboards";
import { MonkeyQueue } from "./monkey-queue";
import { LbEntryWithRank } from "../utils/daily-leaderboards.js";
import { MonkeyQueue } from "./monkey-queue.js";
const QUEUE_NAME = "george-tasks";

View file

@ -1,5 +1,5 @@
import LaterQueue from "./later-queue";
import GeorgeQueue from "./george-queue";
import EmailQueue from "./email-queue";
import LaterQueue from "./later-queue.js";
import GeorgeQueue from "./george-queue.js";
import EmailQueue from "./email-queue.js";
export default [GeorgeQueue, LaterQueue, EmailQueue];

View file

@ -1,7 +1,10 @@
import LRUCache from "lru-cache";
import Logger from "../utils/logger";
import { MonkeyQueue } from "./monkey-queue";
import { getCurrentDayTimestamp, getCurrentWeekTimestamp } from "../utils/misc";
import Logger from "../utils/logger.js";
import { MonkeyQueue } from "./monkey-queue.js";
import {
getCurrentDayTimestamp,
getCurrentWeekTimestamp,
} from "../utils/misc.js";
const QUEUE_NAME = "later";

View file

@ -1,20 +1,20 @@
import "dotenv/config";
import * as db from "./init/db";
import jobs from "./jobs";
import { getLiveConfiguration } from "./init/configuration";
import app from "./app";
import * as db from "./init/db.js";
import jobs from "./jobs/index.js";
import { getLiveConfiguration } from "./init/configuration.js";
import app from "./app.js";
import { Server } from "http";
import { version } from "./version";
import { recordServerVersion } from "./utils/prometheus";
import * as RedisClient from "./init/redis";
import queues from "./queues";
import workers from "./workers";
import Logger from "./utils/logger";
import * as EmailClient from "./init/email-client";
import { init as initFirebaseAdmin } from "./init/firebase-admin";
import { version } from "./version.js";
import { recordServerVersion } from "./utils/prometheus.js";
import * as RedisClient from "./init/redis.js";
import queues from "./queues/index.js";
import workers from "./workers/index.js";
import Logger from "./utils/logger.js";
import * as EmailClient from "./init/email-client.js";
import { init as initFirebaseAdmin } from "./init/firebase-admin.js";
import { createIndicies as leaderboardDbSetup } from "./dal/leaderboards";
import { createIndicies as blocklistDbSetup } from "./dal/blocklist";
import { createIndicies as leaderboardDbSetup } from "./dal/leaderboards.js";
import { createIndicies as blocklistDbSetup } from "./dal/blocklist.js";
import { monotest } from "@monkeytype/mono-test";
monotest();

View file

@ -1,6 +1,6 @@
import * as RedisClient from "../init/redis";
import LaterQueue from "../queues/later-queue";
import { getCurrentWeekTimestamp } from "../utils/misc";
import * as RedisClient from "../init/redis.js";
import LaterQueue from "../queues/later-queue.js";
import { getCurrentWeekTimestamp } from "../utils/misc.js";
type InternalWeeklyXpLeaderboardEntry = {
uid: string;

View file

@ -1,10 +1,10 @@
import FirebaseAdmin from "./../init/firebase-admin";
import FirebaseAdmin from "./../init/firebase-admin.js";
import LRUCache from "lru-cache";
import {
recordTokenCacheAccess,
setTokenCacheLength,
setTokenCacheSize,
} from "./prometheus";
} from "./prometheus.js";
import { DecodedIdToken, UserRecord } from "firebase-admin/auth";
const tokenCache = new LRUCache<string, DecodedIdToken>({

View file

@ -1,5 +1,4 @@
import fetch from "node-fetch";
import { isDevEnvironment } from "./misc";
import { isDevEnvironment } from "./misc.js";
type CaptchaData = {
success: boolean;

View file

@ -1,7 +1,7 @@
import _ from "lodash";
import * as RedisClient from "../init/redis";
import LaterQueue from "../queues/later-queue";
import { getCurrentDayTimestamp, matchesAPattern, kogascore } from "./misc";
import * as RedisClient from "../init/redis.js";
import LaterQueue from "../queues/later-queue.js";
import { getCurrentDayTimestamp, matchesAPattern, kogascore } from "./misc.js";
type DailyLeaderboardEntry = {
uid: string;

View file

@ -1,8 +1,7 @@
import fetch from "node-fetch";
import { isDevEnvironment } from "./misc";
import * as RedisClient from "../init/redis";
import { isDevEnvironment } from "./misc.js";
import * as RedisClient from "../init/redis.js";
import { randomBytes } from "crypto";
import MonkeyError from "./error";
import MonkeyError from "./error.js";
const BASE_URL = "https://discord.com/api";

View file

@ -1,5 +1,5 @@
import { v4 as uuidv4 } from "uuid";
import { isDevEnvironment } from "./misc";
import { isDevEnvironment } from "./misc.js";
class MonkeyError extends Error {
status: number;

View file

@ -1,4 +1,4 @@
import * as db from "../init/db";
import * as db from "../init/db.js";
import chalk from "chalk";
import { format, createLogger, transports, Logger } from "winston";
import { resolve } from "path";
@ -9,7 +9,7 @@ const warningColor = chalk.yellow.bold;
const successColor = chalk.green.bold;
const infoColor = chalk.white;
const logFolderPath = process.env["LOG_FOLDER_PATH"] ?? "./logs";
const logFolderPath = process.env["LOG_FOLDER_PATH"] ?? "./logs.js";
const maxLogSize = parseInt(process.env["LOG_FILE_MAX_SIZE"] ?? "10485760");
type Log = {

View file

@ -1,5 +1,5 @@
import { Response } from "express";
import { isCustomCode } from "../constants/monkey-status-codes";
import { isCustomCode } from "../constants/monkey-status-codes.js";
//TODO FIX ANYS

View file

@ -1,5 +1,5 @@
import _ from "lodash";
import FunboxList from "../constants/funbox-list";
import FunboxList from "../constants/funbox-list.js";
type CheckAndUpdatePbResult = {
isPb: boolean;

View file

@ -1,8 +1,8 @@
import _ from "lodash";
import { replaceHomoglyphs } from "../constants/homoglyphs";
import { profanities } from "../constants/profanities";
import { intersect, sanitizeString } from "./misc";
import { default as FunboxList } from "../constants/funbox-list";
import { replaceHomoglyphs } from "../constants/homoglyphs.js";
import { profanities } from "../constants/profanities.js";
import { intersect, sanitizeString } from "./misc.js";
import { default as FunboxList } from "../constants/funbox-list.js";
export function inRange(value: number, min: number, max: number): boolean {
return value >= min && value <= max;

View file

@ -1,5 +1,5 @@
import { join } from "path";
import { isDevEnvironment, padNumbers } from "./utils/misc";
import { isDevEnvironment, padNumbers } from "./utils/misc.js";
import { readFileSync, writeFileSync, existsSync } from "fs";
const SERVER_VERSION_FILE_PATH = join(__dirname, "./server.version");

View file

@ -1,13 +1,13 @@
import _ from "lodash";
import IORedis from "ioredis";
import { Worker, Job, ConnectionOptions } from "bullmq";
import Logger from "../utils/logger";
import Logger from "../utils/logger.js";
import EmailQueue, {
EmailTaskContexts,
EmailType,
} from "../queues/email-queue";
import { sendEmail } from "../init/email-client";
import { recordTimeToCompleteJob } from "../utils/prometheus";
} from "../queues/email-queue.js";
import { sendEmail } from "../init/email-client.js";
import { recordTimeToCompleteJob } from "../utils/prometheus.js";
async function jobHandler(job: Job): Promise<void> {
const type: EmailType = job.data.type;

View file

@ -1,4 +1,4 @@
import LaterWorker from "./later-worker";
import EmailWorker from "./email-worker";
import LaterWorker from "./later-worker.js";
import EmailWorker from "./email-worker.js";
export default [LaterWorker, EmailWorker];

View file

@ -1,19 +1,23 @@
import _ from "lodash";
import IORedis from "ioredis";
import { Worker, Job, ConnectionOptions } from "bullmq";
import Logger from "../utils/logger";
import { addToInboxBulk } from "../dal/user";
import GeorgeQueue from "../queues/george-queue";
import { buildMonkeyMail } from "../utils/monkey-mail";
import { DailyLeaderboard } from "../utils/daily-leaderboards";
import { getCachedConfiguration } from "../init/configuration";
import { formatSeconds, getOrdinalNumberString, mapRange } from "../utils/misc";
import Logger from "../utils/logger.js";
import { addToInboxBulk } from "../dal/user.js";
import GeorgeQueue from "../queues/george-queue.js";
import { buildMonkeyMail } from "../utils/monkey-mail.js";
import { DailyLeaderboard } from "../utils/daily-leaderboards.js";
import { getCachedConfiguration } from "../init/configuration.js";
import {
formatSeconds,
getOrdinalNumberString,
mapRange,
} from "../utils/misc.js";
import LaterQueue, {
LaterTask,
LaterTaskContexts,
LaterTaskType,
} from "../queues/later-queue";
import { recordTimeToCompleteJob } from "../utils/prometheus";
} from "../queues/later-queue.js";
import { recordTimeToCompleteJob } from "../utils/prometheus.js";
import { WeeklyXpLeaderboard } from "../services/weekly-xp-leaderboard.js";
async function handleDailyLeaderboardResults(