Migrating login/registration from username to email

This commit is contained in:
Selim Mustafaev 2020-09-08 16:39:56 +03:00
parent 85e9c159da
commit 7df7f1053b
3 changed files with 50 additions and 20 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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) {