const express = require('express') const crypto = require('crypto') const mail = require('../config/MailConfig.js') const Team = require('../models/TeamModel.js') const User = require('../models/UserModel.js') const LeaderBoard = require('../models/LeaderboardModel.js') const Coupon = require('../models/CouponModel.js') const validator = require('../middlewares/UserValidator.js') const dotenv = require("dotenv"); dotenv.config({ path: "./config.env" }); var successTeam, successUser, successLeaderBoard; module.exports.createTeam = async function createTeam(req, res) { try { let data = (req.body) let TeamName = data.TeamName let Code = crypto.randomBytes(4).toString("hex"); let teamobj = { TeamName: TeamName.toLowerCase(), Code: Code, Password: data.Password } let team = await Team.create(teamobj); successTeam = team; console.log("Team Created") let url =process.env.FRONTEND+ `/register/:${Code}` let leader = { Name: data.Name, Email: data.Email.toLowerCase(), Password: data.Password, RollNumber: data.RollNumber, PhoneNumber: data.PhoneNumber, Branch: data.Branch, Year: data.Year, DiscordID: data.DiscordId, Role: "Leader", Password: data.Password, TeamID: team._id } var err = await validator.validateUser(leader) if (err) { console.log("User Not Validated") throw new Error(err) } else { console.log("User Validated") console.log(leader) let user = await User.create(leader); successUser = user; let leaderboard = new LeaderBoard({ TeamID: team._id, TeamName: TeamName.toLowerCase(), Points: 0 }) await LeaderBoard.create(leaderboard); successLeaderBoard = leaderboard; var qresp = Team.findByIdAndUpdate(team._id, { $push: { Members: user._id } }).exec(); mail.sendMailLeader(data.Email,"Successfully Created team for Raptus!" ,TeamName, Code,data.Name); res.json({ message: "Team Registered Successfully", status: true, Code: Code, URL: url, TeamName: TeamName, Resp: qresp }); } } catch (error) { if (successTeam) Team.findByIdAndDelete(successTeam._id).exec(); if (successUser) User.findByIdAndDelete(successUser._id).exec(); if (successLeaderBoard) LeaderBoard.findByIdAndDelete(successLeaderBoard._id).exec(); if (error.code === 11000) { var message = error; if (error.keyValue.TeamName) message = "Team Name already exists" if (error.keyValue.Code) message = "Team Code already exists" if (error.keyValue.Email) message = "Email already exists" if (error.keyValue.RollNumber) message = "Roll Number already exists" if (error.keyValue.PhoneNumber) message = "Phone Number already exists" if (error.keyValue.DiscordID) message = "Discord Id already exists" res.json({ message: message }) return } // console.log(error) else res.json({ status: false, message: error.message }) } } module.exports.verifyTeam = async function verifyTeam(req, res) { try { let data = req.body let team = await Team.findOne({ Code: data.Code }) if (team) { if (team.Members.length <= 3) { res.json({ status: true, url: process.env.FRONTEND+`/register/:${team.Code}`, TeamName: team.TeamName, Code: data.Code }) } else if (team.Members.length == 4) { res.json({ status: false, message: "Team is Full !!" }); } } else { res.json({ status: false, message: "Invalid Team Code" }); } } catch (error) { res.json({ status: false, message: error.message }) } } module.exports.info = async function info(req, res) { try { let data = req.body; let team = await Team.findOne({ Code: data.code }) if (team) { if (team.Members.length <= 3) { res.json({ status: true, url: process.env.FRONTEND+`/register/:${team.Code}`, TeamName: team.TeamName, Code: data.Code }) } else if (team.Members.length == 4) { res.json({ status: false, message: "Team is Full !!" }); } } else { res.json({ status: false, message: "Invalid URL" }); } } catch (error) { res.json({ status: false, message: error.message }) } } module.exports.joinTeam = async function joinTeam(req, res) { try { let data = (req.body) let Code = req.params.id.substring(1); let team = await Team.findOne({ Code: Code }) let member = { Name: data.Name, Email: data.Email, Password: team.Password, RollNumber: data.RollNumber, PhoneNumber: data.PhoneNumber, Branch: data.Branch, Year: data.Year, DiscordID: data.DiscordId, Role: "Member", Password: team.Password, TeamID: team._id } var err = await validator.validateUser(member) //console.log(err) if (err) { console.log("User Not Validated") throw new Error(err) } else { console.log("User Validated") let user; if (team.Members.length <= 3) { user = await User.create(member); successUser = user; team.Members.push(user._id) await team.save() console.log(team) console.log(user) mail.sendMailMember(data.Email, "Successfully Joined team for Raptus!", team.TeamName, team.Code, data.Name); } else { res.json({ status: false, message: "Team is already full !!", }); } res.json({ status: true, message: "Member registered successfully", TeamName: team.TeamName, });} } catch (error) { if (successUser) User.findByIdAndDelete(successUser._id).exec(); if (error.code === 11000) { var message = error; if (error.keyValue.Email) message = "Email already exists" if (error.keyValue.RollNumber) message = "Roll Number already exists" if (error.keyValue.PhoneNumber) message = "Phone Number already exists" if (error.keyValue.DiscordID) message = "Discord Id already exists" res.json({ status: false, message: message }) return } // console.log(error) else res.json({ status: false, message: error.message }) } } module.exports.coupon = async function coupon(req, res) { try { let couponCode = crypto.randomBytes(6).toString("hex"); res.json({ status: true, Coupon: couponCode }); let couponCreated = await Coupon.create({ Coupon: couponCode }) } catch (error) { res.status(500).json({ message: error.message }) } }