import express from 'express'; import mongoose from 'mongoose'; import bcrypt from 'bcryptjs'; import UserValidate from './validate/user'; import UserModel from '../models/user'; import mail from '../helpers/mail'; const router = express.Router(); router.get('/users', (req, res) => { res.json({message: 'users up and running!'}); }); router.post('/user/new', (req, res, next) => { if (!req.auth(res, ['admin'], 'basic')) return; // validate input const {error, value: user} = UserValidate.input(req.body); if(error !== undefined) { res.status(400).json({status: 'Invalid body format'}); return; } // check that user does not already exist UserModel.find({name: user.name}).lean().exec( 'find', (err, data) => { if (err) next(err); if (data.length > 0) { res.status(400).json({status: 'Username already taken'}); return; } user.key = mongoose.Types.ObjectId(); // use object id as unique API key bcrypt.hash(user.pass, 10, (err, hash) => { // password hashing user.pass = hash; new UserModel(user).save((err, data) => { // store user if (err) next(err); res.json(UserValidate.output(data.toObject())); }); }); }); }); router.post('/user/passreset', (req, res, next) => { // check if user/email combo exists UserModel.find({name: req.body.name, email: req.body.email}).lean().exec( (err, data: any) => { if (err) next(err); if (data.length === 1) { // it exists const newPass = Math.random().toString(36).substring(2); bcrypt.hash(newPass, 10, (err, hash) => { // password hashing if (err) next(err); UserModel.findByIdAndUpdate(data[0]._id, {pass: hash}, err => { // write new password if (err) next(err); mail(data[0].email, 'Your new password for the DFOP database', 'Hi,

You requested to reset your password.
Your new password is:

' + newPass + '

If you did not request a password reset, talk to the sysadmin quickly!

Have a nice day.

The DFOP team', err => { if (err) next(err); res.json({status: 'OK'}); }); }); }); } else { res.status(404).json({status: 'Not found'}); } }); }); module.exports = router;