From 7df7f1053b966b1922ce0c7fcc8f66f3b94e6afa Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Tue, 8 Sep 2020 16:39:56 +0300 Subject: [PATCH] Migrating login/registration from username to email --- models/user.js | 8 +++---- routes/user.js | 58 +++++++++++++++++++++++++++++++++++----------- routes/vehicles.js | 4 ++-- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/models/user.js b/models/user.js index 5f1530e..308f461 100644 --- a/models/user.js +++ b/models/user.js @@ -5,16 +5,16 @@ const hash = Symbol(); const sha256 = text => crypto.createHash('sha256').update(text).digest('base64'); class User { - constructor(login = '', password = '') { + constructor(email = '', password = '') { this._id = uuid(); - this.login = login; + this.email = email; this[hash] = sha256(password); } static fromDB(dbUser) { let user = new User(); user._id = dbUser._id; - user.login = dbUser.login; + user.email = dbUser.email; user[hash] = dbUser.hash; return user; @@ -23,7 +23,7 @@ class User { toDB() { let user = new User(); user._id = this._id; - user.login = this.login; + user.email = this.email; user.hash = this[hash]; return user; } diff --git a/routes/user.js b/routes/user.js index c1137d4..8a8e6eb 100644 --- a/routes/user.js +++ b/routes/user.js @@ -6,15 +6,15 @@ const User = require('../models/user'); const makeError = error => ({ success: false, error }); router.post('/signup', async (req, res) => { - const { login, password } = req.body; - if(login && password) { + const { email, password } = req.body; + if(email && password) { try { let collection = req.db.collection('users'); - let users = await collection.find({ login }).toArray(); + let users = await collection.find({ email }).toArray(); if(users.length == 0) { - let user = new User(login, password); + let user = new User(email, password); await collection.insertOne(user.toDB()); - user.token = jwt.sign({ login }, '#IWantToBelieve', { expiresIn: '365d' }); + user.token = jwt.sign({ email }, '#IWantToBelieve', { expiresIn: '365d' }); res.send({ success: true, data: user }); } else { res.send(makeError('User already exists')); @@ -29,19 +29,19 @@ router.post('/signup', async (req, res) => { }); router.post('/login', async (req, res) => { - const { login, password } = req.body; - if(login && password) { + const { email, password } = req.body; + if(email && password) { try { let users = req.db.collection('users'); - let me = await users.findOne({ login }); + let me = await users.findOne({ email }); if(me) { me = User.fromDB(me); if(!me.checkPassword(password)) { - res.send(makeError('Incorrect login or password')); + res.send(makeError('Incorrect email or password')); return; } - me.token = jwt.sign({ login }, '#IWantToBelieve', { expiresIn: '365d' }); + me.token = jwt.sign({ email }, '#IWantToBelieve', { expiresIn: '365d' }); res.send({ success: true, data: me }); } else { res.send(makeError('Incorrect login or password')); @@ -55,9 +55,39 @@ router.post('/login', async (req, res) => { } }); +router.post('/signIn', async (req, res) => { + const { email, password } = req.body; + if(email && password) { + try { + let users = req.db.collection('users'); + let me = await users.findOne({ email }); + if(me) { + me = User.fromDB(me); + if(!me.checkPassword(password)) { + res.send(makeError('Incorrect email or password')); + return; + } + + me.token = jwt.sign({ email }, '#IWantToBelieve', { expiresIn: '365d' }); + res.send({ success: true, data: me }); + } else { + let user = new User(email, password); + await users.insertOne(user.toDB()); + user.token = jwt.sign({ email }, '#IWantToBelieve', { expiresIn: '365d' }); + res.send({ success: true, data: user }); + } + } catch(ex) { + res.send(makeError('Error logging in')); + console.error(ex); + } + } else { + res.send(makeError('Invalid parameters')); + } +}); + router.get('/', async (req, res) => { - const { login } = req.query; - let users = await req.db.collection('users').find({ login }).toArray(); + const { email } = req.query; + let users = await req.db.collection('users').find({ email }).toArray(); if(users.length > 0) { res.send({ success: true, data: User.fromDB(users[0]) }); } else { @@ -66,8 +96,8 @@ router.get('/', async (req, res) => { }); router.get('/find', async (req, res) => { - const { login } = req.query; - let users = await req.db.collection('users').find({ login: { $regex: new RegExp(`.*${login}.*`, 'i') } }).toArray(); + const { email } = req.query; + let users = await req.db.collection('users').find({ login: { $regex: new RegExp(`.*${email}.*`, 'i') } }).toArray(); users = users.map(user => { user.contacts = []; return User.fromDB(user); diff --git a/routes/vehicles.js b/routes/vehicles.js index fec7cb2..b9b63ef 100644 --- a/routes/vehicles.js +++ b/routes/vehicles.js @@ -28,7 +28,7 @@ router.post('/check', async (req, res) => { const number = req.body.number.replace(/ /g, '').toUpperCase(); const googleIdToken = req.body.googleIdToken; const forceUpdate = req.body.forceUpdate.toLowerCase() == 'true'; - const { login } = req.user; + const { email } = req.user; console.log(`=== checking number: ${number} ====================================`); @@ -50,7 +50,7 @@ router.post('/check', async (req, res) => { if(autocod.status == 'fulfilled') { let vehicle = autocod.value; console.log('autocod found vehicle: ', vehicle?.brand?.name?.original); - vehicle.addedBy = login; + vehicle.addedBy = email; if(vin01?.status == 'fulfilled') { vehicle.vin1 = vin01.value.vin1; if(vin01.value?.brand?.name?.original == vehicle?.brand?.name?.original) {