Skip to content

comments #153

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
node_modules
.vscode/*
.vscode/*
.env
2 changes: 0 additions & 2 deletions config/.env

This file was deleted.

4 changes: 2 additions & 2 deletions config/database.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ const mongoose = require('mongoose')

const connectDB = async () => {
try {
const conn = await mongoose.connect(process.env.DB_STRING, {
const conn = await mongoose.connect(process.env.DB_STRING, { //awaits connection
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
useCreateIndex: true
})

console.log(`MongoDB Connected: ${conn.connection.host}`)
console.log(`MongoDB Connected: ${conn.connection.host}`) //logs success
} catch (err) {
console.error(err)
process.exit(1)
Expand Down
57 changes: 30 additions & 27 deletions controllers/auth.js
Original file line number Diff line number Diff line change
@@ -1,54 +1,56 @@
const passport = require('passport')
const validator = require('validator')
const passport = require('passport') //auth
const validator = require('validator') // validator
const User = require('../models/User')

exports.getLogin = (req, res) => {
if (req.user) {
if (req.user) { //if session exists
return res.redirect('/todos')
}
res.render('login', {
res.render('login', //if it doesnt render login.ejs
{
title: 'Login'
})
}

exports.postLogin = (req, res, next) => {
const validationErrors = []
if (!validator.isEmail(req.body.email)) validationErrors.push({ msg: 'Please enter a valid email address.' })
if (validator.isEmpty(req.body.password)) validationErrors.push({ msg: 'Password cannot be blank.' })
const validationErrors = [] //error array
if (!validator.isEmail(req.body.email)) validationErrors.push({ msg: 'Please enter a valid email address.' }) //if its not a valid email push error
if (validator.isEmpty(req.body.password)) validationErrors.push({ msg: 'Password cannot be blank.' }) //if pass is empty push message

if (validationErrors.length) {
req.flash('errors', validationErrors)
return res.redirect('/login')
if (validationErrors.length) { //if there is something in the validator array
req.flash('errors', validationErrors) //I assume this makes the messages appear
return res.redirect('/login') //returns to login
}
req.body.email = validator.normalizeEmail(req.body.email, { gmail_remove_dots: false })
req.body.email = validator.normalizeEmail(req.body.email, { gmail_remove_dots: false }) //normalizes email

passport.authenticate('local', (err, user, info) => {
passport.authenticate('local', (err, user, info) => { // I assume user comes from req and its passed by the authenticate function
if (err) { return next(err) }
if (!user) {
req.flash('errors', info)
req.flash('errors', info) //if it doesnt find the user
return res.redirect('/login')
}
req.logIn(user, (err) => {
if (err) { return next(err) }
req.flash('success', { msg: 'Success! You are logged in.' })
if (err) { return next(err) } // case of an error
req.flash('success', { msg: 'Success! You are logged in.' }) //seems like its not do anything
res.redirect(req.session.returnTo || '/todos')
})
})(req, res, next)
})(req, res, next) //exceutes the function
}

exports.logout = (req, res) => {
req.logout(() => {
console.log('User has logged out.')
})
req.session.destroy((err) => {
})
//logouts ( not really sure what this does probably change the req body or res body) does nothing if taken out
req.session.destroy((err) => { //destroys sessions i think this does something to the cookies
if (err) console.log('Error : Failed to destroy the session during logout.', err)
req.user = null
res.redirect('/')
})
}

exports.getSignup = (req, res) => {
if (req.user) {
if (req.user) { // if req has a session goes to dashboard
return res.redirect('/todos')
}
res.render('signup', {
Expand All @@ -58,16 +60,17 @@ const User = require('../models/User')

exports.postSignup = (req, res, next) => {
const validationErrors = []
if (!validator.isEmail(req.body.email)) validationErrors.push({ msg: 'Please enter a valid email address.' })
if (!validator.isLength(req.body.password, { min: 8 })) validationErrors.push({ msg: 'Password must be at least 8 characters long' })
if (req.body.password !== req.body.confirmPassword) validationErrors.push({ msg: 'Passwords do not match' })
if (!validator.isEmail(req.body.email)) validationErrors.push({ msg: 'Please enter a valid email address.' }) //validates email
if (!validator.isLength(req.body.password, { min: 8 })) validationErrors.push({ msg: 'Password must be at least 8 characters long' }) //min characters
if (req.body.password !== req.body.confirmPassword) validationErrors.push({ msg: 'Passwords do not match' })

if (validationErrors.length) {
if (validationErrors.length) { //if we have errors we have to redirect to the same page
req.flash('errors', validationErrors)
return res.redirect('../signup')
return res.redirect('/signup')
}
req.body.email = validator.normalizeEmail(req.body.email, { gmail_remove_dots: false })

//creates a new user
const user = new User({
userName: req.body.userName,
email: req.body.email,
Expand All @@ -80,11 +83,11 @@ const User = require('../models/User')
]}, (err, existingUser) => {
if (err) { return next(err) }
if (existingUser) {
req.flash('errors', { msg: 'Account with that email address or username already exists.' })
return res.redirect('../signup')
req.flash('errors', { msg: 'Account with that email address or username already exists.' }) //flashes if email or username is taken
return res.redirect('../signup')
}
user.save((err) => {
if (err) { return next(err) }
if (err) { return next(err) } //saves the user on atlas
req.logIn(user, (err) => {
if (err) {
return next(err)
Expand Down
11 changes: 8 additions & 3 deletions controllers/todos.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const Todo = require('../models/Todo')

module.exports = {
getTodos: async (req,res)=>{
getTodos: async (req,res)=>{ //gets the info and renders de dashboard
console.log(req.user)
try{
const todoItems = await Todo.find({userId:req.user.id})
Expand All @@ -11,9 +11,14 @@ module.exports = {
console.log(err)
}
},
createTodo: async (req, res)=>{
createTodo: async (req, res)=>{ //creates a new document and redirects
try{
await Todo.create({todo: req.body.todoItem, completed: false, userId: req.user.id})
await Todo.create(
{todo: req.body.todoItem,
completed: false,
userId: req.user.id,
priority: req.body.todoPriority
})
console.log('Todo has been added!')
res.redirect('/todos')
}catch(err){
Expand Down
2 changes: 1 addition & 1 deletion middleware/auth.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module.exports = {
ensureAuth: function (req, res, next) {
ensureAuth: function (req, res, next) { //checks if the req/user is authenticated
if (req.isAuthenticated()) {
return next()
} else {
Expand Down
4 changes: 4 additions & 0 deletions models/Todo.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ const TodoSchema = new mongoose.Schema({
userId: {
type: String,
required: true
},
priority: {
type: Number,
required: false
}
})

Expand Down
3 changes: 2 additions & 1 deletion models/User.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ const UserSchema = new mongoose.Schema({


// Password hash middleware.

//hashes the password before saving it
// I suspect this runs before saving the password
UserSchema.pre('save', function save(next) {
const user = this
if (!user.isModified('password')) { return next() }
Expand Down
5 changes: 4 additions & 1 deletion public/css/style.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
*{
background: grey;
}
h1{
color: red;
}
Expand All @@ -7,4 +10,4 @@ h1{
}
.not{
text-decoration: underline;
}
}
4 changes: 2 additions & 2 deletions public/js/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ async function deleteTodo(){
}

async function markComplete(){
const todoId = this.parentNode.dataset.id
const todoId = this.parentNode.dataset.id //takes id from the li
try{
const response = await fetch('todos/markComplete', {
method: 'put',
Expand All @@ -44,7 +44,7 @@ async function markComplete(){
})
const data = await response.json()
console.log(data)
location.reload()
location.reload() // reloads page
}catch(err){
console.log(err)
}
Expand Down
5 changes: 4 additions & 1 deletion routes/main.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
//create router
const express = require('express')
const router = express.Router()

//controller
const authController = require('../controllers/auth')
const homeController = require('../controllers/home')
const { ensureAuth, ensureGuest } = require('../middleware/auth')

router.get('/', homeController.getIndex)
router.get('/', homeController.getIndex)
router.get('/login', authController.getLogin)
router.post('/login', authController.postLogin)
router.get('/logout', authController.logout)
Expand Down
3 changes: 3 additions & 0 deletions routes/todos.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
//creates router
const express = require('express')
const router = express.Router()


const todosController = require('../controllers/todos')
const { ensureAuth } = require('../middleware/auth')

Expand Down
38 changes: 23 additions & 15 deletions server.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,35 @@
//creates app
const express = require('express')
const app = express()
const mongoose = require('mongoose')
const passport = require('passport')
const session = require('express-session')
const MongoStore = require('connect-mongo')(session)
const flash = require('express-flash')
const logger = require('morgan')
const connectDB = require('./config/database')

//dependencies
const mongoose = require('mongoose') // db connection
const passport = require('passport') // auth
const session = require('express-session') // allows you to store the session
const MongoStore = require('connect-mongo')(session) // allows you to store the session
const flash = require('express-flash')
const logger = require('morgan') // logs every request
const connectDB = require('./config/database') // connectDB function

//routes
const mainRoutes = require('./routes/main')
const todoRoutes = require('./routes/todos')

//allows me to use env variables
require('dotenv').config({path: './config/.env'})

// Passport config
require('./config/passport')(passport)

connectDB()
connectDB() // connects to DB

//middleware
app.set('view engine', 'ejs') // view engine
app.use(express.static('public')) //public folder
app.use(express.urlencoded({ extended: true })) //parses request
app.use(express.json()) //json parser
app.use(logger('dev')) // uses morgan

app.set('view engine', 'ejs')
app.use(express.static('public'))
app.use(express.urlencoded({ extended: true }))
app.use(express.json())
app.use(logger('dev'))
// Sessions
app.use(
session({
Expand All @@ -36,11 +44,11 @@ app.use(
app.use(passport.initialize())
app.use(passport.session())

app.use(flash())
app.use(flash()) // allows for poping showing elements

app.use('/', mainRoutes)
app.use('/todos', todoRoutes)

app.listen(process.env.PORT, ()=>{
console.log('Server is running, you better catch it!')
console.log(`Server is running, you better catch it! PORT: ${process.env.PORT}`)
})
9 changes: 7 additions & 2 deletions views/login.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,21 @@
<title>Document</title>
</head>
<body>
<% if (locals.messages.errors) { %>
<% if (locals.messages.errors) { %> //email or pass not valid
<% messages.errors.forEach( el => { %>
<div class="alert alert-danger"><%= el.msg %></div>
<% }) %>
<% } %>
<% if (locals.messages.info) { %>
<% if (locals.messages.info) { %> //not found email
<% messages.info.forEach( el => { %>
<div class="alert alert-danger"><%= el.msg %></div>
<% }) %>
<% } %>
<% if (locals.messages.success) { %> //not found email
<% messages.success .forEach( el => { %>
<div class="alert alert-danger"><%= el.msg %></div>
<% }) %>
<% } %>
<form action="/login" method="POST">
<input type="email" name="email" placeholder="Email">
<input type="password" name="password" placeholder="Password">
Expand Down
5 changes: 4 additions & 1 deletion views/todos.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
<ul>
<% todos.forEach( el => { %>
<li class='todoItem' data-id='<%=el._id%>'>
<span class='<%= el.completed === true ? 'completed' : 'not'%>'><%= el.todo %></span>
<span class='<%= el.completed === true ? 'completed' : 'not'%>'> <%= el.todo %>
</span>
<span> <%= !el.priority ? '' : el.priority %> </span>
<span class='del'> Delete </span>
</li>
<% }) %>
Expand All @@ -22,6 +24,7 @@

<form action="/todos/createTodo" method='POST'>
<input type="text" placeholder="Enter Todo Item" name='todoItem'>
<input type="number" placeholder="0" name='todoPriority'>
<input type="submit">
</form>

Expand Down