mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-10-10 07:36:09 +08:00
quote rating api
This commit is contained in:
parent
db3d25c7ef
commit
0cf93a6f00
5 changed files with 135 additions and 0 deletions
76
backend/api/controllers/quote-ratings.js
Normal file
76
backend/api/controllers/quote-ratings.js
Normal file
|
@ -0,0 +1,76 @@
|
|||
const QuoteRatingsDAO = require("../../dao/quote-ratings");
|
||||
const UserDAO = require("../../dao/user");
|
||||
const MonkeyError = require("../../handlers/error");
|
||||
|
||||
class QuoteRatingsController {
|
||||
static async getRating(req, res, next) {
|
||||
try {
|
||||
const { quoteId, language } = req.query;
|
||||
let data = await QuoteRatingsDAO.get(parseInt(quoteId), language);
|
||||
return res.status(200).json(data);
|
||||
} catch (e) {
|
||||
return next(e);
|
||||
}
|
||||
}
|
||||
static async submitRating(req, res, next) {
|
||||
try {
|
||||
let { uid } = req.decodedToken;
|
||||
let { quoteId, rating, language } = req.body;
|
||||
quoteId = parseInt(quoteId);
|
||||
rating = parseInt(rating);
|
||||
if (isNaN(quoteId) || isNaN(rating)) {
|
||||
throw new MonkeyError(
|
||||
400,
|
||||
"Bad request. Quote id or rating is not a number."
|
||||
);
|
||||
}
|
||||
if (typeof language !== "string") {
|
||||
throw new MonkeyError(400, "Bad request. Language is not a string.");
|
||||
}
|
||||
|
||||
if (rating < 1 || rating > 5) {
|
||||
throw new MonkeyError(
|
||||
400,
|
||||
"Bad request. Rating must be between 1 and 5."
|
||||
);
|
||||
}
|
||||
|
||||
//check if user already submitted a rating
|
||||
let user = await UserDAO.getUser(uid);
|
||||
|
||||
if (!user) {
|
||||
throw new MonkeyError(401, "User not found.");
|
||||
}
|
||||
let quoteRatings = user.quoteRatings;
|
||||
|
||||
if (quoteRatings === undefined) quoteRatings = {};
|
||||
if (quoteRatings[language] === undefined) quoteRatings[language] = {};
|
||||
if (quoteRatings[language][quoteId] == undefined)
|
||||
quoteRatings[language][quoteId] = undefined;
|
||||
|
||||
let quoteRating = quoteRatings[language][quoteId];
|
||||
|
||||
let newRating;
|
||||
let update;
|
||||
if (quoteRating) {
|
||||
//user already voted for this
|
||||
newRating = rating - quoteRating;
|
||||
update = true;
|
||||
} else {
|
||||
//user has not voted for this
|
||||
newRating = rating;
|
||||
update = false;
|
||||
}
|
||||
|
||||
await QuoteRatingsDAO.submit(quoteId, language, newRating, update);
|
||||
quoteRatings[language][quoteId] = rating;
|
||||
await UserDAO.updateQuoteRatings(uid, quoteRatings);
|
||||
|
||||
return res.sendStatus(200);
|
||||
} catch (e) {
|
||||
return next(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = QuoteRatingsController;
|
15
backend/api/routes/quote-ratings.js
Normal file
15
backend/api/routes/quote-ratings.js
Normal file
|
@ -0,0 +1,15 @@
|
|||
const { authenticateRequest } = require("../../middlewares/auth");
|
||||
const { Router } = require("express");
|
||||
const QuoteRatingsController = require("../controllers/quote-ratings");
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get("/get", authenticateRequest, QuoteRatingsController.getRating);
|
||||
|
||||
router.post(
|
||||
"/submit",
|
||||
authenticateRequest,
|
||||
QuoteRatingsController.submitRating
|
||||
);
|
||||
|
||||
module.exports = router;
|
32
backend/dao/quote-ratings.js
Normal file
32
backend/dao/quote-ratings.js
Normal file
|
@ -0,0 +1,32 @@
|
|||
const MonkeyError = require("../handlers/error");
|
||||
const { mongoDB } = require("../init/mongodb");
|
||||
|
||||
class QuoteRatingsDAO {
|
||||
static async submit(quoteId, language, rating, update) {
|
||||
if (update) {
|
||||
return await mongoDB()
|
||||
.collection("quote-rating")
|
||||
.updateOne(
|
||||
{ quoteId, language },
|
||||
{ $inc: { totalRating: rating } },
|
||||
{ upsert: true }
|
||||
);
|
||||
} else {
|
||||
return await mongoDB()
|
||||
.collection("quote-rating")
|
||||
.updateOne(
|
||||
{ quoteId, language },
|
||||
{ $inc: { ratings: 1, totalRating: rating } },
|
||||
{ upsert: true }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
static async get(quoteId, language) {
|
||||
return await mongoDB()
|
||||
.collection("quote-rating")
|
||||
.findOne({ quoteId, language });
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = QuoteRatingsDAO;
|
|
@ -40,6 +40,16 @@ class UsersDAO {
|
|||
}
|
||||
}
|
||||
|
||||
static async updateQuoteRatings(uid, quoteRatings) {
|
||||
const user = await mongoDB().collection("users").findOne({ uid });
|
||||
if (!user)
|
||||
throw new MonkeyError(404, "User not found", "updateQuoteRatings");
|
||||
await mongoDB()
|
||||
.collection("users")
|
||||
.updateOne({ uid }, { $set: { quoteRatings } });
|
||||
return true;
|
||||
}
|
||||
|
||||
static async updateEmail(uid, email) {
|
||||
const user = await mongoDB().collection("users").findOne({ uid });
|
||||
if (!user) throw new MonkeyError(404, "User not found", "update email");
|
||||
|
|
|
@ -26,6 +26,8 @@ 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);
|
||||
|
||||
app.use(function (e, req, res, next) {
|
||||
let uid = undefined;
|
||||
|
|
Loading…
Add table
Reference in a new issue