mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-02-05 21:33:40 +08:00
127 lines
3.5 KiB
JavaScript
127 lines
3.5 KiB
JavaScript
const express = require("express");
|
|
const { config } = require("dotenv");
|
|
const path = require("path");
|
|
const MonkeyError = require("./handlers/error");
|
|
config({ path: path.join(__dirname, ".env") });
|
|
|
|
const cors = require("cors");
|
|
const admin = require("firebase-admin");
|
|
|
|
const serviceAccount = require("./credentials/serviceAccountKey.json");
|
|
const { connectDB, mongoDB } = require("./init/mongodb");
|
|
|
|
const PORT = process.env.PORT || 5005;
|
|
|
|
// MIDDLEWARE & SETUP
|
|
const app = express();
|
|
app.use(express.urlencoded({ extended: true }));
|
|
app.use(express.json());
|
|
app.use(cors());
|
|
|
|
app.set("trust proxy", 1);
|
|
|
|
const userRouter = require("./api/routes/user");
|
|
app.use("/user", userRouter);
|
|
const configRouter = require("./api/routes/config");
|
|
app.use("/config", configRouter);
|
|
const resultRouter = require("./api/routes/result");
|
|
app.use("/results", resultRouter);
|
|
const presetRouter = require("./api/routes/preset");
|
|
app.use("/presets", presetRouter);
|
|
const quoteRatings = require("./api/routes/quote-ratings");
|
|
app.use("/quote-ratings", quoteRatings);
|
|
const psaRouter = require("./api/routes/psa");
|
|
app.use("/psa", psaRouter);
|
|
const leaderboardsRouter = require("./api/routes/leaderboards");
|
|
app.use("/leaderboards", leaderboardsRouter);
|
|
|
|
app.use(function (e, req, res, next) {
|
|
let uid = undefined;
|
|
if (req.decodedToken) {
|
|
uid = req.decodedToken.uid;
|
|
}
|
|
let monkeyError;
|
|
if (e.errorID) {
|
|
//its a monkey error
|
|
monkeyError = e;
|
|
} else {
|
|
//its a server error
|
|
monkeyError = new MonkeyError(e.status, e.message, e.stack, uid);
|
|
}
|
|
if (process.env.MODE !== "dev" && monkeyError.status > 400) {
|
|
mongoDB().collection("errors").insertOne({
|
|
_id: monkeyError.errorID,
|
|
timestamp: Date.now(),
|
|
status: monkeyError.status,
|
|
uid: monkeyError.uid,
|
|
message: monkeyError.message,
|
|
stack: monkeyError.stack,
|
|
});
|
|
}
|
|
return res.status(e.status || 500).json(monkeyError);
|
|
});
|
|
|
|
app.get("/test", (req, res) => {
|
|
res.send("Hello World!");
|
|
});
|
|
|
|
app.listen(PORT, async () => {
|
|
console.log(`listening on port ${PORT}`);
|
|
await connectDB();
|
|
admin.initializeApp({
|
|
credential: admin.credential.cert(serviceAccount),
|
|
});
|
|
console.log("Database Connected");
|
|
|
|
// refactor();
|
|
});
|
|
|
|
async function refactor() {
|
|
let users = await mongoDB().collection("users").find({}).toArray();
|
|
|
|
for (let user of users) {
|
|
let obj = user.personalBests;
|
|
|
|
lbPb = {
|
|
time: {
|
|
15: {},
|
|
60: {},
|
|
},
|
|
};
|
|
let bestForEveryLanguage = {};
|
|
if (obj?.time?.[15]) {
|
|
obj.time[15].forEach((pb) => {
|
|
if (!bestForEveryLanguage[pb.language]) {
|
|
bestForEveryLanguage[pb.language] = pb;
|
|
} else {
|
|
if (bestForEveryLanguage[pb.language].wpm < pb.wpm) {
|
|
bestForEveryLanguage[pb.language] = pb;
|
|
}
|
|
}
|
|
});
|
|
Object.keys(bestForEveryLanguage).forEach((key) => {
|
|
lbPb.time[15][key] = bestForEveryLanguage[key];
|
|
});
|
|
bestForEveryLanguage = {};
|
|
}
|
|
if (obj?.time?.[60]) {
|
|
obj.time[60].forEach((pb) => {
|
|
if (!bestForEveryLanguage[pb.language]) {
|
|
bestForEveryLanguage[pb.language] = pb;
|
|
} else {
|
|
if (bestForEveryLanguage[pb.language].wpm < pb.wpm) {
|
|
bestForEveryLanguage[pb.language] = pb;
|
|
}
|
|
}
|
|
});
|
|
Object.keys(bestForEveryLanguage).forEach((key) => {
|
|
lbPb.time[60][key] = bestForEveryLanguage[key];
|
|
});
|
|
}
|
|
|
|
await mongoDB()
|
|
.collection("users")
|
|
.updateOne({ _id: user._id }, { $set: { lbPersonalBests: lbPb } });
|
|
console.log(`updated ${user.name}`);
|
|
}
|
|
}
|