Skip to content
Snippets Groups Projects
Select Git revision
  • 2eb4aecca6b6ef0e8446f7adfbc75fe2ca6512a7
  • master default
2 results

routes.js

Blame
  • user avatar
    Mariana Carmin authored
    2eb4aecc
    History
    routes.js 9.19 KiB
    var express = require('express')
    var passport = require('passport')
    var router = express.Router()
    var multer = require('multer')
    var crypto = require('crypto')
    var path = require('path')
    
    var storage = multer.diskStorage({
        destination: function(req, file, cb) {
            cb(null, 'uploads/')
        },
        filename: function(req, file, cb) {
            crypto.pseudoRandomBytes(16, function(err, raw) {
                cb(null, raw.toString('hex') + Date.now() + path.extname(file.originalname))
            })
        }
    })
    var fileFilter = function(req, file, cb) {
        if(file.mimetype === 'image/jpg' ||
        file.mimetype === 'image/jpeg' ||
        file.mimetype === 'image/png' ||
        file.mimetype === 'application/pdf') {
            cb(null, true)
            return
        }
        var err = new Error('Invalid file')
        err.status = 400
        cb(err)
    }
    var upload = multer({storage: storage, fileFilter: fileFilter})
    var fs = require('fs')
    
    var libs = process.cwd() + '/libs/'
    var VerificationToken = require(libs + 'model/verificationToken')
    var Usuario = require(libs + 'model/usuario')
    var Arquivo = require(libs + 'model/arquivo')
    var Materia = require(libs + 'model/materia')
    var Professor = require(libs + 'model/professor')
    var role = require(libs + 'role')
    
    var log = require(libs + 'log')(module)
    
    router.get('/', function(req, res) {
        var user = req.user
        if(user) {
            delete user.hashedPassword
            delete user.salt
        }
        res.render('index', {user: user, message: req.flash('indexMessage')})
    })
    
    router.get('/login', function(req, res) {
        res.render('login', {message: req.flash('loginMessage')})
    })
    
    router.post('/login', passport.authenticate('local-login', {
        failureRedirect: '/login',
        failureFlash: true
    }), function(req, res) {
        if(req.query.url) return res.redirect(req.query.url)
        return res.redirect('/')
    })
    
    router.get('/search', function(req, res) {
        res.render('search', {message: req.flash('loginMessage')})
    })
    
    router.post('/search', function(req, res) {
        //res.render('search', {b: arquivos[0].nome})
        Arquivo.find()
        .sort([['codigo', 'ascending']])
        .exec(function(err, arquivos) {
            if(!err) {
                return res.render('search', {arquivos: arquivos})
            }
        })
    })
    
    router.get('/logout', function(req, res) {
        req.logout()
        res.redirect('/')
    })
    
    router.get('/signup', function(req, res) {
        res.render('signup', {message: req.flash('signupMessage')})
    })
    
    router.post('/signup', passport.authenticate('local-signup', {
        successRedirect: '/',
        failureRedirect: '/signup',
        failureFlash: true
    }))
    
    router.get('/verify/:token', function(req, res) {
        var token = req.params.token
        var ok = true
        VerificationToken.findOne({token: token}, function(err, vToken) {
            if(err) {
                log.error(err)
                req.flash('verifyMessage', 'A verificação falhou. Entre em contato com um administrador através do e-mail pet@inf.ufpr.br')
                ok = false
            }
            Usuario.findOne({_id: vToken.userId}, function(err, usuario) {
                usuario.verificado = true
                usuario.save(function(err) {
                    if(err) {
                        log.error(err)
                        ok = false
                        req.flash('verifyMessage', 'A verificação falhou. Entre em contato com um administrador através do e-mail pet@inf.ufpr.br')
                    }
                })
            })
            res.render('verify', {message: req.flash('verifyMessage'), ok: ok})
        })
    })
    
    router.get('/conta', role.isLoggedIn(), function(req, res) {
        res.render('conta', {user: req.user, message: req.flash('updatePassword')})
    })
    
    router.post('/conta', role.isLoggedIn(), function(req, res) {
        Usuario.findOne({_id: req.user._id}, function(err, usuario) {
            if(!usuario) {
                // TODO: 404
                req.flash('updatePassword', JSON.stringify({
                    title: 'Ops!',
                    message: 'Não foi possível alterar sua senha. ' + err,
                    type: 'error'
                }))
                res.redirect('/conta')
            }
            
            if(!err) {
                if(usuario.checkPassword(req.body.oldpassword)) {
                    usuario.password = req.body.newpassword
                    usuario.save(function(err) {
                        if(!err) {
                            req.flash('updatePassword', JSON.stringify({
                                title: 'Alterada!',
                                message: 'Sua senha foi alterada com sucesso.',
                                type: 'success'
                            }))
                            res.redirect('/conta')
                        } else {
                            //TODO: 500
                            req.flash('updatePassword', JSON.stringify({
                                title: 'Ops!',
                                message: 'Não foi possível alterar sua senha. ' + err,
                                type: 'error'
                            }))
                            log.error(err)
                            res.redirect('/conta')
                        }
                    })
                } else {
                    req.flash('updatePassword', JSON.stringify({
                        title: 'Ops!',
                        message: 'Não foi possível alterar sua senha. ' + err,
                        type: 'error'
                    }))
                    res.redirect('/conta')
                }
            } else {
                log.error(err)
                //TODO: 500
                req.flash('updatePassword', JSON.stringify({
                    title: 'Ops!',
                    message: 'Não foi possível alterar sua senha. ' + err,
                    type: 'error'
                }))
                res.redirect('/conta')
            }
        })
    })
    
    router.get('/upload', role.isLoggedIn(), function(req, res) {
        Materia.find(function(err, materias) 
        {
            if(!err) {
                Professor.find(function(err, professores) {
                    if(!err) {
                        res.render('upload', {user: req.user, materias: materias, professores: professores, message: req.flash('uploadMessage')})
                    }
                })
            }
        })
    })
    
    router.post('/upload', role.isLoggedIn(), role.isVerificado(), upload.array('arquivo', 1), function(req, res) {
        /*
        No momento é feito o upload de apenas 1 arquivo. Logo esse for é "inútil"
        */
       console.log(req.body.materia)
       console.log(req.body.professor)
        Materia.find({nome: req.body.materia}).exec(function(err, materia){
            if(!err) {
                Professor.find({nome: req.body.professor}).exec(function(err, professor) {
                    if(!err) {
                        log.debug(materia)
                        log.debug(professor)
                        for(var f in req.files) {
                            file = req.files[f]
                            var arquivo = new Arquivo({
                                nome: file.originalname,
                                tipo: (req.body.provaTrabalho === 'on') ? 'prova' : 'trabalho',
                                numero: req.body.numero || 0,
                                substitutiva: (req.body.substitutiva === 'on'),
                                ano: req.body.ano,
                                semestre: req.body.semestre,
                                arquivo: file.path,
                                status: req.body.status || 'pendente',
                                tipoArquivo: file.mimetype,
                                // TODO: aqui tem que converter o nome/código da máteria e do professor para o _id do mongo
                                materia: materia[0]._id,
                                professor: professor[0]._id,
                                usuario: req.user.userId
                            })
    
                            arquivo.save(function (err) {
                                if(!err) {
                                    log.debug(arquivo)
                                    res.render('uploadDetails', {user: req.user, arquivo: arquivo, materia: materia[0].nome, professor: professor[0].nome})
                                } else {
                                    if(err.name === 'ValidationError') {
                                        res.statusCode = 400
                                        res.json({error: 'Validation error'})
                                    } else {
                                        res.statusCode = 500
                                        res.json({error:'Server error'})
                                    }
                                    console.log('Internal error(%d): %s', res.statusCode, err.message)
                                    fs.unlink(file.path, function() {
                                        if(err) log.error(err)
                                    })
                                }
                            })
                        }
                    }
                })
            }
        })
    })
    
    router.get('/upload/cancel/:id', role.isLoggedIn(), role.isVerificado(), function(req, res) {
        Arquivo.findByIdAndRemove(req.params.id, function(err, arquivo) {
            if(!arquivo) {
                res.statusCode = 404
                return res.json({error: 'Not found'})
            }
            fs.unlink(arquivo.arquivo, function() {
                if(err) log.error(err)
            })
            req.flash('uploadMessage', JSON.stringify({
                title: 'Cancelado',
                message: 'O upload do arquivo foi cancelado',
                type: 'info'
            }))
            res.redirect('/upload')
        })
    })
    
    module.exports = router