RaptusBackend / controllers /RoundThreeController.js
GitHub Actions
Initial commit
df72131
const asyncHandler = require("express-async-handler");
const Room = require("../models/RoomModel");
const Question = require("../models/QuestionsModel");
const Leaderboard = require("../models/LeaderboardModel");
const collaborativeLeaderboard = require("../models/CollaborativeLeaderboardModel");
const Round = require("../models/RoundsModel");
const { getRoomLeaderBoardR1R2 } = require("../helpers/LeaderBoardPreFetch");
const Team = require("../models/TeamModel");
const User = require("../models/UserModel");
const UserQuestionModel = require("../models/UserQuestionModel");
//Random array retunrer
const randomUniqueArray = (n, array) => {
var arr = [];
while (arr.length < n) {
var r = Math.floor(Math.random() * array.length) + 0;
if (arr.indexOf(array[r]) === -1) arr.push(array[r]);
}
return arr;
}
//MULTI BIG FUNCTION :: INITIAL ASSIGNMENT
module.exports.roundThreeAssign = asyncHandler(async (req, res) => {
try {
let date = new Date();
let roundNumber = 3;
let round = await Round.findOne({ Round: 3 });
if (!round.Enabled) {
res.send("Round is disabled");
return;
}
if (date >= round.StartTime && date <= round.EndTime) {
let board = await collaborativeLeaderboard.findOne({
$or: [{ TeamID1: req.team._id }, { TeamID2: req.team._id }]
});
if (board === null) {
res.send("You are not selected for this round");
return;
}
if (!board.Enabled) {
res.send("This round is no longer available");
return;
}
//ASSIGNING QUESTIONS
let temp = await Round.findOne({ Round: roundNumber });
let roundQs = temp.Questions
if (board.Questions.Unsolved.length === 0) {
let room = await Room.findOne({ _id: board.RoomID })
let questions = room.Questions;
board.Questions.Unsolved = randomUniqueArray(roundQs, questions);
console.log(board.Questions.Unsolved)
//ASSIGNING HINTADDRESS FROM 0 TO 12
arr = []
let countr = 1;
for (let i = 0; i < board.Questions.Unsolved.length; i++) {
var r = Math.floor(Math.random() * 5) + 1;
if (arr.indexOf(r) === -1) {
arr.push(r);
let question = await Question.findOne({ _id: board.Questions.Unsolved[i] });
let UserQuestion = await UserQuestionModel.findOne({ QuestionNumber: question.QuestionNumber, TeamID: board.TeamID1 });
if (UserQuestion === null) {
UserQuestion = new UserQuestionModel({
TeamID: board.TeamID1,
QuestionID: question._id,
QuestionNumber: question.QuestionNumber,
Question: question.Question,
Description: question.Description,
Answer: question.Answer,
Hint: question.Hint,
HintAddress: r,
Round: question.Round,
Points: question.Points,
RoomID: question.RoomID,
num: countr++
})
await UserQuestion.save();
}
question = await Question.findOne({ _id: board.Questions.Unsolved[i] });
UserQuestion = await UserQuestionModel.findOne({ QuestionNumber: question.QuestionNumber, TeamID: board.TeamID2 });
if (UserQuestion === null) {
UserQuestion = new UserQuestionModel({
TeamID: board.TeamID1,
QuestionID: question._id,
QuestionNumber: question.QuestionNumber,
Question: question.Question,
Description: question.Description,
Answer: question.Answer,
Hint: question.Hint,
HintAddress: r,
Round: question.Round,
Points: question.Points,
RoomID: question.RoomID,
num: countr++
})
await UserQuestion.save();
}
}
else {
i--;
}
}
await board.save();
}
//SENDING QUESTIONS AS RESPONSE
let UnSqsnsID = board.Questions.Unsolved;
let SqsnsID = board.Questions.Solved;
let qsns = { Solved: [], Unsolved: [] }
//for unsolved
for (let i in UnSqsnsID) {
let question = await UserQuestionModel.findOne({ QuestionID: UnSqsnsID[i], TeamID: req.team._id })
if (question) {
let obj = {
QuestionNumber: question.QuestionNumber,
Question: question.Question,
Description: question.Description,
HintAddress: question.HintAddress,
Points: question.Points,
num: question.num
}
qsns.Unsolved.push(obj);
}
}
//for solved
for (let i in SqsnsID) {
let question = await UserQuestionModel.findOne({ QuestionID: SqsnsID[i], TeamID: req.team._id })
if (question) {
let obj = {
QuestionNumber: question.QuestionNumber,
Question: question.Question,
Description: question.Description,
HintAddress: question.HintAddress,
Points: question.Points,
num: question.num
}
qsns.Solved.push(obj);
}
}
res.json({
Questions: qsns,
ServerTime: new Date(),
RoundEnd: round.EndTime,
status: true
})
}
else {
//router should be closed
res.send("Round is closed");
}
}
catch (error) {
console.log(error)
res.status(500).json({
message: error.message
})
}
})