Provide feedback

This commit is contained in:
Troplo 2021-02-04 21:52:18 +11:00
parent c45e8ea2b2
commit 4ad637867e
7 changed files with 118 additions and 82 deletions

View File

@ -0,0 +1,33 @@
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('feedback', {
id: {
type: Sequelize.BIGINT,
primaryKey: true,
autoIncrement: true
},
route: {
type: Sequelize.TEXT,
defaultValue: '/',
allowNull: false
},
email: {
type: Sequelize.TEXT
},
stars: {
type: Sequelize.INTEGER
},
text: {
type: Sequelize.TEXT
}
}, {
charset: 'utf8mb4'
})
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('awards');
}
}

View File

@ -0,0 +1,20 @@
module.exports = {
up(queryInterface, Sequelize) {
return Promise.all([
queryInterface.addColumn(
'feedback',
'createdAt',
{
type: Sequelize.DATE,
},
),
queryInterface.addColumn(
'feedback',
'updatedAt',
{
type: Sequelize.DATE,
},
),
]);
},
};

40
models/feedback.js Normal file
View File

@ -0,0 +1,40 @@
const Errors = require('../lib/errors')
module.exports = (sequelize, DataTypes) => {
let Feedback = sequelize.define('Feedback', {
id: {
type: DataTypes.BIGINT,
primaryKey: true,
autoIncrement: true
},
route: {
type: DataTypes.TEXT,
defaultValue: '/',
allowNull: false
},
email: {
type: DataTypes.TEXT,
validate: {
isEmail: true
}
},
stars: {
type: DataTypes.INTEGER,
validate: {
min: 1,
max: 5
}
},
text: {
type: DataTypes.TEXT,
validate: {
len: [5, 512]
}
},
createdAt: DataTypes.DATE,
updatedAt: DataTypes.DATE
}, {
freezeTableName: true
})
return Feedback
}

View File

@ -1,81 +0,0 @@
const express = require('express');
const router = express.Router();
const User = require("../models/user.js")
//login handle
router.get('/login',(req,res)=>{
res.render('login');
})
router.get('/register',(req,res)=>{
res.render('register')
})
//Register handle
router.post('/register',(req,res)=>{
const {name,email, password, password2} = req.body;
let errors = [];
console.log(' Name ' + name+ ' email :' + email+ ' pass:' + password);
if(!name || !email || !password || !password2) {
errors.push({msg : "Please fill in all fields"})
}
//check if match
if(password !== password2) {
errors.push({msg : "passwords dont match"});
}
//check if password is more than 6 characters
if(password.length < 6 ) {
errors.push({msg : 'password atleast 6 characters'})
}
if(errors.length > 0 ) {
res.render('register', {
errors : errors,
name : name,
email : email,
password : password,
password2 : password2})
} else {
//validation passed
User.findOne({email: email}).exec((err, user) => {
console.log(user);
if (user) {
errors.push({msg: 'email already registered'});
render(res, errors, name, email, password, password2);
} else {
const newUser = new User({
name: name,
email: email,
password: password
});
//hash password
bcrypt.genSalt(10, (err, salt) =>
bcrypt.hash(newUser.password, salt,
(err, hash) => {
if (err) throw err;
//save pass to hash
newUser.password = hash;
//save user
newUser.save()
.then((value) => {
console.log(value)
res.redirect('/users/login');
})
.catch(value => console.log(value));
}));
} //ELSE statement ends here
})
}
})
router.post('/login',(req,res,next)=>{
})
//logout
router.get('/logout',(req,res)=>{
})
module.exports = router;

22
routes/feedback.js Normal file
View File

@ -0,0 +1,22 @@
let express = require('express')
let router = express.Router()
const auth = require('../lib/auth')
const Errors = require('../lib/errors')
let { Feedback } = require('../models')
let pagination = require('../lib/pagination.js')
const rateLimit = require("express-rate-limit");
const postLimiter = rateLimit({
windowMs: 60000,
max: 10,
message: "{\"errors\":[{\"name\":\"rateLimit\",\"message\":\"You may only make 10 requests to this endpoint per minute.\",\"status\":429}]}"
});
router.post('/', postLimiter, async(req, res, next) => {
try {
let feedback = await Feedback.create({route: req.body.route, text: req.body.text, stars: req.body.stars, email: req.body.email})
res.json(feedback)
} catch (e) { next(e) }
})
module.exports = router

View File

@ -27,7 +27,8 @@ router.get('/show/:username', async(req, res, next) => {
let meta = await user.getMeta(limit)
let Posts = await teamWall.find(postInclude)
res.json(Object.assign( user.toJSON(limit), { meta, Posts } )) } catch (e) { next(e) }
res.json(Object.assign( user.toJSON(limit), { meta, Posts } ))
} catch (e) { next(e) }
})
router.all('*', auth, (req, res, next) => {

View File

@ -123,6 +123,7 @@ if(!config.maintenance) {
app.use('/api/v1/nodes/', require('./routes/node'))
app.use('/api/v1/awards/', require('./routes/award'))
app.use('/api/v1/blog', require('./routes/blog'))
app.use('/api/v1/feedback', require('./routes/feedback'))
app.use(require('./lib/errorHandler'))
app.set('trust proxy', true)
} else {