add eslint, fix bugs found

This commit is contained in:
Wingy 2020-11-08 16:54:08 -05:00
parent fc2c3a7114
commit 12558d3384
28 changed files with 1774 additions and 745 deletions

View file

@ -1,31 +1,30 @@
const verifyAuth = require('../../middlewares/verifyAuth');
const bcrypt = require('bcrypt-nodejs');
const express = require('express');
const verifyAuth = require('../../middlewares/verifyAuth')
const express = require('express')
const { nanoid } = require('nanoid')
const SECRET_TOKEN_LENGTH = 32
const SECRET_TOKEN_LIFETIME =
// One week, approximately. Doesn't need to be perfect.
1000 // milliseconds
* 60 // seconds
* 60 // minutes
* 24 // hours
* 07 // days
1000 * // milliseconds
60 * // seconds
60 * // minutes
24 * // hours
7 // days
module.exports = (db) => {
const router = express.Router();
const router = express.Router()
router.get('/', verifyAuth(), (req, res) => {
if (!req.user.admin) return res.redirect('/');
if (!req.user.admin) return res.redirect('/')
db.allDocs({ include_docs: true })
.then(docs => {
res.render('adminSettings', { title: 'Admin Settings', users: docs.rows })
})
.catch(err => { throw err; });
});
.catch(err => { throw err })
})
router.post('/add', verifyAuth(), async (req, res) => {
if (!req.user.admin) return res.redirect('/');
if (!req.user.admin) return res.redirect('/')
await db.put({
_id: req.body.newUserUsername.trim(),
admin: false,
@ -33,44 +32,44 @@ module.exports = (db) => {
signupToken: nanoid(SECRET_TOKEN_LENGTH),
expiry: new Date().getTime() + SECRET_TOKEN_LIFETIME
});
})
res.redirect(`/admin-settings/edit/${req.body.newUserUsername.trim()}`)
});
})
router.get('/edit/:userToEdit', verifyAuth(), async (req, res) => {
if (!req.user.admin) return res.redirect('/');
if (!req.user.admin) return res.redirect('/')
const doc = await db.get(req.params.userToEdit)
delete doc.password
res.render('admin-user-edit', { user: doc });
});
res.render('admin-user-edit', { user: doc })
})
router.post('/edit/refresh-signup-token/:userToEdit', verifyAuth(), async (req, res) => {
if (!req.user.admin) return res.redirect('/');
if (!req.user.admin) return res.redirect('/')
const doc = await db.get(req.params.userToEdit)
doc.signupToken = nanoid(SECRET_TOKEN_LENGTH)
doc.expiry = new Date().getTime() + SECRET_TOKEN_LIFETIME
await db.put(doc)
return res.redirect(`/admin-settings/edit/${req.params.userToEdit}`)
});
})
router.post('/edit/resetpw/:userToEdit', verifyAuth(), async (req, res) => {
if (!req.user.admin) return res.redirect('/');
if (!req.user.admin) return res.redirect('/')
const doc = await db.get(req.params.userToEdit)
doc.pwToken = nanoid(SECRET_TOKEN_LENGTH)
doc.pwExpiry = new Date().getTime() + SECRET_TOKEN_LIFETIME
await db.put(doc)
return res.redirect(`/admin-settings/edit/${req.params.userToEdit}`)
});
})
router.post('/edit/cancelresetpw/:userToEdit', verifyAuth(), async (req, res) => {
if (!req.user.admin) return res.redirect('/');
if (!req.user.admin) return res.redirect('/')
const doc = await db.get(req.params.userToEdit)
delete doc.pwToken
delete doc.pwExpiry
await db.put(doc)
return res.redirect(`/admin-settings/edit/${req.params.userToEdit}`)
});
})
router.post('/edit/rename/:userToRename', verifyAuth(), async (req, res) => {
if (!req.user.admin && req.user._id !== req.params.userToRename) return res.redirect('/')
@ -104,7 +103,7 @@ module.exports = (db) => {
await db.bulkDocs(usersBulk)
await db.remove(await db.get(oldName))
await req.flash('success', 'Renamed user!')
return res.redirect(`/wishlist/${newName}`)
} catch (error) {
@ -119,7 +118,7 @@ module.exports = (db) => {
})
router.post('/edit/impersonate/:userToEdit', verifyAuth(), async (req, res) => {
if (!req.user.admin) return res.redirect('/');
if (!req.user.admin) return res.redirect('/')
req.login({ _id: req.params.userToEdit }, err => {
if (err) {
req.flash('error', err.message)
@ -128,29 +127,29 @@ module.exports = (db) => {
req.flash('success', `You are now ${req.params.userToEdit}.`)
res.redirect('/')
})
});
})
router.post('/edit/remove/:userToRemove', verifyAuth(), async (req, res) => {
if (!req.user.admin) return res.redirect('/');
const doc = await db.get(req.params.userToRemove);
if (!req.user.admin) return res.redirect('/')
const doc = await db.get(req.params.userToRemove)
if (doc.admin) {
req.flash('error', 'Failed to remove: user is admin.');
return res.redirect('/admin-settings');
req.flash('error', 'Failed to remove: user is admin.')
return res.redirect('/admin-settings')
}
await db.remove(doc);
const docs = await db.allDocs({ include_docs: true });
for (let i = 0; i < docs.length; i++) {
for (let j = 0; j < docs[i].doc.wishlist.length; j++) {
if (docs[i].doc.wishlist[j].pledgedBy === req.params.userToRemove) {
docs[i].doc.wishlist[j].pledgedBy === undefined;
if (docs[i].doc.wishlist[j].addedBy === req.params.userToRemove) await db.remove(doc);
else await db.put(docs[i].doc);
await db.remove(doc)
const { rows } = await db.allDocs({ include_docs: true })
for (let i = 0; i < rows.length; i++) {
for (let j = 0; j < rows[i].doc.wishlist.length; j++) {
if (rows[i].doc.wishlist[j].pledgedBy === req.params.userToRemove) {
rows[i].doc.wishlist[j].pledgedBy = undefined
if (rows[i].doc.wishlist[j].addedBy === req.params.userToRemove) rows[i].doc.wishlist.splice(j, 1)
await db.put(rows[i].doc)
}
}
}
req.flash('success', `Successfully removed user ${req.params.userToRemove}`);
req.flash('success', `Successfully removed user ${req.params.userToRemove}`)
res.redirect('/admin-settings')
});
})
return router;
};
return router
}

View file

@ -1,9 +1,8 @@
const verifyAuth = require('../../middlewares/verifyAuth');
const express = require('express');
const path = require('path');
const verifyAuth = require('../../middlewares/verifyAuth')
const express = require('express')
module.exports = ({ db, config }) => {
const router = express.Router();
const router = express.Router()
router.use(verifyAuth())
@ -13,7 +12,7 @@ module.exports = ({ db, config }) => {
})
})
router.use('/wishlist', require('./wishlist')({ db }));
router.use('/wishlist', require('./wishlist')({ db }))
return router;
}
return router
}

View file

@ -1,8 +1,6 @@
const verifyAuth = require('../../../middlewares/verifyAuth')
const express = require('express')
const path = require('path')
module.exports = ({ db, config }) => {
module.exports = ({ db }) => {
const router = express.Router()
router.get('/', (req, res) => {
@ -19,12 +17,12 @@ module.exports = ({ db, config }) => {
if (req.params.direction === 'up') wishlist.reverse()
let moveFromIndex
wishlist.forEach(wish => {
if (wish.id === req.params.id) return moveFromIndex = wishlist.indexOf(wish)
if (wish.id === req.params.id) moveFromIndex = wishlist.indexOf(wish)
})
const moveToIndex = wishlist.findIndex(wish => {
return ( wishlist.indexOf(wish) > moveFromIndex && wish.addedBy === req.user._id )
return (wishlist.indexOf(wish) > moveFromIndex && wish.addedBy === req.user._id)
})
if (moveToIndex < 0 || moveToIndex > wishlist.length) return res.send({ error: 'Invalid move '})
if (moveToIndex < 0 || moveToIndex > wishlist.length) return res.send({ error: 'Invalid move ' })
const original = wishlist[moveToIndex]
wishlist[moveToIndex] = wishlist[moveFromIndex]
wishlist[moveFromIndex] = original
@ -39,4 +37,4 @@ module.exports = ({ db, config }) => {
})
return router
}
}

View file

@ -1,8 +1,8 @@
const bcrypt = require('bcrypt-nodejs');
const express = require('express');
const bcrypt = require('bcrypt-nodejs')
const express = require('express')
module.exports = (db) => {
const router = express.Router();
const router = express.Router()
router.get('/:code', async (req, res) => {
const row = (await db.allDocs({ include_docs: true }))
@ -10,7 +10,7 @@ module.exports = (db) => {
.find(({ doc }) => doc.signupToken === req.params.code)
res.render('confirm-account', { doc: row ? row.doc : undefined })
});
})
router.post('/:code', async (req, res) => {
const { doc } = (await db.allDocs({ include_docs: true }))
@ -20,7 +20,7 @@ module.exports = (db) => {
if (doc.expiry < new Date().getTime()) return res.redirect(`/confirm-account/${req.params.code}`)
bcrypt.hash(req.body.password, null, null, async (err, passwordHash) => {
if (err) throw err;
if (err) throw err
doc.password = passwordHash
delete doc.signupToken
@ -34,11 +34,11 @@ module.exports = (db) => {
req.flash('error', err.message)
return res.redirect('/')
}
req.flash('success', `Welcome to ${_CC.config.siteTitle}!`);
res.redirect('/');
req.flash('success', `Welcome to ${_CC.config.siteTitle}!`)
res.redirect('/')
})
});
});
})
})
return router;
};
return router
}

View file

@ -1,44 +1,44 @@
const verifyAuth = require('../middlewares/verifyAuth');
const express = require('express');
const path = require('path');
const verifyAuth = require('../middlewares/verifyAuth')
const express = require('express')
const path = require('path')
module.exports = ({ db, config }) => {
const router = express.Router();
const router = express.Router()
router.use('/', express.static(path.join(__dirname, '../static')));
router.use('/', express.static(path.join(__dirname, '../static')))
router.get('/',
async (req, res, next) => {
dbInfo = await db.info();
const dbInfo = await db.info()
if (dbInfo.doc_count === 0) {
res.redirect('/setup');
res.redirect('/setup')
} else {
next();
next()
}
},
verifyAuth(),
(req, res) => {
res.redirect('/wishlist');
res.redirect('/wishlist')
}
);
)
router.use('/api', require('./api')({ db }))
router.use('/setup', require('./setup')(db));
router.use('/setup', require('./setup')(db))
router.use('/login', require('./login')());
router.use('/logout', require('./logout')());
router.use('/resetpw', require('./resetpw')(db));
router.use('/confirm-account', require('./confirm-account')(db));
router.use('/login', require('./login')())
router.use('/logout', require('./logout')())
router.use('/resetpw', require('./resetpw')(db))
router.use('/confirm-account', require('./confirm-account')(db))
router.use('/wishlist', require('./wishlist')(db));
router.use('/wishlist', require('./wishlist')(db))
router.use('/supported-sites', require('./supported-sites')())
router.use('/profile', require('./profile')(db));
router.use('/profile', require('./profile')(db))
router.use('/admin-settings', require('./adminSettings')(db));
router.use('/admin-settings', require('./adminSettings')(db))
router.use('/manifest.json', require('./manifest.json')({ config }))
return router;
}
return router
}

View file

@ -1,29 +1,29 @@
const passport = require('passport');
const express = require('express');
const passport = require('passport')
const express = require('express')
module.exports = () => {
const router = express.Router();
const router = express.Router()
router.get('/',
(req, res) => {
if (req.isAuthenticated()) {
res.redirect('/');
res.redirect('/')
} else {
res.render('login');
res.render('login')
}
}
);
)
router.post(
'/',
(req, res, next) => {
next();
next()
},
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: 'Invalid username or password'
})
);
return router;
};
)
return router
}

View file

@ -1,14 +1,14 @@
const verifyAuth = require('../../middlewares/verifyAuth');
const express = require('express');
const verifyAuth = require('../../middlewares/verifyAuth')
const express = require('express')
module.exports = () => {
const router = express.Router();
const router = express.Router()
router.get('/', verifyAuth(), (req, res) => res.render('logout'));
router.get('/', verifyAuth(), (req, res) => res.render('logout'))
router.post('/', (req, res) => {
req.logout();
res.redirect('/');
});
req.logout()
res.redirect('/')
})
return router;
};
return router
}

View file

@ -1,7 +1,7 @@
const express = require('express');
const express = require('express')
module.exports = ({ config }) => {
const router = express.Router();
const router = express.Router()
router.get('/', (req, res) => {
res.send({
@ -19,7 +19,7 @@ module.exports = ({ config }) => {
}
]
})
});
})
return router;
};
return router
}

View file

@ -1,39 +1,39 @@
const verifyAuth = require('../../middlewares/verifyAuth');
const bcrypt = require('bcrypt-nodejs');
const express = require('express');
const verifyAuth = require('../../middlewares/verifyAuth')
const bcrypt = require('bcrypt-nodejs')
const express = require('express')
module.exports = (db) => {
const router = express.Router();
const router = express.Router()
router.get('/', verifyAuth(), (req, res) => res.render('profile', { title: `Profile Settings - ${req.user._id}`}));
router.get('/', verifyAuth(), (req, res) => res.render('profile', { title: `Profile Settings - ${req.user._id}` }))
router.post('/', verifyAuth(), (req, res) => {
if (req.body.oldPassword && req.body.newPassword) {
bcrypt.compare(req.body.oldPassword, req.user.password, (err, correct) => {
if (err) throw err;
if (err) throw err
if (correct) {
bcrypt.hash(req.body.newPassword, null, null, (err, hash) => {
if (err) throw err;
if (err) throw err
db.get(req.user._id)
.then(doc => {
doc.password = hash;
doc.password = hash
db.put(doc)
.then(() => {
req.flash('success', 'Changes saved successfully!');
res.redirect('/profile');
req.flash('success', 'Changes saved successfully!')
res.redirect('/profile')
})
.catch(err => { throw err; });
.catch(err => { throw err })
})
.catch(err => { throw err; });
});
.catch(err => { throw err })
})
} else {
req.flash('error', 'Incorrect old password');
res.redirect('/profile');
req.flash('error', 'Incorrect old password')
res.redirect('/profile')
}
});
})
} else {
res.redirect('/profile');
res.redirect('/profile')
}
});
})
return router;
};
return router
}

View file

@ -1,17 +1,16 @@
const bcrypt = require('bcrypt-nodejs');
const express = require('express');
const bcrypt = require('bcrypt-nodejs')
const express = require('express')
module.exports = (db) => {
const router = express.Router();
const router = express.Router()
router.get('/:code', async (req, res) => {
const row = (await db.allDocs({ include_docs: true }))
.rows
.find(({ doc }) => doc.pwToken === req.params.code)
res.render('resetpw', { doc: row ? row.doc : undefined })
});
})
router.post('/:code', async (req, res) => {
const { doc } = (await db.allDocs({ include_docs: true }))
@ -21,7 +20,7 @@ module.exports = (db) => {
if (doc.expiry < new Date().getTime()) return res.redirect(`/resetpw/${req.params.code}`)
bcrypt.hash(req.body.password, null, null, async (err, passwordHash) => {
if (err) throw err;
if (err) throw err
doc.password = passwordHash
delete doc.pwToken
@ -35,11 +34,11 @@ module.exports = (db) => {
req.flash('error', err.message)
return res.redirect('/')
}
req.flash('success', `Welcome to ${_CC.config.siteTitle}!`);
res.redirect('/');
req.flash('success', `Welcome to ${_CC.config.siteTitle}!`)
res.redirect('/')
})
});
});
})
})
return router;
};
return router
}

View file

@ -1,39 +1,39 @@
const bcrypt = require('bcrypt-nodejs')
const express = require('express');
const express = require('express')
module.exports = (db) => {
const router = express.Router();
const router = express.Router()
router.get('/',
async (req, res) => {
const dbInfo = await db.info();
const dbInfo = await db.info()
if (dbInfo.doc_count === 0) {
res.render('setup', { title: 'Setup' });
res.render('setup', { title: 'Setup' })
} else {
res.redirect('/');
res.redirect('/')
}
}
);
)
router.post('/',
async (req, res) => {
const dbInfo = await db.info();
const dbInfo = await db.info()
if (dbInfo.doc_count === 0) {
bcrypt.hash(req.body.adminPassword, null, null, (err, adminPasswordHash) => {
if (err) throw err;
if (err) throw err
db.put({
_id: req.body.adminUsername.trim(),
password: adminPasswordHash,
admin: true,
wishlist: []
})
res.redirect('/');
});
res.redirect('/')
})
} else {
res.redirect('/');
res.redirect('/')
}
}
);
)
return router;
}
return router
}

View file

@ -8,4 +8,4 @@ module.exports = () => {
})
return router
}
}

View file

@ -1,18 +1,18 @@
const verifyAuth = require('../../middlewares/verifyAuth');
const getProductName = require('get-product-name');
const express = require('express');
const config = require('../../config');
const verifyAuth = require('../../middlewares/verifyAuth')
const getProductName = require('get-product-name')
const express = require('express')
const config = require('../../config')
const u64 = require('u64')
const totals = wishlist => {
let unpledged = 0;
let pledged = 0;
let unpledged = 0
let pledged = 0
wishlist.forEach(wishItem => {
if (wishItem.pledgedBy) pledged += 1;
else unpledged += 1;
});
return { unpledged, pledged };
};
if (wishItem.pledgedBy) pledged += 1
else unpledged += 1
})
return { unpledged, pledged }
}
const ValidURL = (string) => { // Ty SO
try {
@ -20,40 +20,40 @@ const ValidURL = (string) => { // Ty SO
if (process.env.SMILE !== 'false') {
if (url.hostname === 'www.amazon.com') url.hostname = 'smile.amazon.com'
}
if (url) return url;
if (url) return url
} catch (_) {
return false;
return false
}
}
module.exports = (db) => {
const router = express.Router();
const router = express.Router()
router.get('/', verifyAuth(), async (req, res) => {
const docs = await db.allDocs({ include_docs: true })
if (process.env.SINGLE_LIST === 'true') {
for (row of docs.rows) {
for (const row of docs.rows) {
if (row.doc.admin) return res.redirect(`/wishlist/${row.doc._id}`)
}
}
res.render('wishlists', { title: 'Wishlists', users: docs.rows, totals})
});
res.render('wishlists', { title: 'Wishlists', users: docs.rows, totals })
})
router.get('/:user', verifyAuth(), async (req, res) => {
try {
const dbUser = await db.get(req.params.user);
const dbUser = await db.get(req.params.user)
if (process.env.SINGLE_LIST === 'true') {
if (!dbUser.admin) {
const docs = await db.allDocs({ include_docs: true })
for (row of docs.rows) {
for (const row of docs.rows) {
if (row.doc.admin) return res.redirect(`/wishlist/${row.doc._id}`)
}
}
}
const firstCanSee = dbUser.wishlist.findIndex(element => (element.addedBy === req.params.user));
const wishlistReverse = [...dbUser.wishlist].reverse();
const lastCanSeeValue = wishlistReverse.find(element => (element.addedBy === req.params.user));
const lastCanSee = dbUser.wishlist.indexOf(lastCanSeeValue);
const firstCanSee = dbUser.wishlist.findIndex(element => (element.addedBy === req.params.user))
const wishlistReverse = [...dbUser.wishlist].reverse()
const lastCanSeeValue = wishlistReverse.find(element => (element.addedBy === req.params.user))
const lastCanSee = dbUser.wishlist.indexOf(lastCanSeeValue)
res.render('wishlist', {
title: `Wishlist - ${dbUser._id}`,
wishlist: [
@ -62,40 +62,40 @@ module.exports = (db) => {
],
firstCanSee,
lastCanSee
});
})
} catch (error) {
req.flash('error', error);
return res.redirect('/wishlist');
req.flash('error', error)
return res.redirect('/wishlist')
}
});
})
router.post('/:user', verifyAuth(), async (req, res) => {
if (!req.body.itemUrlOrName) {
req.flash('error', 'Item URL or Name is required')
return res.redirect(`/wishlist/${req.params.user}`)
}
const potentialUrl = req.body.itemUrlOrName.split(' ').pop();
const url = ValidURL(potentialUrl);
const item = {};
let productData;
const potentialUrl = req.body.itemUrlOrName.split(' ').pop()
const url = ValidURL(potentialUrl)
const item = {}
let productData
try {
if (url) productData = await getProductName(url, config.proxyServer);
if (url) productData = await getProductName(url, config.proxyServer)
} catch (err) {
req.flash('error', err.toString());
req.flash('error', err.toString())
}
item.name = (productData ? productData.name : '');
item.name = (productData ? productData.name : '')
item.price = productData?.price
item.image = productData?.image
item.addedBy = req.user._id;
item.pledgedBy = (req.user._id === req.params.user ? undefined : req.user._id);
item.note = req.body.note;
if (url) item.url = url;
item.addedBy = req.user._id
item.pledgedBy = (req.user._id === req.params.user ? undefined : req.user._id)
item.note = req.body.note
if (url) item.url = url
if (!url) item.name = req.body.itemUrlOrName
item.id = u64.encode(new Date().getTime().toString());
const doc = await db.get(req.params.user);
doc.wishlist.push(item);
item.id = u64.encode(new Date().getTime().toString())
const doc = await db.get(req.params.user)
doc.wishlist.push(item)
try {
await db.put(doc);
await db.put(doc)
} catch {
req.flash('error', 'Items are being added too quickly. Please try again.')
return res.redirect(`/wishlist/${req.params.user}`)
@ -104,134 +104,134 @@ module.exports = (db) => {
'success',
(
req.user._id === req.params.user
? 'Added item to wishlist'
: `Pleged item for ${req.params.user}`
? 'Added item to wishlist'
: `Pleged item for ${req.params.user}`
)
);
res.redirect(`/wishlist/${req.params.user}`);
});
)
res.redirect(`/wishlist/${req.params.user}`)
})
router.post('/:user/pledge/:itemId', verifyAuth(), async (req, res) => {
const docs = await db.allDocs({ include_docs: true });
const docs = await db.allDocs({ include_docs: true })
for (let i = 0; i < docs.rows.length; i++) {
for (let j = 0; j < docs.rows[i].doc.wishlist.length; j++) {
if (docs.rows[i].doc.wishlist[j].id === req.params.itemId) {
if (docs.rows[i].doc.wishlist[j].pledgedBy !== undefined) {
req.flash('error', 'Item already pledged for');
return res.redirect(`/wishlist/${req.params.user}`);
req.flash('error', 'Item already pledged for')
return res.redirect(`/wishlist/${req.params.user}`)
}
docs.rows[i].doc.wishlist[j].pledgedBy = req.user._id;
await db.put(docs.rows[i].doc);
req.flash('success', 'Successfully pledged for item!');
return res.redirect(`/wishlist/${req.params.user}`);
docs.rows[i].doc.wishlist[j].pledgedBy = req.user._id
await db.put(docs.rows[i].doc)
req.flash('success', 'Successfully pledged for item!')
return res.redirect(`/wishlist/${req.params.user}`)
}
}
}
});
})
router.post('/:user/unpledge/:itemId', verifyAuth(), async (req, res) => {
const docs = await db.allDocs({ include_docs: true });
const docs = await db.allDocs({ include_docs: true })
for (let i = 0; i < docs.rows.length; i++) {
for (let j = 0; j < docs.rows[i].doc.wishlist.length; j++) {
if (docs.rows[i].doc.wishlist[j].id === req.params.itemId) {
if (docs.rows[i].doc.wishlist[j].pledgedBy !== req.user._id) {
req.flash('error', 'You did not pledge for this');
return res.redirect(`/wishlist/${req.params.user}`);
req.flash('error', 'You did not pledge for this')
return res.redirect(`/wishlist/${req.params.user}`)
}
docs.rows[i].doc.wishlist[j].pledgedBy = undefined;
if (docs.rows[i].doc.wishlist[j].addedBy === req.user._id) docs.rows[i].doc.wishlist.splice(j, 1);
await db.put(docs.rows[i].doc);
req.flash('success', 'Successfully unpledged for item');
return res.redirect(`/wishlist/${req.params.user}`);
docs.rows[i].doc.wishlist[j].pledgedBy = undefined
if (docs.rows[i].doc.wishlist[j].addedBy === req.user._id) docs.rows[i].doc.wishlist.splice(j, 1)
await db.put(docs.rows[i].doc)
req.flash('success', 'Successfully unpledged for item')
return res.redirect(`/wishlist/${req.params.user}`)
}
}
}
req.flash('error', 'Failed to find item');
return res.redirect(`/wishlist/${req.params.user}`);
});
req.flash('error', 'Failed to find item')
return res.redirect(`/wishlist/${req.params.user}`)
})
router.post('/:user/remove/:itemId', verifyAuth(), async (req, res) => {
if (req.user._id !== req.params.user) {
req.flash('error', 'Not correct user');
return res.redirect(`/wishlist/${req.params.user}`);
req.flash('error', 'Not correct user')
return res.redirect(`/wishlist/${req.params.user}`)
}
const doc = await db.get(req.user._id);
const doc = await db.get(req.user._id)
for (let i = 0; i < doc.wishlist.length; i++) {
if (doc.wishlist[i].id === req.params.itemId) {
doc.wishlist.splice(i, 1);
await db.put(doc);
req.flash('success', 'Successfully removed from wishlist');
return res.redirect(`/wishlist/${req.params.user}`);
doc.wishlist.splice(i, 1)
await db.put(doc)
req.flash('success', 'Successfully removed from wishlist')
return res.redirect(`/wishlist/${req.params.user}`)
}
}
req.flash('error', 'Failed to find item');
return res.redirect(`/wishlist/${req.params.user}`);
});
req.flash('error', 'Failed to find item')
return res.redirect(`/wishlist/${req.params.user}`)
})
router.post('/:user/move/:direction/:itemId', verifyAuth(), async (req, res) => {
if (req.user._id !== req.params.user) {
req.flash('error', 'Not correct user');
return res.redirect(`/wishlist/${req.params.user}`);
req.flash('error', 'Not correct user')
return res.redirect(`/wishlist/${req.params.user}`)
}
const doc = await db.get(req.user._id);
const wishlist = doc.wishlist;
if (req.params.direction === 'up') wishlist.reverse();
let moveFromIndex;
const doc = await db.get(req.user._id)
const wishlist = doc.wishlist
if (req.params.direction === 'up') wishlist.reverse()
let moveFromIndex
wishlist.forEach(wish => {
if (wish.id === req.params.itemId) return moveFromIndex = wishlist.indexOf(wish);
});
const moveToIndex = wishlist.findIndex(wish => ( wishlist.indexOf(wish) > moveFromIndex && wish.addedBy === req.user._id ));
if (wish.id === req.params.itemId) moveFromIndex = wishlist.indexOf(wish)
})
const moveToIndex = wishlist.findIndex(wish => (wishlist.indexOf(wish) > moveFromIndex && wish.addedBy === req.user._id))
if (moveToIndex < 0 || moveToIndex > wishlist.length) {
req.flash('error', 'Invalid move');
return res.redirect(`/wishlist/${req.params.user}`);
req.flash('error', 'Invalid move')
return res.redirect(`/wishlist/${req.params.user}`)
}
[ wishlist[moveFromIndex], wishlist[moveToIndex] ] = [ wishlist[moveToIndex], wishlist[moveFromIndex] ];
if (req.params.direction === 'up') wishlist.reverse();
doc.wishlist = wishlist;
await db.put(doc);
req.flash('success', 'Successfully moved item!');
return res.redirect(`/wishlist/${req.params.user}`);
});
[wishlist[moveFromIndex], wishlist[moveToIndex]] = [wishlist[moveToIndex], wishlist[moveFromIndex]]
if (req.params.direction === 'up') wishlist.reverse()
doc.wishlist = wishlist
await db.put(doc)
req.flash('success', 'Successfully moved item!')
return res.redirect(`/wishlist/${req.params.user}`)
})
router.get('/:user/note/:id', verifyAuth(), async (req, res) => {
const doc = await db.get(req.params.user);
const doc = await db.get(req.params.user)
const item = doc.wishlist.find(item => item.id === req.params.id)
res.render('note', { item });
});
res.render('note', { item })
})
router.post('/:user/note/:id', verifyAuth(), async (req, res) => {
const doc = await db.get(req.params.user);
const wishlist = doc.wishlist;
for (let i=0; i < wishlist.length; i++) {
wishlistItem = wishlist[i];
if (wishlistItem.id !== req.params.id) continue;
const doc = await db.get(req.params.user)
const wishlist = doc.wishlist
for (let i = 0; i < wishlist.length; i++) {
const wishlistItem = wishlist[i]
if (wishlistItem.id !== req.params.id) continue
if (req.user._id !== req.params.user && req.user._id !== wishlistItem.addedBy) {
req.flash('error', 'Invalid user');
return res.redirect(`/wishlist/${req.params.user}`);
req.flash('error', 'Invalid user')
return res.redirect(`/wishlist/${req.params.user}`)
}
for (const type of [
'name', 'note', 'url', 'price', 'image'
]) {
if (!req.body.hasOwnProperty(type)) {
if (!Object.prototype.hasOwnProperty.call(req.body, type)) {
req.flash('error', `Missing property ${type}`)
return res.redirect(`/wishlist/${req.params.user}/note/${req.params.id}`)
}
wishlistItem[type] = req.body[type]
}
wishlist[i] = wishlistItem;
wishlist[i] = wishlistItem
}
doc.wishlist = wishlist;
await db.put(doc);
req.flash('success', `Successfully saved note!`);
return res.redirect(`/wishlist/${req.params.user}`);
});
doc.wishlist = wishlist
await db.put(doc)
req.flash('success', 'Successfully saved note!')
return res.redirect(`/wishlist/${req.params.user}`)
})
router.post('/:user/refresh/:id', verifyAuth(), async (req, res) => {
const doc = await db.get(req.params.user);
const wishlist = doc.wishlist;
for (let i=0; i < wishlist.length; i++) {
wishlistItem = wishlist[i];
if (wishlistItem.id !== req.params.id) continue;
const doc = await db.get(req.params.user)
const wishlist = doc.wishlist
for (let i = 0; i < wishlist.length; i++) {
const wishlistItem = wishlist[i]
if (wishlistItem.id !== req.params.id) continue
if (req.user._id !== req.params.user && req.user._id !== wishlistItem.addedBy) {
req.flash('error', 'Invalid user');
return res.redirect(`/wishlist/${req.params.user}`);
req.flash('error', 'Invalid user')
return res.redirect(`/wishlist/${req.params.user}`)
}
if (!wishlistItem.url) {
@ -240,38 +240,39 @@ module.exports = (db) => {
}
const productData = await getProductName(wishlistItem.url)
for (field of [ 'name', 'price', 'image' ]) {
for (const field of ['name', 'price', 'image']) {
if (productData[field]) wishlistItem[field] = productData[field]
}
wishlist[i] = wishlistItem;
wishlist[i] = wishlistItem
}
doc.wishlist = wishlist;
await db.put(doc);
req.flash('success', `Successfully refreshed data!`);
return res.redirect(`/wishlist/${req.params.user}/note/${req.params.id}`);
});
doc.wishlist = wishlist
await db.put(doc)
req.flash('success', 'Successfully refreshed data!')
return res.redirect(`/wishlist/${req.params.user}/note/${req.params.id}`)
})
router.post('/:user/note/remove/:id', verifyAuth(), async (req, res) => {
const doc = await db.get(req.params.user);
const wishlist = doc.wishlist;
for (let i=0; i < wishlist.length; i++) {
wishlistItem = wishlist[i];
if (wishlistItem.id !== req.params.id) continue;
const doc = await db.get(req.params.user)
const wishlist = doc.wishlist
for (let i = 0; i < wishlist.length; i++) {
const wishlistItem = wishlist[i]
if (wishlistItem.id !== req.params.id) continue
if (req.user._id !== req.params.user && req.user._id !== wishlistItem.addedBy) {
req.flash('error', 'Invalid user');
return res.redirect(`/wishlist/${req.params.user}`);
req.flash('error', 'Invalid user')
return res.redirect(`/wishlist/${req.params.user}`)
}
if (wishlistItem.note) {
wishlistItem.note = undefined;
wishlist[i] = wishlistItem;
wishlistItem.note = undefined
wishlist[i] = wishlistItem
} else {
req.flash('error', 'Has no note');
return res.redirect(`/wishlist/${req.params.user}`); }
req.flash('error', 'Has no note')
return res.redirect(`/wishlist/${req.params.user}`)
}
}
doc.wishlist = wishlist;
await db.put(doc);
req.flash('success', 'Successfully removed note');
return res.redirect(`/wishlist/${req.params.user}`);
doc.wishlist = wishlist
await db.put(doc)
req.flash('success', 'Successfully removed note')
return res.redirect(`/wishlist/${req.params.user}`)
})
return router;
};
return router
}