Skip to content
Snippets Groups Projects
user.js 6.83 KiB
Newer Older
const express = require('express');

const userApp = express();

const libs = `${process.cwd()}/libs`;

const config = require(`${libs}/config`);

const log = require(`${libs}/log`)(module);

const User = require(`${libs}/models/user`);
const jwt = require('jwt-simple');

const response = require(`${libs}/middlewares/response`);

const required_fields = ["email", "password", "name", "cpf", "schooling", "segment", "role", "institution_name", "state", "city"];
function emailSyntax(email) {
Lucas Gabriel Lima's avatar
Lucas Gabriel Lima committed
    const regex = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
    return regex.test(email);
userApp.get('/schooling', (req, res, next) => {
    req.result = [
        'Não estudou', 
        'Ensino Fundamental Incompleto',
        'Ensino Fundamental Completo',
        'Ensino Médio',
        'Graduação',
        'Mestrado',
        'Doutorado'
    ];
    next();
}, response('schooling'));

userApp.get('/segment', (req, res, next) => {
    req.result = [
        'Gestores e equipe gestora das secretarias e ministério da Educação',
        'Gestores dos órgãos de planejamento e finanças (das três esferas de governo)',
        'Agentes do poder legislativo',
        'Agentes dos conselhos de educação',
        'Profissionais da educação',
        'Sindicato',
        'Sociedade civil interessada no financiamento da Educação Básica de qualidade',
        'Comunidade acadêmica',
        'Imprensa',
        'Outro [citar segmento]'
    ];
    next();
}, response('segment'));

userApp.get('/role', (req, res, next) => {
    req.result = [
        {"Gestores e equipe gestora das secretarias e ministério da Educação" : ["Dirigente municipal, estadual e federal", "Secretário do MEC", "Servidor da área de planejamento educacional", "Membro de associação de gestores (Ex. Undime, Consed, etc)", "Outro [citar função]"]},
        {"Gestores dos órgãos de planejamento e finanças (das três esferas de governo)" : ["Equipe gestora dos órgãos de planejamento", "Equipe gestora dos órgãos de finanças", "Outro [citar função]"]},
        {"Agentes do poder legislativo" : ["Parlamentar", "Assessor/a parlamentar", "Auditor/a dos tribunais de conta", "Conselheiro/a de tribunais de conta.", "Outro [citar função]"]},
        {"Agentes dos conselhos de educação" : ["Conselheiro/a municipais, estaduais e federais", "Conselheiro/a do Fundeb", "Outro [citar função]"]},
        {"Profissionais da educação" : ["Professor/a da Educação Básica", "Profissional da educação não-docente", "Outro [citar função]"]},
        {"Sindicato" : ["Agente de sindicatos"]},
        {"Sociedade civil interessada no financiamento da Educação Básica de qualidade" : ["Membro de fóruns educacionais", "Membro de ONGs e demais entidades sem fins lucrativos", "Estudante da educação básica e membro de entidades estudantis", "Pais e membros de entidades de pais", "Outro [citar função]"]},
        {"Comunidade acadêmica" : ["Pesquisador/a", "Estudantes de graduação e pós-graduação", "Representantes de entidades de pesquisa (Ex.: ANPED, ANPAE e FINEDUCA)", "Outro [citar função]"]},
        {"Imprensa" : ["Jornalista", "Outro [citar função]"]},
        {"Outro [citar segmento]" : []}
    ]
    next();
}, response('role'));

Lucas Gabriel Lima's avatar
Lucas Gabriel Lima committed
userApp.post('/', (req, res, next) => {
    if(req.body.email){
        if(!emailSyntax(req.body.email)){
Gabriel Ruschel's avatar
Gabriel Ruschel committed
            res.status(400);
            res.json({success: false, msg: 'O email informado é inválido.'});
        } else {
            next();
        }
},
 (req, res, next) => {
    User.count({'email': req.body.email}, function(err, count){
        if (err){
            res.status(500);
            res.json({success: false, msg: ['Um erro ocorreu no banco de dados.']});
Gabriel Ruschel's avatar
Gabriel Ruschel committed
            res.status(400);
            res.json({success: false, msg: 'O email informado já está cadastrado.'});
        } else {
            next();
        }
    });

}, (req, res, next) => {
    User.count({'cpf': req.body.cpf}, function(err, count){
        if (err){
            res.status(500);
            res.json({success: false, msg: ['Um erro ocorreu no banco de dados.']});
Gabriel Ruschel's avatar
Gabriel Ruschel committed
            res.status(400);
            res.json({success: false, msg: 'O CPF informado já está cadastrado.'});
Lucas Gabriel Lima's avatar
Lucas Gabriel Lima committed
}, (req, res, next) => {
    var newUser = new User({
        email: req.body.email,
        password: req.body.password,
        name: req.body.name,
        cpf: req.body.cpf,
        schooling: req.body.schooling,
        course: req.body.course,
        segment: req.body.segment,
        role: req.body.role,
        institution_name: req.body.institution_name,
        state: req.body.state,
        city: req.body.city,
        receive_emails: req.body.receive_emails
Lucas Gabriel Lima's avatar
Lucas Gabriel Lima committed
    });

    // save the user
    newUser.save((err) => {
Lucas Gabriel Lima's avatar
Lucas Gabriel Lima committed
            let errArray = [];
            let errMsg = '';
            for (var e in err.errors) {
Lucas Gabriel Lima's avatar
Lucas Gabriel Lima committed
                    errArray.push(err.errors[`${e}`].message);
Gabriel Ruschel's avatar
Gabriel Ruschel committed
            res.status(400);
            res.json({success: false, msg: errArray});
            res.status(201);
            res.json({success: true, msg: 'Usuário cadastrado com sucesso!'});
userApp.post('/authenticate', (req, res, next) => {
    if (!req.body.email) {
Gabriel Ruschel's avatar
Gabriel Ruschel committed
        res.status(400);
        res.json({success: false, msg: 'O campo Email é obrigatório.'});
    } else {
        next();
    }

}, (req, res, next) => {
    if (!req.body.password) {
Gabriel Ruschel's avatar
Gabriel Ruschel committed
        res.status(400);
        res.json({success: false, msg: 'O campo Senha é obrigatório.'});
    } else {
        next();
    }

}, (req, res, next) => {
    User.findOne({
        email: req.body.email
    }, (err, user) => {
        if (err) throw err;

        if(!user){
            res.status(400);
            res.json({success: false, msg: ['O Email informado não está cadastrado.']});
        }
        else {
            user.comparePassword(req.body.password, (err, isMatch) => {
                if (isMatch && !err) {
                    var secret = config.mongodb.secret;

                    // if user is found and password is right create a token
                    var token = jwt.encode(user, secret);

                    //returns user info including token as json
                    res.json({success: true, token: 'JWT ' + token, msg: 'Usuário autenticado com sucesso'});
                    res.status(400);
                    res.json({success: false, msg: ['A Senha informada é inválida.']});
module.exports = userApp;