Skip to content
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

Add sarafurd #158

Open
wants to merge 1 commit 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
29 changes: 15 additions & 14 deletions config/database.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
const mongoose = require('mongoose')

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

console.log(`MongoDB Connected: ${conn.connection.host}`)
} catch (err) {
console.error(err)
process.exit(1)
}
console.log(`MongoDB Connected: ${conn.connection.host}`)
} catch (err) {
console.error(err)
process.exit(1)
}
}

module.exports = connectDB
module.exports = connectDB
55 changes: 28 additions & 27 deletions config/passport.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,33 @@ const LocalStrategy = require('passport-local').Strategy
const mongoose = require('mongoose')
const User = require('../models/User')

module.exports = function (passport) {
passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
User.findOne({ email: email.toLowerCase() }, (err, user) => {
if (err) { return done(err) }
if (!user) {
return done(null, false, { msg: `Email ${email} not found.` })
}
if (!user.password) {
return done(null, false, { msg: 'Your account was registered using a sign-in provider. To enable password login, sign in using a provider, and then set a password under your user profile.' })
}
user.comparePassword(password, (err, isMatch) => {
if (err) { return done(err) }
if (isMatch) {
return done(null, user)
}
return done(null, false, { msg: 'Invalid email or password.' })
})
})
}))

//manages the password responsibilities
module.exports = function(passport) {
passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
User.findOne({ email: email.toLowerCase() }, (err, user) => {
if (err) { return done(err) }
if (!user) {
return done(null, false, { msg: `Email ${email} not found.` })
}
if (!user.password) {
return done(null, false, { msg: 'Your account was registered using a sign-in provider. To enable password login, sign in using a provider, and then set a password under your user profile.' })
}
user.comparePassword(password, (err, isMatch) => {
if (err) { return done(err) }
if (isMatch) {
return done(null, user)
}
return done(null, false, { msg: 'Invalid email or password.' })
})
})
}))


passport.serializeUser((user, done) => {
done(null, user.id)
})
passport.serializeUser((user, done) => {
done(null, user.id)
})

passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => done(err, user))
})
}
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => done(err, user))
})
}
122 changes: 63 additions & 59 deletions controllers/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,95 +2,99 @@ const passport = require('passport')
const validator = require('validator')
const User = require('../models/User')

exports.getLogin = (req, res) => {
//works on the login and signup code

exports.getLogin = (req, res) => {
if (req.user) {
return res.redirect('/todos')
return res.redirect('/todos')
}
res.render('login', {
title: 'Login'
title: 'Login'
})
}
exports.postLogin = (req, res, next) => {
}

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.' })

if (validationErrors.length) {
req.flash('errors', validationErrors)
return res.redirect('/login')
req.flash('errors', validationErrors)
return res.redirect('/login')
}
req.body.email = validator.normalizeEmail(req.body.email, { gmail_remove_dots: false })

passport.authenticate('local', (err, user, info) => {
if (err) { return next(err) }
if (!user) {
req.flash('errors', info)
return res.redirect('/login')
}
req.logIn(user, (err) => {
if (err) { return next(err) }
req.flash('success', { msg: 'Success! You are logged in.' })
res.redirect(req.session.returnTo || '/todos')
})
if (!user) {
req.flash('errors', info)
return res.redirect('/login')
}
req.logIn(user, (err) => {
if (err) { return next(err) }
req.flash('success', { msg: 'Success! You are logged in.' })
res.redirect(req.session.returnTo || '/todos')
})
})(req, res, next)
}
exports.logout = (req, res) => {
}

exports.logout = (req, res) => {
req.logout(() => {
console.log('User has logged out.')
console.log('User has logged out.')
})
req.session.destroy((err) => {
if (err) console.log('Error : Failed to destroy the session during logout.', err)
req.user = null
res.redirect('/')
if (err) console.log('Error : Failed to destroy the session during logout.', err)
req.user = null
res.redirect('/')
})
}
exports.getSignup = (req, res) => {
}

exports.getSignup = (req, res) => {
if (req.user) {
return res.redirect('/todos')
return res.redirect('/todos')
}
res.render('signup', {
title: 'Create Account'
title: 'Create Account'
})
}
exports.postSignup = (req, res, next) => {
}

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 (validationErrors.length) {
req.flash('errors', validationErrors)
return res.redirect('../signup')
req.flash('errors', validationErrors)
return res.redirect('../signup')
}
req.body.email = validator.normalizeEmail(req.body.email, { gmail_remove_dots: false })

const user = new User({
userName: req.body.userName,
email: req.body.email,
password: req.body.password
userName: req.body.userName,
email: req.body.email,
password: req.body.password
})

User.findOne({$or: [
{email: req.body.email},
{userName: req.body.userName}
]}, (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')
}
user.save((err) => {

User.findOne({
$or: [
{ email: req.body.email },
{ userName: req.body.userName }
]
}, (err, existingUser) => {
if (err) { return next(err) }
req.logIn(user, (err) => {
if (err) {
return next(err)
}
res.redirect('/todos')
if (existingUser) {
req.flash('errors', { msg: 'Account with that email address or username already exists.' })
return res.redirect('../signup')
}
user.save((err) => {
if (err) { return next(err) }
req.logIn(user, (err) => {
if (err) {
return next(err)
}
res.redirect('/todos')
})
})
})
})
}
}
51 changes: 28 additions & 23 deletions controllers/todos.js
Original file line number Diff line number Diff line change
@@ -1,55 +1,60 @@
const Todo = require('../models/Todo')

module.exports = {
getTodos: async (req,res)=>{
//getTodos function
getTodos: async(req, res) => {
console.log(req.user)
try{
const todoItems = await Todo.find({userId:req.user.id})
const itemsLeft = await Todo.countDocuments({userId:req.user.id,completed: false})
res.render('todos.ejs', {todos: todoItems, left: itemsLeft, user: req.user})
}catch(err){
try {
const todoItems = await Todo.find({ userId: req.user.id })
const itemsLeft = await Todo.countDocuments({ userId: req.user.id, completed: false })
res.render('todos.ejs', { todos: todoItems, left: itemsLeft, user: req.user })
} catch (err) {
console.log(err)
}
},
createTodo: async (req, res)=>{
try{
await Todo.create({todo: req.body.todoItem, completed: false, userId: req.user.id})
//createTodo function
createTodo: async(req, res) => {
try {
await Todo.create({ todo: req.body.todoItem, completed: false, userId: req.user.id })
console.log('Todo has been added!')
res.redirect('/todos')
}catch(err){
} catch (err) {
console.log(err)
}
},
markComplete: async (req, res)=>{
try{
await Todo.findOneAndUpdate({_id:req.body.todoIdFromJSFile},{
//markComplete function
markComplete: async(req, res) => {
try {
await Todo.findOneAndUpdate({ _id: req.body.todoIdFromJSFile }, {
completed: true
})
console.log('Marked Complete')
res.json('Marked Complete')
}catch(err){
} catch (err) {
console.log(err)
}
},
markIncomplete: async (req, res)=>{
try{
await Todo.findOneAndUpdate({_id:req.body.todoIdFromJSFile},{
//markIncomplete function
markIncomplete: async(req, res) => {
try {
await Todo.findOneAndUpdate({ _id: req.body.todoIdFromJSFile }, {
completed: false
})
console.log('Marked Incomplete')
res.json('Marked Incomplete')
}catch(err){
} catch (err) {
console.log(err)
}
},
deleteTodo: async (req, res)=>{
//deleteTodo function
deleteTodo: async(req, res) => {
console.log(req.body.todoIdFromJSFile)
try{
await Todo.findOneAndDelete({_id:req.body.todoIdFromJSFile})
try {
await Todo.findOneAndDelete({ _id: req.body.todoIdFromJSFile })
console.log('Deleted Todo')
res.json('Deleted It')
}catch(err){
} catch (err) {
console.log(err)
}
}
}
}
27 changes: 14 additions & 13 deletions models/Todo.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
const mongoose = require('mongoose')

//TodoSchema
const TodoSchema = new mongoose.Schema({
todo: {
type: String,
required: true,
},
completed: {
type: Boolean,
required: true,
},
userId: {
type: String,
required: true
}
todo: {
type: String,
required: true,
},
completed: {
type: Boolean,
required: true,
},
userId: {
type: String,
required: true
}
})

module.exports = mongoose.model('Todo', TodoSchema)
module.exports = mongoose.model('Todo', TodoSchema)
Loading