Skip to content

Commit b1a65ef

Browse files
authored
Merge pull request #2 from katson1/refact/1
refact/1
2 parents 88c97b7 + c9f6489 commit b1a65ef

File tree

8 files changed

+89
-87
lines changed

8 files changed

+89
-87
lines changed

app/controllers/authController.js

Lines changed: 20 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,28 @@
11
import User from "../models/userModel.js";
22
import md5 from "md5";
3-
import jwt from "jsonwebtoken";
4-
import bcrypt from "bcrypt";
5-
6-
const generateTokenAndPersonalKey = async (user) => {
7-
try {
8-
const payload = {
9-
id: user._id,
10-
username: user.username
11-
};
12-
const salt = await bcrypt.genSalt(6);
13-
const secretKey = process.env.JWT_SECRET + salt;
14-
const token = jwt.sign(payload, secretKey, { expiresIn: process.env.TOKEN_LIFE });
15-
return {token: token, personalKey: salt}; //return token and "salt" to use as user personalkey
16-
} catch (error) {
17-
throw new Error('Token generation failed');
18-
}
19-
};
3+
import generateTokenAndPersonalKey from "../middleware/generateToken.js";
4+
import { sendResponse } from '../utils/response.js';
205

216
export const registerController = async (req, res) => {
227
req.body.password = md5(req.body.password);
238

249
const newUser = new User({
2510
username: req.body.username,
26-
password: req.body.password
11+
password: req.body.password,
12+
role: req.body.role
2713
});
2814

2915
try {
3016
const foundUser = await User.findOne({ username: req.body.username, password: req.body.password });
3117
if (foundUser) {
32-
return res.status(400).json({ message: 'Email already exists' });
18+
return sendResponse(res, 409, "Conflict", "Email already exists" );
3319
}
34-
const newTokenAndKey = await generateTokenAndPersonalKey(newUser);
35-
const token = newTokenAndKey.token;
36-
const personalKey = newTokenAndKey.personalKey;
37-
newUser.personalKey = personalKey;
38-
await newUser.save();
39-
res.status(200).json({ token });
40-
} catch (error) {
41-
console.error(error);
42-
res.status(400).json({ error: error.message });
20+
//verificação de email
21+
let savedUser = await newUser.save();
22+
delete savedUser.password;
23+
return sendResponse(res, 200, savedUser, "User registered successfully" );
24+
} catch (err) {
25+
return sendResponse(res, 400, err.name, err.message );
4326
}
4427
};
4528

@@ -49,17 +32,16 @@ export const loginController = async (req, res) => {
4932
try {
5033
const user = await User.findOne({ username: req.body.username, password: req.body.password });
5134
if (!user) {
52-
return res.status(401).json({ error: "Invalid username or password" });
35+
return sendResponse(res, 401, "Forbidden", "Invalid username or password" );
5336
}
5437
const newTokenAndKey = await generateTokenAndPersonalKey(user);
5538
const token = newTokenAndKey.token;
5639
const personalKey = newTokenAndKey.personalKey;
5740
user.personalKey = personalKey;
5841
await user.save();
59-
res.status(200).json({ token });
60-
} catch (error) {
61-
console.error(error);
62-
res.status(400).json({ error: error.message });
42+
return sendResponse(res, 200, token, "User logged successfully");
43+
} catch (err) {
44+
return sendResponse(res, 400, err.name, err.message);
6345
}
6446
};
6547

@@ -69,48 +51,14 @@ export const logoutController = async (req, res) => {
6951
try {
7052
const user = await User.findOne({ username: req.body.username, password: req.body.password });
7153
if (!user) {
72-
return res.status(401).json({ error: "Invalid username or password" });
54+
return sendResponse(res, 401, "Forbidden", "Invalid username or password");
7355
}
7456
//setting personalKey to default value, to invalidate the token
7557
user.personalKey = "-";
7658
await user.save();
77-
res.status(200).json({ message: 'You have been logged out successfully' })
78-
}
79-
catch (error) {
80-
console.error(error);
81-
res.status(400).json({ error: error.message });
82-
}
83-
};
84-
85-
export const authenticateToken = async (req, res, next) => {
86-
const token = req.headers.authorization;
87-
if (!token) {
88-
return res.status(401).json({ error: "Authentication token is required" });
59+
return sendResponse(res, 200, null, "You have been logged out successfully");
8960
}
90-
91-
try {
92-
const decodedToken = jwt.decode(token, { complete: true });
93-
if (!decodedToken) {
94-
return res.status(403).json({ error: "Redirect to login" });
95-
}
96-
97-
const user = await User.findById(decodedToken.payload.id);
98-
if (!user) {
99-
return res.status(401).json({ error: "User not found" });
100-
}
101-
102-
const secretKey = process.env.JWT_SECRET + user.personalKey;
103-
jwt.verify(token, secretKey, (err, decoded) => {
104-
if (err) {
105-
return res.status(403).json({ error: "Redirect to login" });
106-
}
107-
req.user = decoded;
108-
next();
109-
});
110-
} catch (error) {
111-
console.error(error);
112-
return res.status(403).json({ error: "Redirect to login" });
61+
catch (err) {
62+
return sendResponse(res, 400, err.name, err.message);
11363
}
114-
};
115-
116-
64+
};

app/middleware/authenticate.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import jwt from "jsonwebtoken";
2+
import User from "../models/userModel.js"
3+
import { sendResponse } from '../utils/response.js';
4+
5+
const authenticateToken = async (req, res, next) => {
6+
const token = req.headers.authorization;
7+
if (!token) {
8+
return sendResponse(res, 401, null, "Authentication token is required" );
9+
}
10+
11+
try {
12+
const redirectLogin = "Redirect to login";
13+
const decodedToken = jwt.decode(token, { complete: true });
14+
if (!decodedToken) {
15+
return sendResponse(res, 403, "Error to decod", redirectLogin);
16+
}
17+
18+
const user = await User.findById(decodedToken.payload.id);
19+
if (!user) {
20+
return sendResponse(res, 401, "User not found", redirectLogin);
21+
}
22+
23+
const secretKey = process.env.JWT_SECRET + user.personalKey;
24+
jwt.verify(token, secretKey, (err, decoded) => {
25+
if (err) {
26+
return sendResponse(res, 403, err.name, err.message);
27+
}
28+
req.user = decoded;
29+
next();
30+
});
31+
} catch (err) {
32+
return sendResponse(res, 403, err.name, err.message);
33+
}
34+
};
35+
36+
export default authenticateToken;

app/middleware/generateToken.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import bcrypt from "bcrypt";
2+
import jwt from "jsonwebtoken";
3+
4+
const generateTokenAndPersonalKey = async (user) => {
5+
const payload = {
6+
id: user._id,
7+
username: user.username,
8+
role: user.role
9+
};
10+
const salt = await bcrypt.genSalt(6);
11+
const secretKey = process.env.JWT_SECRET + salt;
12+
const token = jwt.sign(payload, secretKey, { expiresIn: process.env.TOKEN_LIFE });
13+
return {token: token, personalKey: salt};
14+
};
15+
16+
export default generateTokenAndPersonalKey;

app/models/userModel.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,21 @@ const userSchema = new Schema({
1010
type: String,
1111
required: true
1212
},
13-
fullName: {
14-
type: String,
15-
default: ''
13+
role: {
14+
type: Number,
15+
retuired: true
1616
},
17-
contact: {
18-
type: String,
19-
default: ''
20-
},
2117
personalKey: {
2218
type: String,
2319
required: true,
24-
unique: true,
2520
default: '-',
21+
},
22+
isActive: {
23+
type: Boolean,
24+
default: false
2625
},
2726
});
2827

2928
const User = model('user', userSchema);
3029

31-
export default User;
30+
export default User;

routes.js renamed to app/routes/routes.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import express from "express";
2-
import * as authController from "./app/controllers/authController.js";
3-
import * as userController from "./app/controllers/userController.js";
4-
import {authenticateToken} from "./app/controllers/authController.js";
2+
import * as authController from "../controllers/authController.js";
3+
import * as userController from "../controllers/userController.js";
4+
import authenticateToken from "../middleware/authenticate.js";
55

66
const router = express.Router();
77

app/utils/response.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function sendResponse(res, statusCode, data, message) {
2+
return res.status(statusCode).json({ statusCode, data, message });
3+
}

server.js renamed to config/server.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import express from "express";
2-
import routes from "./routes.js";
3-
import { connectToDatabase } from './config/db.js';
2+
import routes from "../app/routes/routes.js";
3+
import { connectToDatabase } from './db.js';
44
import dotenv from 'dotenv';
55

66
dotenv.config();

index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
import { startServer } from './server.js';
1+
import { startServer } from './config/server.js';
22

33
startServer();

0 commit comments

Comments
 (0)