monkeytype/backend/server.js
2021-06-07 14:29:51 +01:00

97 lines
2.7 KiB
JavaScript

const express = require("express");
const { config } = require("dotenv");
const path = require("path");
config({ path: path.join(__dirname, ".env") });
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const { MongoClient } = require("mongodb");
const cors = require("cors");
const admin = require("firebase-admin");
const helmet = require("helmet");
const { User } = require("./models/user");
const { Leaderboard } = require("./models/leaderboard");
const { BotCommand } = require("./models/bot-command");
const { Stats } = require("./models/stats");
// Firebase admin setup
//currently uses account key in functions to prevent repetition
const serviceAccount = require("./credentials/serviceAccountKey.json");
const { connectDB } = require("./init/mongodb");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
// MIDDLEWARE & SETUP
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(cors());
app.use(helmet());
const port = process.env.PORT || "5005";
connectDB()
.then(() => {
app.listen(process.env.PORT, () => {
console.log(`listening on port ${process.env.PORT}`);
});
})
.catch((e) => {
console.log(e);
});
const authRouter = require("./api/routes/auth");
app.use("/auth", authRouter);
async function authenticateToken(req, res, next) {
const authHeader = req.headers["authorization"];
const token = await admin
.auth()
.verifyIdToken(req.headers.authorization.split(" ")[1]);
if (token == null) {
return res.sendStatus(401);
} else {
req.name = token.name;
req.uid = token.user_id;
next();
}
}
// NON-ROUTE FUNCTIONS
//
// async function stripAndSave(uid, obj) {
// if (obj.bailedOut === false) delete obj.bailedOut;
// if (obj.blindMode === false) delete obj.blindMode;
// if (obj.difficulty === "normal") delete obj.difficulty;
// if (obj.funbox === "none") delete obj.funbox;
// //stripping english causes issues in result filtering; this line:
// //let langFilter = ResultFilters.getFilter("language", result.language);
// //returns false if language isn't defined in result
// //if (obj.language === "english") delete obj.language;
// if (obj.numbers === false) delete obj.numbers;
// if (obj.punctuation === false) delete obj.punctuation;
// await User.findOne({ uid: uid }, (err, user) => {
// user.results.push(obj);
// user.save();
// });
// }
// API
// BOT API
// Might want to move this to a seperate file and add some sort of middleware that can send error if the user is not found
app.use(function (e, req, res, next) {
console.log("Error", e);
return res.status(e.status || 500).json(e || {});
});