diff --git a/index.js b/index.js new file mode 100644 index 0000000000000000000000000000000000000000..12cb830e931db54f43350194a0a01f23895efb34 --- /dev/null +++ b/index.js @@ -0,0 +1,63 @@ +const express = require('express'); +const session = require('express-session'); +const bodyParser = require('body-parser'); +const User = require('./models/user'); +const mongoose = require('mongoose'); +const bcrypt = require('bcrypt'); + +const config = require('./config.json'); + +// Configuration +const app = express(); +app.set('view engine', 'pug'); +app.use(session({ + secret: config.secret, + resave: false, + saveUninitialized: false +})); + +// Middlewares +app.use(bodyParser.urlencoded({ + extended: false, +})); +app.use((req, res, next) => { + if (!req.session.user && !['/', '/signup'].includes(req.url)) { + return res.redirect('/signup'); + } else { + return next(); + } +}); + +app.get('/', (req, res) => { + return res.render('home'); +}); +app.get('/signup', (req, res) => { + return res.render('signup'); +}); +app.post('/signup', (req, res) => { + bcrypt.hash(req.body.password, config.cryptRounds).then((hash, err) => { + User.create(req.body).then(user => { + req.session.user = user; + return res.redirect('/'); + }); + }); +}); +app.post('/login', (req, res) => { + User.findOne({ username: req.body.username }).then(user => { + bcrypt.compare(req.body.password, user.passwordHash).then((err, same) => { + if (same) { + req.session.user = user; + return res.redirect(req.query.nextUrl); + } else { + return res.redirect('/signup'); + } + }); + }); +}); + +mongoose.connect('mongodb://localhost/rolegame', err => { + console.log('Server connected to Mongo database'); + app.listen(config.port, () => { + console.log(`Server listening on http://localhost:${config.port}`); + }); +}); diff --git a/models/user.js b/models/user.js index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fdb9dc2587a5453ea56b85e9a19e301f93f3c045 100644 --- a/models/user.js +++ b/models/user.js @@ -0,0 +1,25 @@ +const mongoose = require('mongoose'); + +const User = new mongoose.Schema({ + firstName: { + type: String, + required: true, + }, + lastName: { + type: String, + }, + username: { + unique: true, + type: String, + lowercase: true + }, + email: { + type: String, + required: true, + }, + passwordHash: { + type: String, + }, +}); + +module.exports = mongoose.model('User', User); \ No newline at end of file diff --git a/views/base.pug b/views/base.pug new file mode 100644 index 0000000000000000000000000000000000000000..7c6b4cd09b15d8e794e9167b4125516f768c509a --- /dev/null +++ b/views/base.pug @@ -0,0 +1,15 @@ +<!DOCTYPE html> +html(lang="en") + head + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1.0") + meta(http-equiv="X-UA-Compatible", content="ie=edge") + link(rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css" integrity="sha256-9mbkOfVho3ZPXfM7W8sV2SndrGDuh7wuyLjtsWeTI1Q=" crossorigin="anonymous") + title RoleGame + body + block navbar + .ui.container + block main + block script + script(src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" crossorigin="anonymous") + script(src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js" integrity="sha256-t8GepnyPmw9t+foMh3mKNvcorqNHamSKtKRxxpUEgFI=" crossorigin="anonymous") \ No newline at end of file diff --git a/views/home.pug b/views/home.pug new file mode 100644 index 0000000000000000000000000000000000000000..c227ddd8f33b019c79860ce241c0298e9b527bbe --- /dev/null +++ b/views/home.pug @@ -0,0 +1,4 @@ +extends base.pug + +block main + h1.ui.header Bienvenue sur RoleGame diff --git a/views/signup.pug b/views/signup.pug new file mode 100644 index 0000000000000000000000000000000000000000..afcd9076e903308f8f223e5feeec21b0c4b8e80c --- /dev/null +++ b/views/signup.pug @@ -0,0 +1,22 @@ +extends base.pug + +block main + form.ui.form(action="/signup" method="post") + .two.fields + .field + label(for="firstName") Prénom + input#firstName(type="text", name="firstName") + .field + label(for="lastName") Nom de famille + input#lastName(type="text", name="lastName") + .field + label(for="email") Email + input#email(type="email", name="email") + .field + label(for="username") Nom d'utilisateur + input#username(type="text", name="username") + .field + label(for="password") Mot de passe + input#password(type="password", name="password") + .field + input.ui.button(type="submit", value="S'inscrire") \ No newline at end of file