UNPKG

major-a

Version:

A simple and easy to implement user authentication and tracking module for Express.

160 lines (143 loc) 4.46 kB
// For Logging const colors = require('colors'); const logNote = 'MAJOR-A -- '.white; // Get Admin Settings const fs = require('fs'); try { const settings = fs.readFileSync(__dirname + '/../../major.json').toString(); var adminList = JSON.parse(settings).admin; if (!Array.isArray(adminList) || adminList.length === 0) { console.log(logNote + 'NO ADMINISTATORS SET'.red); } else { adminList.forEach(function(currentAdmin, adminIndex) { console.log(logNote + (currentAdmin + ' added to admin list').green); }) } } catch (e) { console.log(logNote + 'COUNLD NOT FIND MAJOR.JSON, NO ADMINISTATORS SET'.red); var adminList = []; } // Get Dependencies const express = require('express'); const jsonParser = require('body-parser').json(); const mongoose = require('mongoose'); const basicHTTP = require(__dirname + '/lib/basic-http'); const authCheck = require(__dirname + '/lib/check-token'); const adminCheck = require(__dirname + '/lib/admin-check')(adminList); const resourceTracking = require(__dirname + '/lib/analytics/resource-tracking'); // Models const User = require(__dirname + '/models/user'); const UserAnalytics = require(__dirname + '/models/user-analytics'); // Tracking const userTracking = require(__dirname + '/lib/analytics/user-tracking'); // Create Router var majorA = module.exports = exports = express.Router(); module.exports = { majorRouter: majorA, majorAuth: authCheck, majorAdmin: adminCheck(), majorAnalytics: resourceTracking }; //========== ROUTES ==========// // Returns analytics for signed in user majorA.get('/tracking/:id', adminCheck(), (req, res) => { if (!req.params.id) { req.params.id = req.user._id } UserAnalytics.find({ owner_id: req.params.id }, (err, data) => { res.json(data); }) }); // Create new User majorA.post('/register', jsonParser, (req, res) => { req.body.email = req.body.authentication.email; req.body.password = req.body.authentication.password; // Check email and password length if (!((req.body.email || "").length && (req.body.password || "").length > 7)) { return res.status(400).json({ msg: 'Email or password not long enough' }) } // Check if user is already in database User.findOne({ 'authentication.email': req.body.email }, (err, user) => { // Check for DB Error if (err) { return res.status(500).json({ msg: 'DB Error' }) } // Check if user is populated (exists) if (user) { return res.status(500).json({ msg: 'User already Exists' }) } try { // Create new user var newUser = new User(); newUser.authentication.email = req.body.email; newUser.hashPassword(req.body.password); newUser.birthday = (req.body.birthday) ? Date.parse(req.body.birthday) : null; newUser.gender = (req.body.gender) ? req.body.gender : null; newUser.username = (req.body.username) ? req.body.username : null; newUser.name.first = (req.body.name) ? req.body.name.first : null; newUser.name.last = (req.body.name) ? req.body.name.last : null; newUser.save((err, user) => { if (err || !user) { return res.status(500).json({ msg: 'Error creating user' }); } // Create analytics for new user userTracking.createNew(user._id); // Send Response res.status(200).json({ token: user.generateToken(), user: user }) }); } catch (e) { res.status(500).json({ msg: 'There was an error register the user.' }); } }); }); // User Login majorA.get('/login', basicHTTP, (req, res) => { // Check DB for user User.findOne({ 'authentication.email': req.basicHTTP.email }, (err, user) => { // Check for error if (err) { return res.status(401).json({ msg: 'Error finding user' }) } // Check for null user if (!user) { return res.status(401).json({ msg: 'User does not exist' }) } // Compare user password if (!user.comparePassword(req.basicHTTP.password)) { return res.status(401).json({ msg: 'Invalid username or password' }) } // Track User Login userTracking.everyLogin(user._id); // Authenticate User, respond with token and user data res.status(200).json({ user: user, token: user.generateToken() }); }) });