Skip to content

Commit

Permalink
Merge pull request tryyang2001#76 from tryyang2001/User-Microservice
Browse files Browse the repository at this point in the history
User microservice intergration with Frontend (2), Frontend components(Sidebar) update
  • Loading branch information
hhchinh2002 authored Apr 11, 2024
2 parents 45e7f83 + 5a34543 commit 0ce6178
Show file tree
Hide file tree
Showing 37 changed files with 1,046 additions and 516 deletions.
116 changes: 68 additions & 48 deletions backend/user-service/controllers/user-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,24 @@ import { Request, Response } from "express";
import jwt, { Secret } from "jsonwebtoken";
import bcrypt from "bcrypt";
import db from "../models/user-model";
import HttpStatusCode from "../libs/enums/HttpStatusCode";

async function registerUser(req: Request, res: Response) {
const { email, password, name, major, course, role } = req.body;
const { email, password, name, major, role } = req.body;

console.log("registering new user", req.body);
try {
const emailSearch = await db.getUserByEmail(email);

if (emailSearch.rows.length > 0) {
console.log("Email already exists.");
return res.json({
error: "Email already exists.",
return res.status(HttpStatusCode.BAD_REQUEST.valueOf()).json({
message: "Email already exists.",
});
} else if (password.length < 10) {
console.log("Password not long enough.");
return res.json({
error: "Password not long enough.",
return res.status(HttpStatusCode.BAD_REQUEST.valueOf()).json({
message: "Password not long enough.",
});
}
bcrypt
Expand All @@ -29,39 +30,37 @@ async function registerUser(req: Request, res: Response) {
const uid = await db.createNewUser(
name,
major,
course,
email,
hash,
role
);
return res.json({ uid });
} catch (err) {
console.log(err);
return res.json({
error: "Failed to create user.",
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).json({
message: "Failed to create user.",
});
}
})
.catch((err) => {
console.log(err);
return res.send({ message: "Error crypting password." });
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).json({ message: "Error crypting password." });
});
} catch (err) {
console.log(err);
return res.json({
error: "Undefined error creating users.",
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).json({
message: "Undefined error creating users.",
});
}
}

async function loginUser(req: Request, res: Response) {
const { email, password } = req.body;

const emailSearch = await db.getUserByEmail(email);
if (emailSearch.rows.length == 0) {
console.log("User does not exist.");
return res.json({
error: "User does not exist.",
return res.status(HttpStatusCode.BAD_REQUEST.valueOf()).json({
message: "User does not exist.",
});
} else if (emailSearch.rows.length > 0) {
const user = emailSearch.rows[0];
Expand All @@ -72,31 +71,35 @@ async function loginUser(req: Request, res: Response) {
.then((result) => {
if (!result) {
console.log("Incorrect password.");
return res.json({
error: "Incorrect password.",
return res.status(HttpStatusCode.FORBIDDEN.valueOf()).json({
message: "Incorrect password.",
});
} else {
const jwtSecretKey: Secret | undefined = process.env.JWT_SECRET_KEY;
if (!jwtSecretKey) {
console.error("JWT secret key is not defined.");
return res.status(500).json({
error: "Internal server error.",
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).json({
message: "Internal server error.",
});
}

const data = {
const payload = {
email: email,
password: hash,
uid: user.uid,
};

const token = jwt.sign(data, jwtSecretKey, { expiresIn: "5d" });
const token = jwt.sign(payload, jwtSecretKey, { expiresIn: "5d" });
const responseData = {
uid: user.uid,
role: user.role,
}
res
.cookie("token", token, {
path: "/",
httpOnly: true,
maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days expiry
})
.json({ user });
.json(responseData);
}
})
.catch((err) => {
Expand All @@ -106,22 +109,29 @@ async function loginUser(req: Request, res: Response) {
}
}

async function getUserByUserId(req: Request, res: Response) {
const { uid } = req.body;
async function getUserInfo(req: Request, res: Response) {
const queryUidString = req.query.uid;
console.log(queryUidString);
if (typeof queryUidString !== 'string') {
return res.status(HttpStatusCode.BAD_REQUEST.valueOf()).json({ message: 'Invalid uid.' });
}

try {
const uid = parseInt(queryUidString, 10);
console.log(uid);
const userIdSearch = await db.getUserByUserId(uid);
if (userIdSearch.rows.length == 0) {
console.log("User does not exist.");
return res.json({
error: "User does not exist.",
return res.status(HttpStatusCode.BAD_REQUEST.valueOf()).json({
message: "User does not exist.",
});
} else if (userIdSearch.rows.length > 0) {
const user = userIdSearch.rows[0];
return res.json(user);
}
} catch (err) {
console.log(err);
return res.send({
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).json({
message: "Error getting user by uid.",
});
}
Expand All @@ -133,16 +143,16 @@ async function getUserByEmail(req: Request, res: Response) {
const emailSearch = await db.getUserByEmail(email);
if (emailSearch.rows.length == 0) {
console.log("User does not exist.");
return res.json({
error: "User does not exist.",
return res.status(HttpStatusCode.BAD_REQUEST.valueOf()).json({
message: "User does not exist.",
});
} else if (emailSearch.rows.length > 0) {
const user = emailSearch.rows[0];
return res.json(user);
}
} catch (err) {
console.log(err);
return res.send({
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).json({
message: "Error getting user by email.",
});
}
Expand All @@ -154,7 +164,7 @@ async function getAllUsers(req: Request, res: Response) {
return res.json(allUsers);
} catch (err) {
console.log(err);
return res.send({ message: "Error getting all users." });
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).send({ message: "Error getting all users." });
}
}

Expand All @@ -164,8 +174,8 @@ async function updateUserPassword(req: Request, res: Response) {
const userIdSearch = await db.getUserByUserId(uid);
if (userIdSearch.rows.length == 0) {
console.log("User does not exist.");
return res.json({
error: "User does not exist.",
return res.status(HttpStatusCode.FORBIDDEN.valueOf()).json({
message: "User does not exist.",
});
} else if (userIdSearch.rows.length > 0) {
const hash = userIdSearch.rows[0].password;
Expand All @@ -175,8 +185,8 @@ async function updateUserPassword(req: Request, res: Response) {
.then((result) => {
if (!result) {
console.log("Incorrect password.");
return res.json({
error: "Incorrect password.",
return res.status(HttpStatusCode.BAD_REQUEST.valueOf()).json({
message: "Incorrect password.",
});
} else {
bcrypt
Expand All @@ -188,45 +198,55 @@ async function updateUserPassword(req: Request, res: Response) {
message: "Update password successfully.",
});
} catch (err) {
return res.json({
error: "Failed to update user password.",
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).json({
message: "Failed to update user password.",
});
}
})
.catch((err) => {
console.log(err);
return res.send({
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).send({
message: "Error crypting password.",
});
});
}
})
.catch((err) => {
console.log(err);
return res.send({
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).send({
message: "Error checking password.",
});
});
}
} catch (err) {
console.log(err);
return res.send({
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).send({
message: "Error getting user by uid.",
});
}
}

async function updateUserInfo(req: Request, res: Response) {
const { uid, email, name, major, course, role } = req.body;
const queryUidString = req.query.uid;
if (typeof queryUidString !== 'string') {
return res.status(HttpStatusCode.BAD_REQUEST.valueOf()).json({ message: 'Invalid uid.' });
}
const uid = parseInt(queryUidString);
const updateFields = req.body;

try {
await db.updateUserInfo(uid, email, name, major, course, role);
if (Object.keys(updateFields).length === 0) {
return res.status(HttpStatusCode.BAD_REQUEST.valueOf()).json({ message: 'No fields provided for update.' });
}

await db.updateUserInfo(uid, updateFields);

return res.json({
message: "User info updated.",
message: 'User info updated.',
});
} catch (err) {
return res.json({
error: "Failed to update user info.",
});
console.error('Error updating user info:', err);
return res.status(HttpStatusCode.INTERNAL_SERVER_ERROR.valueOf()).json({ message: 'Failed to update user info.' });
}
}

Expand All @@ -242,7 +262,7 @@ async function deleteUser(req: Request, res: Response) {
} catch (err) {
console.log(err);
return res.send({
error: "Undefined error deleting account.",
message: "Undefined error deleting account.",
});
}
}
Expand All @@ -257,7 +277,7 @@ async function clearCookie(req: Request, res: Response) {
export default {
registerUser,
loginUser,
getUserByUserId,
getUserInfo,
getUserByEmail,
getAllUsers,
updateUserPassword,
Expand Down
1 change: 1 addition & 0 deletions backend/user-service/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import express from 'express';
import cookieParser from 'cookie-parser';
import cors from 'cors';
import userRoute from './routes/user-route';
import HttpStatusCode from "./libs/enums/HttpStatusCode";

const app = express();

Expand Down
Loading

0 comments on commit 0ce6178

Please sign in to comment.