mirror of
https://github.com/bluewave-labs/Checkmate.git
synced 2026-01-10 11:49:49 -06:00
removed double login prevention
This commit is contained in:
@@ -78,28 +78,10 @@ function Sidebar() {
|
||||
*
|
||||
*/
|
||||
const logout = async () => {
|
||||
try {
|
||||
// Make request to BE to remove JWT from user
|
||||
await axiosInstance.post(
|
||||
"/auth/logout",
|
||||
{ email: authState.user.email },
|
||||
{
|
||||
headers: {
|
||||
Authorization: `Bearer ${authState.authToken}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
// Clear auth state
|
||||
dispatch(clearAuthState());
|
||||
dispatch(clearUptimeMonitorState());
|
||||
navigate("/login");
|
||||
} catch (error) {
|
||||
createToast({
|
||||
body: error.message,
|
||||
});
|
||||
}
|
||||
// Clear auth state
|
||||
dispatch(clearAuthState());
|
||||
dispatch(clearUptimeMonitorState());
|
||||
navigate("/login");
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -160,13 +160,12 @@ const Monitors = () => {
|
||||
// Bool for sorting arrow
|
||||
const [isSorted, setIsSorted] = useState(false);
|
||||
|
||||
|
||||
// Function to handle sorting on click of status text
|
||||
const handleSort = () => {
|
||||
setSortOrder(prevOrder => prevOrder * -1);
|
||||
|
||||
setSortOrder((prevOrder) => prevOrder * -1);
|
||||
|
||||
// Sort existing monitors with start of ascending order
|
||||
const monitors = [...monitorState.monitors].sort(a => {
|
||||
const monitors = [...monitorState.monitors].sort((a) => {
|
||||
return a.status ? -1 * sortOrder : 1 * sortOrder;
|
||||
});
|
||||
|
||||
@@ -182,9 +181,21 @@ const Monitors = () => {
|
||||
{
|
||||
id: 2,
|
||||
name: (
|
||||
<Box width="max-content" onClick={handleSort} style={{ cursor: "pointer" }}>
|
||||
<Box
|
||||
width="max-content"
|
||||
onClick={handleSort}
|
||||
style={{ cursor: "pointer" }}
|
||||
>
|
||||
Status
|
||||
{isSorted ? <span>{sortOrder === -1 ? <ArrowUpwardRoundedIcon /> : <ArrowDownwardRoundedIcon />}</span> : null}
|
||||
{isSorted ? (
|
||||
<span>
|
||||
{sortOrder === -1 ? (
|
||||
<ArrowUpwardRoundedIcon />
|
||||
) : (
|
||||
<ArrowDownwardRoundedIcon />
|
||||
)}
|
||||
</span>
|
||||
) : null}
|
||||
</Box>
|
||||
),
|
||||
},
|
||||
@@ -195,6 +206,7 @@ const Monitors = () => {
|
||||
rows: [],
|
||||
};
|
||||
|
||||
console.log(monitorState.monitors);
|
||||
// Render out sorted monitors/default monitors
|
||||
data.rows = sortedMonitors.map((monitor, idx) => {
|
||||
const params = {
|
||||
|
||||
@@ -136,10 +136,6 @@ const loginController = async (req, res, next) => {
|
||||
throw new Error(errorMessages.AUTH_INCORRECT_PASSWORD);
|
||||
}
|
||||
|
||||
if (user.authToken) {
|
||||
throw new Error(errorMessages.AUTH_ALREADY_LOGGED_IN);
|
||||
}
|
||||
|
||||
// Remove password from user object. Should this be abstracted to DB layer?
|
||||
const userWithoutPassword = { ...user._doc };
|
||||
delete userWithoutPassword.password;
|
||||
@@ -164,23 +160,6 @@ const loginController = async (req, res, next) => {
|
||||
}
|
||||
};
|
||||
|
||||
const logoutController = async (req, res, next) => {
|
||||
try {
|
||||
// Get user
|
||||
const { email } = req.body;
|
||||
const userToLogout = await req.db.getUserByEmail(email);
|
||||
userToLogout.authToken = null;
|
||||
await userToLogout.save();
|
||||
|
||||
return res
|
||||
.status(200)
|
||||
.json({ success: true, msg: successMessages.AUTH_LOGOUT_USER });
|
||||
} catch (error) {
|
||||
error.service = SERVICE_NAME;
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
const userEditController = async (req, res, next) => {
|
||||
try {
|
||||
await editUserParamValidation.validateAsync(req.params);
|
||||
@@ -524,7 +503,6 @@ const getAllUsersController = async (req, res) => {
|
||||
module.exports = {
|
||||
registerController,
|
||||
loginController,
|
||||
logoutController,
|
||||
userEditController,
|
||||
inviteController,
|
||||
inviteVerifyController,
|
||||
|
||||
@@ -34,27 +34,11 @@ const verifyJWT = (req, res, next) => {
|
||||
|
||||
const parsedToken = token.slice(TOKEN_PREFIX.length, token.length);
|
||||
// Verify the token's authenticity
|
||||
jwt.verify(parsedToken, process.env.JWT_SECRET, async (err, decoded) => {
|
||||
jwt.verify(parsedToken, process.env.JWT_SECRET, (err, decoded) => {
|
||||
if (err) {
|
||||
try {
|
||||
const userId = jwt.decode(parsedToken)._id;
|
||||
await req.db.logoutUser(userId);
|
||||
logger.error(errorMessages.INVALID_AUTH_TOKEN, {
|
||||
service: SERVICE_NAME,
|
||||
});
|
||||
return res
|
||||
.status(401)
|
||||
.json({ success: false, msg: errorMessages.INVALID_AUTH_TOKEN });
|
||||
} catch (error) {
|
||||
logger.error(errorMessages.UNKNOWN_ERROR, {
|
||||
service: SERVICE_NAME,
|
||||
error: error,
|
||||
});
|
||||
error.status = 401;
|
||||
error.service = SERVICE_NAME;
|
||||
next(error);
|
||||
return;
|
||||
}
|
||||
return res
|
||||
.status(401)
|
||||
.json({ success: false, msg: errorMessages.INVALID_AUTH_TOKEN });
|
||||
}
|
||||
//Add the user to the request object for use in the route
|
||||
req.user = decoded;
|
||||
|
||||
@@ -40,9 +40,6 @@ const UserSchema = mongoose.Schema(
|
||||
default: "user",
|
||||
enum: ["user", "admin"],
|
||||
},
|
||||
authToken: {
|
||||
type: String,
|
||||
},
|
||||
},
|
||||
{
|
||||
timestamps: true,
|
||||
|
||||
@@ -24,7 +24,6 @@ const {
|
||||
//Auth routes
|
||||
router.post("/register", upload.single("profileImage"), registerController);
|
||||
router.post("/login", loginController);
|
||||
router.post("/logout", logoutController);
|
||||
router.put(
|
||||
"/user/:userId",
|
||||
upload.single("profileImage"),
|
||||
|
||||
@@ -7,7 +7,6 @@ const errorMessages = {
|
||||
UNAUTHORIZED: "Unauthorized access",
|
||||
AUTH_ADMIN_EXISTS: "Admin already exists",
|
||||
AUTH_INVITE_NOT_FOUND: "Invite not found",
|
||||
AUTH_ALREADY_LOGGED_IN: "User already logged in",
|
||||
|
||||
//Error handling middleware
|
||||
UNKNOWN_SERVICE: "Unknown service",
|
||||
|
||||
Reference in New Issue
Block a user