Skip to content
Snippets Groups Projects
Commit b79686ae authored by Martin Lehoux's avatar Martin Lehoux
Browse files

Merge branch 'patch-0.2.1' into 'master'

v0.2.1

See merge request !4
parents 195cc1f6 68c10b4f
Branches
No related tags found
1 merge request!4v0.2.1
...@@ -6,43 +6,19 @@ const bcrypt = require('bcrypt'); ...@@ -6,43 +6,19 @@ const bcrypt = require('bcrypt');
const morgan = require('morgan'); const morgan = require('morgan');
const mongoDBStore = require('connect-mongodb-session')(session); const mongoDBStore = require('connect-mongodb-session')(session);
// Config
const config = require('./config.json'); const config = require('./config.json');
// Middlewares
const userLoader = require('./middlewares/userLoader');
const loginChecker = require('./middlewares/loginChecker');
// Utils
const render = require('./utils/render');
const { warn, error } = require('./utils/notifications');
// Models
const User = require('./models/user'); const User = require('./models/user');
const Notification = require('./models/notification'); const Notification = require('./models/notification');
// Routes
// Utils const authRouter = require('./routes/auth');
const render = (req, res, view, options) => {
// Load notifications
if (req.session.user) {
res.render(view, {
...options,
user: req.session.user,
nextUrl: req.url,
notifications: req.session.user.notifications
});
req.session.user.notifications
.filter(notification => !notification.persistant)
.forEach(notification => notification.remove());
req.session.user.save();
} else {
return res.render(view, {
...options,
user: req.session.user,
nextUrl: req.url,
notifications: []
});
}
};
const warn = (req, res, title, content) => {
req.session.user.notifications.push({ title, content, color: "warning" });
req.session.user.save();
};
const error = (req, res, title, content) => {
req.session.user.notifications.push({ title, content, color: "error" });
req.user.session.save();
return res.redirect('/'); // TODO redirect to error route or previous
}
// Configuration // Configuration
const app = express(); const app = express();
...@@ -63,66 +39,15 @@ app.use(session({ ...@@ -63,66 +39,15 @@ app.use(session({
})); }));
// Middlewares // Middlewares
app.use(bodyParser.urlencoded({ app.use(bodyParser.urlencoded({ extended: false }));
extended: false, app.use(userLoader);
})); app.use(loginChecker);
app.use((req, res, next) => {
if (req.session.user || ['/', '/signup', '/login'].includes(req.url)) {
next();
} else {
return res.redirect('/signup');
}
});
app.use((req, res, next) => {
if (req.session.user) {
User.findById(req.session.user._id, (err, user) => {
err ? error(req, res, 'Error fetching user', err) : null;
req.session.user = user;
next();
});
} else {
next();
}
})
// Routes
app.get('/', (req, res) => { app.get('/', (req, res) => {
return render(req, res, 'home'); return render(req, res, 'home');
}); });
app.get('/signup', (req, res) => { app.use('/auth', authRouter);
return render(req, res, 'signup');
});
app.post('/signup', (req, res) => {
const passwordHash = bcrypt.hashSync(req.body.password, config.cryptRounds);
User.create(req.body, (err, user) => {
err ? error(req, res, 'Error creating user', err) : null;
user.passwordHash = passwordHash;
user.save();
req.session.user = user;
return res.redirect('/');
});
});
app.post('/login', (req, res) => {
if (!req.body.username || !req.body.password) {
return res.redirect('/signup');
} else if (req.session.user) {
error(req, res, 'User already logged in', 'You must logout before log in.')
} else {
User.findOne({ username: req.body.username }, (err, user) => {
err ? error(req, res, 'Error fetching user', err) : null;
if (bcrypt.compareSync(req.body.password, user.passwordHash)) {
req.session.user = user;
return res.redirect(req.query.nextUrl || '/');
} else {
error(req, res, 'Bad credentials')
return res.redirect('/signup');
}
});
}
});
app.post('/logout', (req, res) => {
req.session.destroy();
return res.redirect('/');
})
mongoose.connect('mongodb://localhost/rolegame', err => { mongoose.connect('mongodb://localhost/rolegame', err => {
if (err) { if (err) {
......
module.exports = (req, res, next) => {
if (req.session.user || ['/', '/auth/signup', '/auth/login'].includes(req.url)) {
next();
} else {
return res.redirect('/auth/signup');
}
};
\ No newline at end of file
const User = require('../models/user');
module.exports = (req, res, next) => {
if (req.session.user) {
User.findById(req.session.user._id, (err, user) => {
err ? error(req, res, 'Error fetching user', err) : null;
req.session.user = user;
next();
});
} else {
next();
}
};
const express = require('express');
const bcrypt = require('bcrypt');
const User = require('../models/user');
const router = express.Router();
router.get('/signup', (req, res) => {
return render(req, res, 'signup');
});
router.post('/signup', (req, res) => {
const passwordHash = bcrypt.hashSync(req.body.password, config.cryptRounds);
User.create(req.body, (err, user) => {
err ? error(req, res, 'Error creating user', err) : null;
user.passwordHash = passwordHash;
user.save();
req.session.user = user;
return res.redirect('/');
});
});
router.post('/login', (req, res) => {
if (!req.body.username || !req.body.password) {
return res.redirect('/auth/signup');
} else if (req.session.user) {
error(req, res, 'User already logged in', 'You must logout before log in.')
} else {
User.findOne({ username: req.body.username }, (err, user) => {
err ? error(req, res, 'Error fetching user', err) : null;
if (bcrypt.compareSync(req.body.password, user.passwordHash)) {
req.session.user = user;
return res.redirect(req.query.nextUrl || '/');
} else {
error(req, res, 'Bad credentials')
return res.redirect('/auth/signup');
}
});
}
});
router.post('/logout', (req, res) => {
req.session.destroy();
return res.redirect('/');
});
module.exports = router;
\ No newline at end of file
const warn = (req, res, title, content) => {
req.session.user.notifications.push({ title, content, color: "warning" });
req.session.user.save();
};
const error = (req, res, title, content) => {
req.session.user.notifications.push({ title, content, color: "error" });
req.user.session.save();
return res.redirect('/'); // TODO redirect to error route or previous
};
module.exports = { warn, error };
\ No newline at end of file
const render = (req, res, view, options) => {
// Load notifications
if (req.session.user) {
res.render(view, {
...options,
user: req.session.user,
nextUrl: req.url,
notifications: req.session.user.notifications
});
req.session.user.notifications
.filter(notification => !notification.persistant)
.forEach(notification => notification.remove());
req.session.user.save();
} else {
return res.render(view, {
...options,
user: req.session.user,
nextUrl: req.url,
notifications: []
});
}
};
module.exports = render;
\ No newline at end of file
...@@ -11,7 +11,7 @@ html(lang="en") ...@@ -11,7 +11,7 @@ html(lang="en")
script(src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js" integrity="sha256-t8GepnyPmw9t+foMh3mKNvcorqNHamSKtKRxxpUEgFI=" crossorigin="anonymous") script(src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js" integrity="sha256-t8GepnyPmw9t+foMh3mKNvcorqNHamSKtKRxxpUEgFI=" crossorigin="anonymous")
block navbar block navbar
if !user if !user
form.ui.form(action="/login", method="post") form.ui.form(action="/auth/login", method="post")
.ui.pointing.menu .ui.pointing.menu
.right.menu .right.menu
.item .item
...@@ -24,7 +24,7 @@ html(lang="en") ...@@ -24,7 +24,7 @@ html(lang="en")
.ui.transparent.input .ui.transparent.input
input.ui.button(type="submit" value="Se connecter") input.ui.button(type="submit" value="Se connecter")
else else
form.ui.form(action="/logout", method="post") form.ui.form(action="/auth/logout", method="post")
.ui.pointing.menu .ui.pointing.menu
.right.menu .right.menu
.item #{user.firstName} #{user.lastName} .item #{user.firstName} #{user.lastName}
......
extends base.pug extends base.pug
block main block main
form.ui.form(action="/signup" method="post") form.ui.form(action="/auth/signup" method="post")
.two.fields .two.fields
.field .field
label(for="firstName") Prénom label(for="firstName") Prénom
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment