RaptusBackend / controllers /QuestionController.js
GitHub Actions
Initial commit
df72131
const asyncHandler = require("express-async-handler");
const Room = require("../models/RoomModel");
const Question = require("../models/QuestionsModel");
const User = require("../models/UserModel");
const Team = require("../models/TeamModel");
const { questionSolved, questionSolvedlvl3 } = require("../sockets/QuestionSolved");
const Leaderboard = require("../models/LeaderboardModel");
const Round = require("../models/RoundsModel");
const CollaborativeLeaderboardModel = require("../models/CollaborativeLeaderboardModel");
const { round4End, teamRoundOver } = require("../sockets/RoundStartEnd");
const { updateLeaderBoard } = require("../sockets/LeaderBoardUpdated");
const UserQuestionModel = require("../models/UserQuestionModel");
exports.validateAnswer = asyncHandler(async (req, res) => {
try {
//In data from frontend we will recieve qs no. and answer enterd by user
//data must contain QuestionNumber and Answer
let data = req.body;
let question = await Question.findOne({ QuestionNumber: data.QuestionNumber })
let round = await Round.findOne({ Round: question.Round });
let date = new Date();
if (!round.Enabled) {
res.send("Round is disabled");
return;
}
if (date >= round.StartTime && date <= round.EndTime) {
let board = await Leaderboard.findOne({ TeamID: req.team._id, Round: question.Round })
let mainBoard=await Leaderboard.findOne({TeamID:req.team._id,Round:0})
if (question.Round === 3) {
board = await CollaborativeLeaderboardModel.findOne({
$or: [{ TeamID1: req.team._id }, { TeamID2: req.team._id }]
});
}
if ((data.Answer).trim() === (question.Answer).trim()) {
let x = board.Questions.Unsolved.indexOf(question._id);
let y = board.Questions.Solved.indexOf(question._id);
if (x === -1 && y !== -1) {
res.json({
message: "Question already solved",
status: false
})
return;
}
else if (x === -1) {
res.json({
message: "Question not found",
status: false
})
return;
}
let ques2=await UserQuestionModel.findOne({TeamID:req.team._id,QuestionNumber:question.QuestionNumber,Round:question.Round})
board.Questions.Unsolved.splice(x, 1);
// console.log(board.Questions.Unsolved);
board.Questions.Solved.push(question._id);
board.Points += question.Points;
mainBoard.Points += question.Points;
await mainBoard.save();
if(question.Round === 3){
board.Team1Points += question.Points;
board.Team2Points += question.Points;
questionSolvedlvl3(req, req.user, ques2, board)
}
board.Time = Date.now();
await board.save();
if(question.Round !== 3)
updateLeaderBoard(req)
questionSolved(req, req.user, ques2);
if (board.Questions.Unsolved.length === 0 && question.Round === 4 && question.QuestionNumber===94) {
round.Enabled = false;
await round.save();
round4End();
}
else if(board.Questions.Unsolved.length === 0){
board.Enabled = false;
await board.save();
teamRoundOver(req.user,question.Round)
}
res.json({
message: "CORRECT ANSWER !",
status: true
})
}
else {
res.json({
message: "INCORRECT ANSWER !",
status: false
})
}
}
else {
res.json({
message: "Round has not started yet",
status: false
})
return;
}
}
catch (error) {
console.log(error);
res.status(500).json({
message: error.message,
status: false
})
}
})
exports.hintProvider = asyncHandler(async (req, res) => {
try {
//In data from frontend we will recieve hintAddress of that question
let data = req.body;
let round = data.Round;
let hintAddress = data.HintAddress;
let question = await UserQuestionModel.findOne({ TeamID: req.team._id, HintAddress: hintAddress, Round: round })
if (question !== null) {
res.json({
Hint: question.Hint,
status: true
})
}
else{
res.json({
Hint:hintAddress+":Some Error Occured Contact ccs for more help",
status:true
})
}
}
catch (error) {
res.status(500).json({
message: error.message,
status: false
})
}
})