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
213 changes: 85 additions & 128 deletions backend/src/controller/auth.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,116 +5,101 @@ import bcrypt from "bcrypt";
import generateToken, { type jwtPayload } from "../utils/generateToken.js";
import redisClient from "../config/redis.js";
import jwt from "jsonwebtoken";
import blackListToken from "../utils/blacklistToken.js";
import asyncHandler from "../utils/asyncHandler.js";
import invalidateTokens from "../utils/invalidateTokens.js";

//Authentication (Auth Controller)
export const registerUser = async (req: Request, res: Response) => {
export const registerUser = asyncHandler(async (req: Request, res: Response) => {
const parsedData = registerSchema.safeParse(req.body);
if(!parsedData.success) {
return res.status(400).json({
message: "Something is wrong in input"
})
}

try {
const { username, email, name, password } = parsedData.data;

const findUser = await prismaClient.user.findFirst({
where: {
OR: [ { username }, { email } ]
}
})

if(findUser) {
return res.status(400).json({
messasge: "User already exists",
})
const { username, email, name, password } = parsedData.data;

const findUser = await prismaClient.user.findFirst({
where: {
OR: [ { username }, { email } ]
}

const salt = await bcrypt.genSalt(5);
const hash = await bcrypt.hash(password, salt);

const user = await prismaClient.user.create({
data: {
username,
email,
name,
password: hash
}
})

if(findUser) {
return res.status(400).json({
messasge: "User already exists",
})
}

generateToken(user.id, res); //token seted
const salt = await bcrypt.genSalt(5);
const hash = await bcrypt.hash(password, salt);

res.status(201).json({
message: "User created successfully",
data: {
username: user.username,
email: user.email,
name: user.name,
verified: false,
}
})
const user = await prismaClient.user.create({
data: {
username,
email,
name,
password: hash
}
})

} catch (error) {
console.log("Error in user regiser: ", error);
res.status(500).json({
message: "Error in signing"
})
}
}
generateToken(user.id, res);

export const loginUser = async (req: Request, res: Response) => {
res.status(201).json({
message: "User created successfully",
data: {
username: user.username,
email: user.email,
name: user.name,
verified: false,
}
})
});

export const loginUser = asyncHandler(async (req: Request, res: Response) => {
const parsedData = loginSchema.safeParse(req.body);
if(!parsedData.success) {
return res.status(400).json({
message: "Something is wrong in input"
})
}

try {
const { username, password } = parsedData.data;
const { username, password } = parsedData.data;

const user = await prismaClient.user.findUnique({
where: {
username
}
})
if(!user) {
return res.status(404).json({
message: "User doesn't exist"
})
const user = await prismaClient.user.findUnique({
where: {
username
}

const isValid = await bcrypt.compare(password, user.password);

if(!isValid) {
return res.status(401).json({
message: "wrong password"
})
}

generateToken(user.id, res);

return res.status(200).json({
message: "successfully loged in",
user: {
id: user.id,
username: user.username,
email: user.email,
name: user.name,
}
})
if(!user) {
return res.status(404).json({
message: "User doesn't exist"
})
}

} catch (error) {
console.log("Erorr in login endpoint: ", error);
res.status(500).json({
message: "Error in login"
const isValid = await bcrypt.compare(password, user.password);

if(!isValid) {
return res.status(401).json({
message: "wrong password"
})
}
}

generateToken(user.id, res);

return res.status(200).json({
message: "successfully loged in",
user: {
id: user.id,
username: user.username,
email: user.email,
name: user.name,
}
})
});


export const refreshAccessToken = async (req: Request, res: Response) => {
export const refreshAccessToken = asyncHandler(async (req: Request, res: Response) => {
const accessToken = req.cookies.accessToken;
const refreshToken = req.cookies.refreshToken;

Expand All @@ -124,39 +109,28 @@ export const refreshAccessToken = async (req: Request, res: Response) => {
})
}

try {
const decodeRefreshToken = await jwt.verify(refreshToken, process.env.JWT_SECRET!) as jwtPayload;
const decodeAccessToken = await jwt.verify(accessToken, process.env.JWT_SECRET!) as jwtPayload;

const isRefreshTokenBlacklisted = await redisClient.get(decodeRefreshToken.jti); //jti is unique
const isAccessTokenBlacklisted = await redisClient.get(decodeAccessToken.jti);

if(isRefreshTokenBlacklisted || isAccessTokenBlacklisted) {
return res.status(400).json({
message: "Token is blacklisted, can't refresh the token"
})
}

blackListToken(decodeRefreshToken.jti, 604800);
blackListToken(decodeAccessToken.jti, 900);
const decodeRefreshToken = await jwt.verify(refreshToken, process.env.JWT_SECRET!) as jwtPayload;
const decodeAccessToken = await jwt.verify(accessToken, process.env.JWT_SECRET!) as jwtPayload;

generateToken(decodeRefreshToken.id, res);
const isRefreshTokenBlacklisted = await redisClient.get(decodeRefreshToken.jti);
const isAccessTokenBlacklisted = await redisClient.get(decodeAccessToken.jti);

res.status(200).json({
message: "Token refreshed successfully"
})

} catch (error) {
console.log("Error in token refreshing: ", error);
res.status(500).json({
message: "Error in token refreshing"
if(isRefreshTokenBlacklisted || isAccessTokenBlacklisted) {
return res.status(400).json({
message: "Token is blacklisted, can't refresh the token"
})
}

}
invalidateTokens(accessToken, refreshToken, res);
generateToken(decodeRefreshToken.id, res);

res.status(200).json({
message: "Token refreshed successfully"
})
});

export const logoutUser = (req: Request, res: Response) => {

export const logoutUser = asyncHandler(async (req: Request, res: Response) => {
const refreshToken = req.cookies.refreshToken;
const accessToken = req.cookies.accessToken;

Expand All @@ -166,26 +140,9 @@ export const logoutUser = (req: Request, res: Response) => {
})
}

try {
const decodeRefreshToken = jwt.verify(refreshToken, process.env.JWT_SECRET!) as jwtPayload;
const decodeAccessToken = jwt.verify(accessToken, process.env.JWT_SECRET!) as jwtPayload;

//blacklist both tokens
blackListToken(decodeRefreshToken.jti, 604800);
blackListToken(decodeAccessToken.jti, 900);

res.clearCookie("refreshToken");
res.clearCookie("accessToken");
invalidateTokens(accessToken, refreshToken, res);

res.status(200).json({
message: "Successully loged out"
})

} catch (error) {
console.log("Error in logout funtion: ", error);

res.status(500).json({
message: "Error in server",
})
}
}
res.status(200).json({
message: "Successully loged out"
})
});
Loading