Skip to content
Open

done #2141

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,21 @@ require('./db');
// Handles http requests (express is node js framework)
// https://www.npmjs.com/package/express
const express = require('express');
const { sessionConfig, loggedUser } = require("./config/session.config");

// Handles the handlebars
// https://www.npmjs.com/package/hbs
const hbs = require('hbs');


const app = express();

// ℹ️ This function is getting exported from the config folder. It runs most middlewares
require('./config')(app);
app.use(sessionConfig);
app.use(loggedUser);



// default value for title local
const projectName = 'lab-express-basic-auth';
Expand All @@ -25,11 +31,12 @@ const capitalized = string => string[0].toUpperCase() + string.slice(1).toLowerC
app.locals.title = `${capitalized(projectName)}- Generated with Ironlauncher`;

// 👇 Start handling routes here
const index = require('./routes/index');
const index = require('./routes/routes');
app.use('/', index);


// ❗ To handle errors. Routes that don't exist or errors that you handle in specific routes
require('./error-handling')(app);


module.exports = app;

6 changes: 6 additions & 0 deletions config/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// We reuse this import in order to have access to the `body` property in requests
const express = require("express");
const hbs = require("hbs");

// ℹ️ Responsible for the messages you see in the terminal as requests are coming in
// https://www.npmjs.com/package/morgan
Expand Down Expand Up @@ -27,6 +28,11 @@ module.exports = (app) => {
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());

hbs.registerPartials(__dirname + "/../views/partials");




// Normalizes the path to the views folder
app.set("views", path.join(__dirname, "..", "views"));
// Sets the view engine to handlebars
Expand Down
42 changes: 42 additions & 0 deletions config/session.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
const User = require("../models/User.model");
const expressSession = require("express-session");
const MongoStore = require("connect-mongo");
const mongoose = require("mongoose");

const MAX_AGE = 7;

module.exports.sessionConfig = expressSession({
name: "express-cookie",
secret: "super-secret", // esto lo guardaamos en el dot.env COOKIE_SECRET
resave: false,
saveUninitialized: false,
cookie: {
secure: false, // mandamos la cookie en protocolos HTTP/HTTPS si es true solo HTTPS
httpOnly: true, // no es accesible por el Javascript del client-browser
maxAge: 24 * 3600 * 1000 * MAX_AGE, // una semana de vida
},
store: new MongoStore({
mongoUrl: mongoose.connection._connectionString, //monngoose.connection.db
ttl: 24 * 3600 * MAX_AGE,
}),
});

module.exports.loggedUser = (req, res, next) => {
const userId = req.session.userId;

if (userId) {
User.findById(userId)
.then((userFromDB) => {
if (userFromDB) {
req.currentUser = userFromDB; // todos los middlewares ya tienen acceso a currentUser
res.locals.currentUser = userFromDB; // res.locals es el objeto donde se manda informacion a todas las vistas (hbs)
next();
} else {
next();
}
})
.catch((err) => next(err));
} else {
next();
}
};
83 changes: 83 additions & 0 deletions controllers/auth.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
const User = require("../models/User.model");
const mongoose = require("mongoose");


module.exports.register = (req, res, next) => {
res.render("auth/register")
}

module.exports.doRegister = (req, res, next) => {
User.create(req.body)
.then((user) => {
res.redirect("/login");
})
.catch((err) => {
if (err instanceof mongoose.Error.ValidationError) {
res.render("auth/register", {
user: {
email: req.body.email,
},
errors: err.errors,
});
}
else if (err.code === 11000) {

res.render("auth/register", {
user: req.body,
errors: {
email: "El correo electrónico ya está registrado.",
},
});
} else {
next(err);
}
});
};


module.exports.login = (req, res, next) => {
res.render("auth/login");
};
module.exports.doLogin = (req, res, next) => {
const { email, password } = req.body;
User.findOne({ email })
.then((user) => {
if (user) {
return user.checkPassword(password).then((match) => {
if (match) {
req.session.userId = user.id; // genero cookie y session
res.redirect("/main");
} else {
res.render("auth/login", {
errors: {
error: "Email o contraseña incorrectos",
email: req.body.email, // Mensaje de error para el usuario
},
});

}
});
} else {
res.render("auth/login", {
errors: {
error: "Email o contraseña incorrectos",
email: req.body.email, // Mensaje de error para el usuario
},
});
}
})
.catch((err) => next(err));
};

module.exports.logout = (req, res, next) => {
req.session.destroy();
res.clearCookie("express-cookie");
res.redirect("/login");
};


module.exports.main = (req, res, next) => {
res.render("auth/register")
}


3 changes: 3 additions & 0 deletions controllers/misc.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports.home= (req, res, next) => {
res.render("index");
};
17 changes: 17 additions & 0 deletions controllers/user.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const User = require("../models/User.model");

module.exports.profile = (req, res, next) =>{
res.render("users/main");
}

module.exports.private = (req, res, next) =>{
res.render("users/private");
}

module.exports.delete = (req, res, next)=>{
User.findByIdAndDelete(req.params.id)
.then(()=>{
res.redirect("/panel")
})
.catch((err) => next(err));
};
17 changes: 0 additions & 17 deletions error-handling/index.js

This file was deleted.

17 changes: 17 additions & 0 deletions middlewares/auth.middleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module.exports.isAutenticated = (req, res, next) => {
if (req.currentUser) {
next();
}else{
res.redirect("/login");
}


};

module.exports.isNoAutenticated = (req, res, next) => {
if (!req.currentUser) {
next();
}else{
res.redirect("/main");
}
};
42 changes: 36 additions & 6 deletions models/User.model.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,44 @@
const { Schema, model } = require("mongoose");
const mongoose = require("mongoose");
const bcrypt = require("bcrypt");

const EMAIL_PATTERN =
/^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;


// TODO: Please make sure you edit the user model to whatever makes sense in this case
const userSchema = new Schema({
username: {
const UserSchema = new mongoose.Schema({
email: {
type: String,
unique: true
required: [true, "Email is required"],
unique: true,
match: [EMAIL_PATTERN, "Email is invalid"],
trim: true,
lowercase: true,
},
password: String
password: {
type: String,
required: true,
minLength: [8, "Password must be 8 characters or longer"],
}
});

const User = model("User", userSchema);
UserSchema.pre("save", function (next) {
const user = this;

if (user.isModified("password")) {
bcrypt.hash(user.password, 10).then((hash) => {
user.password = hash;
next();
});
} else {
next();
}
});

UserSchema.methods.checkPassword = function (password) {
return bcrypt.compare(password, this.password);
};

const User = mongoose.model("User", UserSchema);

module.exports = User;
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@
"dev": "nodemon server.js"
},
"dependencies": {
"bcrypt": "^5.1.1",
"connect-mongo": "^5.1.0",
"cookie-parser": "^1.4.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"express-session": "^1.18.1",
"hbs": "^4.1.1",
"mongoose": "^6.1.2",
"morgan": "^1.10.0",
Expand Down
Binary file added public/images/homer.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion public/stylesheets/style.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
body {
padding: 50px;

font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
}

Expand Down
8 changes: 0 additions & 8 deletions routes/index.js

This file was deleted.

24 changes: 24 additions & 0 deletions routes/routes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const router = require("express").Router();

const miscController = require("../controllers/misc.controller")
const authController = require("../controllers/auth.controller")
const authMiddleweares = require("../middlewares/auth.middleware")
const userController = require ("../controllers/user.controller")
/* GET home page */
router.get("/", miscController.home)

router.get("/register", authMiddleweares.isNoAutenticated, authController.register)
router.post("/register", authMiddleweares.isNoAutenticated, authController.doRegister)
router.get("/login", authMiddleweares.isNoAutenticated, authMiddleweares.isNoAutenticated, authController.login)
router.post("/login", authMiddleweares.isNoAutenticated, authController.doLogin)
router.get("/logout",authController.logout)
router.get("/main", authMiddleweares.isAutenticated, userController.profile)
router.get("/private", authMiddleweares.isAutenticated, userController.private)







module.exports = router;
30 changes: 30 additions & 0 deletions views/auth/login.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<div class="container">
<h2 class="mt-5">Iniciar Sesión</h2>
<form action="/login" method="POST">
<div class="form-group">
<label for="email">Correo Electrónico</label>
<input
type="email"
class="form-control"
id="email"
name="email"
value="{{errors.email}}"
required
/>
</div>
<div class="form-group">
<label for="password">Contraseña</label>
<input
type="password"
class="form-control"
id="password"
name="password"
required
/>
</div>
<div class="mb-3">
<small class="text-danger">{{errors.error}}</small>
</div>
<button type="submit" class="btn btn-primary">Iniciar Sesión</button>
</form>
</div>
Loading