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

divide src in folders

parent 96eb9557
No related branches found
No related tags found
1 merge request!4v0.2.1
......@@ -6,43 +6,19 @@ const bcrypt = require('bcrypt');
const morgan = require('morgan');
const mongoDBStore = require('connect-mongodb-session')(session);
// Config
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 Notification = require('./models/notification');
// Utils
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
}
// Routes
const authRouter = require('./routes/auth');
// Configuration
const app = express();
......@@ -63,66 +39,15 @@ app.use(session({
}));
// Middlewares
app.use(bodyParser.urlencoded({
extended: false,
}));
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();
}
})
app.use(bodyParser.urlencoded({ extended: false }));
app.use(userLoader);
app.use(loginChecker);
// Routes
app.get('/', (req, res) => {
return render(req, res, 'home');
});
app.get('/signup', (req, res) => {
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('/');
})
app.use('/auth', authRouter);
mongoose.connect('mongodb://localhost/rolegame', 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")
script(src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js" integrity="sha256-t8GepnyPmw9t+foMh3mKNvcorqNHamSKtKRxxpUEgFI=" crossorigin="anonymous")
block navbar
if !user
form.ui.form(action="/login", method="post")
form.ui.form(action="/auth/login", method="post")
.ui.pointing.menu
.right.menu
.item
......@@ -24,7 +24,7 @@ html(lang="en")
.ui.transparent.input
input.ui.button(type="submit" value="Se connecter")
else
form.ui.form(action="/logout", method="post")
form.ui.form(action="/auth/logout", method="post")
.ui.pointing.menu
.right.menu
.item #{user.firstName} #{user.lastName}
......
extends base.pug
block main
form.ui.form(action="/signup" method="post")
form.ui.form(action="/auth/signup" method="post")
.two.fields
.field
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