Skip to content

Commit 4284ce9

Browse files
committed
User controller and router
1 parent eb92f8d commit 4284ce9

File tree

17 files changed

+9988
-108
lines changed

17 files changed

+9988
-108
lines changed

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ MONGO_DB_URL_DEVELOPMENT=mongodb://docker:docker@mongo:27017/casame?authSource=a
66
MONGO_DB_URL_TEST=mongodb://docker:docker@mongo:27017/casame?authSource=admin
77
BCRYPT_SALT_ROUNDS=
88
JWT_SECRET=
9+
STATIC_JWT=
910

1011
FB_CERT_TYPE=
1112
FB_CERT_PROJECT_ID=

package-lock.json

Lines changed: 9748 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/config/__tests__/config.test.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ describe("App Config", () => {
55
expect(config).toEqual({
66
port: expect.any(String),
77
jwt: {
8-
secret: expect.any(String),
8+
sign: expect.any(String),
9+
payload: expect.any(String)
910
},
1011
bcryptSaltRounds: expect.any(Number),
1112
db: {

src/config/index.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
const logger = require("loglevel");
2+
require("dotenv").config();
3+
24

35
logger.enableAll();
46

@@ -7,7 +9,9 @@ const {
79
MONGO_DB_URL_PRODUCTION,
810
MONGO_DB_URL_DEVELOPMENT,
911
MONGO_DB_URL_TEST,
10-
PORT = 5000,
12+
PORT = 5001,
13+
JWT_SECRET_PAYLOAD,
14+
JWT_SECRET_SIGN,
1115
JWT_SECRET,
1216
BCRYPT_SALT_ROUNDS,
1317
FB_CERT_TYPE,
@@ -25,7 +29,8 @@ const {
2529
const baseConfig = {
2630
port: PORT,
2731
jwt: {
28-
secret: JWT_SECRET,
32+
payload: JWT_SECRET_PAYLOAD,
33+
sign: JWT_SECRET_SIGN
2934
},
3035
bcryptSaltRounds: parseInt(BCRYPT_SALT_ROUNDS),
3136
logger: {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const db = require("../models");
2+
const conf = require("../config")
3+
const { generateJWT } = require("../middleware/stsauth-middleware")
4+
5+
async function createJWT(req, res, next) {
6+
const { payload, sign } = req.query
7+
if (payload === conf.jwt.payload && sign === conf.jwt.sign) {
8+
const token = generateJWT()
9+
return res.status(201).send({ token })
10+
}
11+
return next({ statusCode: 404, message: "Cannot GET" })
12+
}
13+
module.exports = {
14+
createJWT
15+
};

src/controllers/user-controller.js

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,80 +5,52 @@ async function register(req, res, next) {
55
const { email, password } = req.body;
66
//if registered Firebase -> checkif registered Mongo -> return Document
77
const fbUser = await getFbUserOrCreate(email, password).catch(next);
8-
let employee = await db.Employee.findById(fbUser.uid)
8+
let user = await db.User.findById(fbUser.uid)
99
.lean()
1010
.exec()
1111
.catch(next);
12-
if (!employee) {
13-
employee = await db.Employee.create({ _id: fbUser.uid, ...req.body }).catch(next);
12+
if (!user) {
13+
user = await db.User.create({ _id: fbUser.uid, ...req.body }).catch(next);
1414
}
15-
res.status(200).send({ data: employee })
15+
res.status(200).send({ data: user })
1616
}
1717

1818
async function login(req, res, next) {
19-
const { uid } = req.employee;
20-
const employee = await db.Employee.findById(uid)
19+
const { uid } = req.user;
20+
const user = await db.User.findById(uid)
2121
.lean()
2222
.exec()
2323
.catch(next);
24-
if (!employee) next({ statusCode: 404, message: "User not found." });
25-
else res.status(200).send({ data: employee });
24+
if (!user) next({ statusCode: 404, message: "User not found." });
25+
else return res.status(200).send({ data: user });
2626
}
2727

2828
async function deleteUser(req, res, next) {
29-
const { uid } = req.employee
30-
await db.Employee.findByIdAndDelete(uid).catch(next);
31-
await db.Property.deleteMany({ employee_id: uid }).catch(next);
32-
res.status(202).send({ message: "Employee deleted", error: null })
29+
const { uid } = req.user
30+
await db.User.findByIdAndDelete(uid).catch(next);
31+
return res.status(202).send({ message: "User deleted", error: null })
3332
}
3433

3534
async function update(req, res, next) {
36-
const { uid } = req.employee;
37-
const { firstname, lastname, phone } = req.body;
35+
const { uid } = req.user;
36+
const { firstname, lastname } = req.body;
3837

39-
const employee = await db.Employee.findByIdAndUpdate(
38+
const user = await db.User.findByIdAndUpdate(
4039
uid,
41-
{ firstname, lastname, phone },
40+
{ firstname, lastname },
4241
{ new: true }
4342
)
4443
.lean()
4544
.exec()
4645
.catch(next);
4746

48-
if (!employee) next({ statusCode: 404, message: "User not found." });
49-
else res.status(200).send({ data: employee });
50-
}
51-
52-
async function stats(req, res, next) {
53-
const { uid } = req.employee
54-
const myProperties = await db.Property.aggregate([
55-
{
56-
"$match": {
57-
"employee_id": { "$eq": uid },
58-
}
59-
},
60-
{
61-
"$group": {
62-
"_id": "$employee_id",
63-
"revenue": {
64-
"$sum": { $cond: ["$sold", "$price", 0] }
65-
},
66-
"sold": { "$sum": { $cond: ["$sold", 1, 0] } },
67-
"available": { "$sum": { $cond: ["$sold", 0, 1] } }
68-
}
69-
}
70-
]).catch(next);
71-
if (myProperties.length > 0) {
72-
res.status(201).send({ data: myProperties[0] })
73-
} else {
74-
next({ statusCode: 404, message: "User not found." })
75-
}
47+
if (!user) next({ statusCode: 404, message: "User not found." });
48+
else res.status(200).send({ data: user });
7649
}
7750

7851
module.exports = {
7952
register,
8053
login,
8154
deleteUser,
8255
update,
83-
stats
8456
};

src/middleware/auth-middleware.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const authMiddleware = () => async (req, res, next) => {
1212

1313
const { email, user_id } = userClaims;
1414

15-
req.employee = {
15+
req.user = {
1616
email: email,
1717
uid: user_id,
1818
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const jwt = require("jsonwebtoken");
2+
3+
const config = require("../config");
4+
5+
function validateJWT(req, res, next) {
6+
const authJWT = req.headers["auth"]
7+
try {
8+
const valid = jwt.verify(authJWT, config.jwt.sign);
9+
if (valid.sub == config.jwt.payload) return next()
10+
return next({ statusCode: 401, message: "Not Authorized" })
11+
} catch (error) {
12+
next(error);
13+
}
14+
}
15+
module.exports = { validateJWT };
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const Joi = require("joi")
2+
3+
const updateUserSchema = Joi.object({
4+
firstname: Joi.string().min(3).max(255).required(),
5+
lastname: Joi.string().min(3).max(255).required(),
6+
email: Joi.string().min(6).max(255).required(),
7+
});
8+
9+
const registerUserSchema = Joi.object({
10+
_id: Joi.string(),
11+
firstname: Joi.string().min(3).max(255).required(),
12+
lastname: Joi.string().min(3).max(255).required(),
13+
password: Joi.string().min(3).max(255).required(),
14+
email: Joi.string().email().required(),
15+
});
16+
17+
async function validateRegisterData(req, res, next) {
18+
try {
19+
req.body = await registerUserSchema.validateAsync(req.body);
20+
next();
21+
} catch (err) {
22+
next({ statusCode: 400, message: err.details });
23+
}
24+
}
25+
26+
async function validateUpdateData(req, res, next) {
27+
try {
28+
req.body = await updateUserSchema.validateAsync(req.body);
29+
next();
30+
} catch (err) {
31+
next({ statusCode: 400, message: err.details });
32+
}
33+
}
34+
35+
module.exports = { validateRegisterData, validateUpdateData };

src/mock/seedTestDB.js

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -92,36 +92,33 @@ const PROPERTIES = [
9292
}
9393
];
9494

95-
const EMPLOYEES = [
95+
const USERS = [
9696
{
9797
_id: "5d6ede6a0ba62570afcedd3a",
9898
firstname: "Pepe",
9999
lastname: "Martinez",
100100
101-
phone: "827948827",
102101
},
103102
{
104103
_id: "5d6ede6a0ba62570afcedd3b",
105104
firstname: "Home",
106105
lastname: "house",
107106
108-
phone: "625989438",
109107
},
110108
{
111-
_id: "10m0nAK1ipeJHDnyBDNsKPWjBJR2",
112-
firstname: "Pepeee",
113-
lastname: "Martinez",
114-
115-
phone: "827948527",
109+
_id: "QFjmud29ILafHvqQicIYQodNsFD2",
110+
firstname: "Test",
111+
lastname: "Test",
112+
116113
}
117114
];
118115

119116
async function seedTestPropertiesDB() {
120-
const employee1 = EMPLOYEES[0];
121-
const employee2 = EMPLOYEES[2];
117+
const user1 = USERS[0];
118+
const user2 = USERS[2];
122119

123-
await db.Employee.create(employee1);
124-
await db.Employee.create(employee2);
120+
await db.User.create(user1);
121+
await db.User.create(user2);
125122

126123
await db.Property.insertMany(PROPERTIES);
127124
}
@@ -149,25 +146,25 @@ function getMyOffice() {
149146
};
150147
}
151148

152-
function getTestEmployee1() {
153-
return {...EMPLOYEES[0]};
149+
function getTestUser1() {
150+
return { ...USERS[0] };
154151
}
155152

156-
function getTestEmployee2() {
157-
return {...EMPLOYEES[1]};
153+
function getTestUser2() {
154+
return { ...USERS[1] };
158155
}
159156

160-
function getTestAuthEmployee() {
161-
return {...EMPLOYEES[2]};
157+
function getTestAuthUser() {
158+
return { ...USERS[2] };
162159
}
163160

164161
module.exports = {
165162
getHome,
166163
getOffice,
167164
getMyHome,
168165
getMyOffice,
169-
getTestEmployee1,
170-
getTestEmployee2,
166+
getTestUser1,
167+
getTestUser2,
171168
seedTestPropertiesDB,
172-
getTestAuthEmployee
169+
getTestAuthUser
173170
};

0 commit comments

Comments
 (0)