Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions middleware/verifyLogin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import User from "../models/userModel.js";

const verifyLogin = async (req, res, next) => {
const email = req.user.email;

try{
const userData = await User.findOne({where : {email}});
console.log(email);
console.log(userData);
if(!userData) return res.status(400).json({message: "You are not signed up"});

req.userData = userData;
next();
}
catch(error){
console.error(error);
res.status(500).json({message: "Server Error"});
}

}

export default verifyLogin;
204 changes: 171 additions & 33 deletions routes/user/teamRoutes.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,36 @@ import Chance from 'chance';
import Team from '../../models/teamModel.js';
import Track from '../../models/trackModel.js';
import sequelize from '../../config/db.js';
import { where } from 'sequelize';
import verifyLogin from '../../middleware/verifyLogin.js'
import { Op } from 'sequelize';

const teamRouter = Router();

//Create a new team
teamRouter.post("/create", verifyFirebaseToken, verifyAllowed, async(req, res) => {
teamRouter.post("/create", verifyFirebaseToken, verifyAllowed, verifyLogin, async(req, res) => {
//Get the Data
const {leaderId, name, trackId} = req.body;
if(!leaderId || !name || !trackId){
const user = req.userData;
const {name, trackId} = req.body;
if(!name || !trackId){
return res.status(400).json({
message : "Try Again, Some Data is missing"
})
}

//Check if user is already in a team -> (40_) and if track is present
const [user, track] = await Promise.all([
User.findByPk(leaderId),
Track.findByPk(trackId)
])
if(!user)
return res.status(400).json({ message : "User does not exist" })

if(user.teamNo)
return res.status(400).json({ message : "You are already part of a team" })

if(!track)
return res.status(400).json({ "message" : "Please enter a valid Track" })
//Check if user is already in a team -> (40_) and if track is present
try{
const track = await Track.findByPk(trackId)
if(!track)
return res.status(400).json({ "message" : "Please enter a valid Track" })
}
catch(error){
console.error(error);
return res.status(500).json({ message: "Server error" })
}


//generate unique code
const chance = new Chance();
Expand All @@ -50,7 +53,7 @@ teamRouter.post("/create", verifyFirebaseToken, verifyAllowed, async(req, res) =
{
name,
teamCode : generateTeamCode(),
leaderId,
leaderId : user.id,
trackId
},
{transaction : t}
Expand All @@ -60,6 +63,7 @@ teamRouter.post("/create", verifyFirebaseToken, verifyAllowed, async(req, res) =
user.teamNo = team.srNo;
await user.save({transaction : t});

//Commit the transaction
await t.commit();
return res.json({
message : "Team Created Successfully",
Expand All @@ -85,33 +89,167 @@ teamRouter.post("/create", verifyFirebaseToken, verifyAllowed, async(req, res) =
})

//Join a existing team
teamRouter.post("/join", verifyFirebaseToken, verifyAllowed, async(req, res) => {
//Get userId, teamCode
const {userId, teamCode} = req.body;
teamRouter.post("/join", verifyFirebaseToken, verifyAllowed, verifyLogin, async(req, res) => {
//Get user, teamCode
const {teamCode} = req.body;
const user = req.userData;

//Check if user is already associated witha a team
if(user.teamNo != null) return res.status(400).json({message : "User is already present in a team"})

//Check if missing data
if(!userId || !teamCode) return res.status(400).json({message: "Try Again, Some Data is missing"})
if(!teamCode) return res.status(400).json({message: "Try Again, Team Code is missing"})

try{
//Check if the team exists
const team = await Team.findOne({
where:{
teamCode : teamCode
}
})
if(!team) return res.status(400).json({message : "Invalid Team Code"});

//Check if the team exists
const team = await Team.findOne({
where:{
teamCode : teamCode
//find the user -> if user exists update the team else respond eith 400
user.teamNo = team.srNo;
await user.save();

//Return success message
res.json({
message : "Team is joined successfully"
})
}
catch(error){
console.error(error);
return res.status(500).json({ message: "Server error" })
}
})

//dissolve an existing team
teamRouter.post("/delete", verifyFirebaseToken, verifyAllowed, verifyLogin, async(req, res) => {
//Check if the user exists
const user = req.userData;

//Check if the user is part of any team
if(!user.teamNo) return res.status(400).json({message : "User is not part of any team"});

//Set the team status as dissolved
try{
//Updates the team status to dissolved only if team exists and user is the team leader
const [affectedCount] = await Team.update({status : "dissolved"}, {where : {srNo : user.teamNo, leaderId : user.id}});
if(affectedCount == 0) return res.status(403).json({message : "Only leader can delete the team"});

res.json({message : "Your Team is successfully deleted"});
}
catch(error){
console.error(error);
return res.status(500).json({ message: "Server error" })
}
})

//Make team leader
teamRouter.post("/makeLeader", verifyFirebaseToken, verifyAllowed, verifyLogin, async (req,res) => {
const leader = req.userData;

if(!leader.teamNo) return res.status(400).json({message : "You are not part of a team"});

const {userId} = req.body;
if(!userId) return res.status(400).json({message: "userId is missing"});

try{
const team = await Team.findOne({where : {leaderId: leader.id}});

if (!team) {
return res.status(403).json({ message: "You are not the leader of any team" });
}
})
if(!team) res.status(400).json({message : "Invalid Team Code"});

//find the user -> if user exists update the team else respond eith 400
const [affectedCount] = await User.update({teamNo : team.srNo}, {where : {id: userId, teamNo: null}});
if(team.status === "dissolved"){
return res.status(400).json({
message: "Leader's team is deleted"
})
}

if(affectedCount === 0){
return res.status(400).json({
message: "User does not exist or already in a team"
const user = await User.findByPk(userId);

if(!user){
return res.status(400).json({
message: "User does not exist"
})
}

if(user.teamNo != leader.teamNo){
return res.status(400).json({
message: "User is not in the same team as leader"
})
}

if (user.id === leader.id) {
return res.status(400).json({ message: "You are already the leader" });
}

//Changing the leader
team.leaderId = user.id;
await team.save();

return res.json({
message: "Leader changed successfully",
leaderId: user.id,
teamNo: team.srNo
})
}
catch(error){
console.error(error);
return res.status(500).json({ message: "Server error" })
}


res.json({
message : "Team is joined successfully"
})
})


//leave a team
teamRouter.post("/leave", verifyFirebaseToken, verifyAllowed, verifyLogin, async(req, res) => {
//Check if the user exists
const user = req.userData;

//Check if the user is part of any team
if(!user.teamNo) return res.status(400).json({message : "User is not part of any team"});
const teamNo = user.teamNo;

const t = await sequelize.transaction();
try{
//Check if user was a leader
const team = await Team.findOne({where: {leaderId: user.id}});

if(team){
const users = await User.findAll({where : {teamNo: teamNo, id: { [Op.not]: user.id }}});
if(users.length == 0){
team.status = "dissolved";
await team.save({transaction: t});
res.json({
message: "You successfully left the team and Team is dissolved"
})
}
else{
team.leaderId = users[0].id;
await team.save({transaction: t})
res.json({
message: `You successfully left the team and ${users[0].name} is new leader`,
leader : users[0]
})
}
}
else{
res.json({message : "You have successfully left the team"});
}

user.teamNo = null;
await user.save({transaction : t});
await t.commit();
}
catch(error){
await t.rollback();
console.error(error);
return res.status(500).json({ message: "Server error" })
}
})


Expand Down