Skip to content
Snippets Groups Projects
user.js 1.86 KiB
const express = require('express');
const { model: Users } = require('../models/Users');
const auth = require('../middlewares/auth');
const routes = express.Router();


// User create (signup)
routes.post('/signup', async (req, res) => {
    const newUser = req.body;
    const fieldsToAdd = Object.keys(newUser);
    const fieldsInModel = ['name', 'email', 'password'];
    const isAdditionAllowed = fieldsToAdd.every((field) => fieldsInModel.includes(field));

    if (!isAdditionAllowed) {
        return res.status(400).send({ error: 'Invalid fields to Add!' });
    }

    try {
        const user = await Users(newUser);

        await user.save();

        res.send({ user });
    }
    catch (e) {
        res.status(400).send(e);
    }
});

// check if previously loggeding
routes.post('/init', auth, async (req, res) => {
    try {
        const cookieOptions = {
            httpOnly: true,
        };

        const { token, user } = req;
        if (token && user) {
            res.cookie('todo-jt', req.token, cookieOptions).send({ user, token });
        }
    } catch (e) {
        res.status(400).send();
    }
});

// Login user
routes.post('/login', async (req, res) => {
    try {
        const cookieOptions = {
            httpOnly: true,
        };

        const user = await Users.findByCredentials(req.body.email, req.body.password);

        const token = await user.generateAuthToken();

        res.cookie('todo-jt', token, cookieOptions).send({ user, token });

    } catch (e) {
        res.status(400).send();
    }
});

//logout user
routes.post('/logout', auth, async (req, res) => {
    try {
        const { user, token } = req;

        user.tokens = user.tokens.filter((t) => t.token !== token);
        await user.save();

        res.clearCookie('todo-jt');

        res.send();
    } catch (e) {
        res.status(400).send();
    }
});


module.exports = routes;