Skip to content

Add sarafurd #157

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

Closed
wants to merge 1 commit into from
Closed
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
31 changes: 16 additions & 15 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
})

console.log(`MongoDB Connected: ${conn.connection.host}`)
} catch (err) {
console.error(err)
process.exit(1)
}
//connectDB function
const connectDB = async() => {
try {
const conn = await mongoose.connect(process.env.DB_STRING, {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
useCreateIndex: true
})
//Telling the user that they're connected to the MongoDB
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.' })
})
})
}))

//helps with signing in
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))
})
}
125 changes: 66 additions & 59 deletions controllers/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,95 +2,102 @@ const passport = require('passport')
const validator = require('validator')
const User = require('../models/User')

exports.getLogin = (req, res) => {
//moves to the login
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) => {
}

//checks the info in the 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.' })

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) => {
}

//Logouts the user
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) => {
}

//either creates an account or moves to todos
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) => {
}

//makes the account
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')
})
})
})
})
}
}
63 changes: 40 additions & 23 deletions controllers/todos.js
Original file line number Diff line number Diff line change
@@ -1,55 +1,72 @@
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 {
//todoItems = Todo find userId
const todoItems = await Todo.find({ userId: req.user.id })
//itemsLeft = Todo countDocuments userId and completed set to false
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 {
// Todo created with body, userId, and completed set to false
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 {
//Todo finds the id
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 {
//Todo finds the id
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)=>{
get markIncomplete() {
return this._markIncomplete
},
set markIncomplete(value) {
this._markIncomplete = value
},
//deleteTodo function
deleteTodo: async(req, res) => {
console.log(req.body.todoIdFromJSFile)
try{
await Todo.findOneAndDelete({_id:req.body.todoIdFromJSFile})
try {
//finds the id and deletes the todo
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')

//Todo variables
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