const express = require('express'); const router = express.Router(); const jwt = require('jsonwebtoken'); 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) { try { let collection = req.db.collection('users'); let users = await collection.find({ login }).toArray(); if(users.length == 0) { let user = new User(login, password); await collection.insertOne(user.toDB()); user.token = jwt.sign({ login }, 'secret', { expiresIn: '1d' }); res.send({ success: true, data: { user } }); } else { res.send(makeError('User already exists')); } } catch(ex) { res.send(makeError('Error creating user')); console.error(ex); } } else { res.send(makeError('Invalid parameters')); } }); router.post('/login', async (req, res) => { const { login, password } = req.body; if(login && password) { try { let users = req.db.collection('users'); let me = await users.findOne({ login }); if(me) { me = User.fromDB(me); if(!me.checkPassword(password)) { res.send(makeError('Incorrect login or password')); return; } me.token = jwt.sign({ login }, 'secret', { expiresIn: '1d' }); res.send({ success: true, data: { user: me } }); } else { res.send(makeError('Incorrect login or password')); } } 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(); if(users.length > 0) { res.send({ success: true, data: User.fromDB(users[0]) }); } else { res.status(204).send(makeError('There is no such user')); } }); 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(); users = users.map(user => { user.contacts = []; return User.fromDB(user); }); let code = users.length > 0 ? 200 : 204; res.status(code).send({ success: true, data: { users } }); }); module.exports = router;