Validate users routes
parent
5b3ee2a734
commit
f45698088a
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"$id": "editUser",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"usersName": {
|
||||
"type": "string"
|
||||
},
|
||||
"userEmail": {
|
||||
"type": "string",
|
||||
"format": "emailAddress"
|
||||
},
|
||||
"userPassword": {
|
||||
"type": "string"
|
||||
},
|
||||
"isAdmin": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"usersName",
|
||||
"userEmail",
|
||||
"isAdmin"
|
||||
]
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"$id": "newUser",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"usersName": {
|
||||
"type": "string"
|
||||
},
|
||||
"userEmail": {
|
||||
"type": "string",
|
||||
"format": "emailAddress"
|
||||
},
|
||||
"userPassword": {
|
||||
"type": "string"
|
||||
},
|
||||
"isAdmin": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"usersName",
|
||||
"userEmail",
|
||||
"userPassword",
|
||||
"isAdmin"
|
||||
]
|
||||
}
|
|
@ -3,6 +3,7 @@ const common = require('../lib/common');
|
|||
const { restrict } = require('../lib/auth');
|
||||
const colors = require('colors');
|
||||
const bcrypt = require('bcryptjs');
|
||||
const { validateJson } = require('../lib/schema');
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/admin/users', restrict, async (req, res) => {
|
||||
|
@ -212,6 +213,19 @@ router.post('/admin/user/update', restrict, async (req, res) => {
|
|||
updateDoc.userPassword = bcrypt.hashSync(req.body.userPassword);
|
||||
}
|
||||
|
||||
// Validate update user
|
||||
const schemaResult = validateJson('editUser', updateDoc);
|
||||
if(!schemaResult.result){
|
||||
if(req.apiAuthenticated){
|
||||
res.status(400).json(schemaResult.errors);
|
||||
return;
|
||||
}
|
||||
req.session.message = 'Please check your inputs.';
|
||||
req.session.messageType = 'danger';
|
||||
res.redirect('/admin/user/edit/' + req.body.userId);
|
||||
return;
|
||||
}
|
||||
|
||||
try{
|
||||
await db.users.updateOne(
|
||||
{ _id: common.getId(req.body.userId) },
|
||||
|
@ -220,11 +234,11 @@ router.post('/admin/user/update', restrict, async (req, res) => {
|
|||
}, { multi: false }
|
||||
);
|
||||
if(req.apiAuthenticated){
|
||||
res.status(200).json({ message: 'User account updated.' });
|
||||
res.status(200).json({ message: 'User account updated' });
|
||||
return;
|
||||
}
|
||||
// show the view
|
||||
req.session.message = 'User account updated.';
|
||||
req.session.message = 'User account updated';
|
||||
req.session.messageType = 'success';
|
||||
res.redirect('/admin/user/edit/' + req.body.userId);
|
||||
}catch(ex){
|
||||
|
@ -244,7 +258,7 @@ router.post('/admin/user/insert', restrict, async (req, res) => {
|
|||
const db = req.app.db;
|
||||
|
||||
// set the account to admin if using the setup form. Eg: First user account
|
||||
const urlParts = new URL(req.header('Referer'));
|
||||
const urlParts = req.get('Referrer');
|
||||
|
||||
// Check number of users
|
||||
const userCount = await db.users.countDocuments({});
|
||||
|
@ -255,13 +269,26 @@ router.post('/admin/user/insert', restrict, async (req, res) => {
|
|||
isAdmin = true;
|
||||
}
|
||||
|
||||
const doc = {
|
||||
const userObj = {
|
||||
usersName: req.body.usersName,
|
||||
userEmail: req.body.userEmail,
|
||||
userPassword: bcrypt.hashSync(req.body.userPassword, 10),
|
||||
isAdmin: isAdmin
|
||||
};
|
||||
|
||||
// Validate new user
|
||||
const schemaResult = validateJson('newUser', userObj);
|
||||
if(!schemaResult.result){
|
||||
if(req.apiAuthenticated){
|
||||
res.status(400).json(schemaResult.errors);
|
||||
return;
|
||||
}
|
||||
req.session.message = 'Invalid new user. Please check your inputs.';
|
||||
req.session.messageType = 'danger';
|
||||
res.redirect('/admin/user/new');
|
||||
return;
|
||||
}
|
||||
|
||||
// check for existing user
|
||||
const user = await db.users.findOne({ userEmail: req.body.userEmail });
|
||||
if(user){
|
||||
|
@ -278,10 +305,10 @@ router.post('/admin/user/insert', restrict, async (req, res) => {
|
|||
}
|
||||
// email is ok to be used.
|
||||
try{
|
||||
await db.users.insertOne(doc);
|
||||
await db.users.insertOne(userObj);
|
||||
// if from setup we add user to session and redirect to login.
|
||||
// Otherwise we show users screen
|
||||
if(urlParts.path === '/admin/setup'){
|
||||
if(urlParts && urlParts.path === '/admin/setup'){
|
||||
req.session.user = req.body.userEmail;
|
||||
res.redirect('/admin/login');
|
||||
return;
|
||||
|
@ -295,11 +322,11 @@ router.post('/admin/user/insert', restrict, async (req, res) => {
|
|||
req.session.messageType = 'success';
|
||||
res.redirect('/admin/users');
|
||||
}catch(ex){
|
||||
console.error(colors.red('Failed to insert user: ' + ex));
|
||||
if(req.apiAuthenticated){
|
||||
res.status(400).json({ message: 'New user creation failed' });
|
||||
return;
|
||||
}
|
||||
console.error(colors.red('Failed to insert user: ' + ex));
|
||||
req.session.message = 'New user creation failed';
|
||||
req.session.messageType = 'danger';
|
||||
res.redirect('/admin/user/new');
|
||||
|
|
|
@ -60,3 +60,33 @@ test('[Fail] Delete invalid user ID', async t => {
|
|||
.expect(302);
|
||||
t.deepEqual(res.header['location'], '/admin/users');
|
||||
});
|
||||
|
||||
test('[Success] Create new user', async t => {
|
||||
const user = {
|
||||
usersName: 'Jim Smith',
|
||||
userEmail: 'jim.smith@gmail.com',
|
||||
userPassword: 'test',
|
||||
isAdmin: false
|
||||
};
|
||||
const res = await g.request
|
||||
.post('/admin/user/insert')
|
||||
.send(user)
|
||||
.set('apiKey', g.users[0].apiKey)
|
||||
.expect(200);
|
||||
t.deepEqual(res.body.message, 'User account inserted');
|
||||
});
|
||||
|
||||
test('[Fail] Create new user with invalid email', async t => {
|
||||
const user = {
|
||||
usersName: 'Jim Smith',
|
||||
userEmail: 'jim.smith@gmail',
|
||||
userPassword: 'test',
|
||||
isAdmin: false
|
||||
};
|
||||
const res = await g.request
|
||||
.post('/admin/user/insert')
|
||||
.send(user)
|
||||
.set('apiKey', g.users[0].apiKey)
|
||||
.expect(400);
|
||||
t.deepEqual(res.body[0].message, 'should match format "emailAddress"');
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue