diff --git a/migrations/0.1.6.js b/migrations/0.1.6.js new file mode 100644 index 00000000..e7166bec --- /dev/null +++ b/migrations/0.1.6.js @@ -0,0 +1,12 @@ +'use strict'; + +module.exports = async(db, redis) => { + console.log('Adding custom overboard toggle'); + await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, { + '$set': { + 'allowCustomOverboard': false, + }, + }); + console.log('Cleared globalsettings cache'); + await redis.deletePattern('globalsettings'); +}; diff --git a/models/forms/changeglobalsettings.js b/models/forms/changeglobalsettings.js index f54838ce..dc85c45a 100644 --- a/models/forms/changeglobalsettings.js +++ b/models/forms/changeglobalsettings.js @@ -27,7 +27,7 @@ module.exports = async (req, res, next) => { const newMarkdownPermLevels = Object.keys(oldSettings.permLevels.markdown).reduce((acc, val) => { acc[val] = numberSetting(req.body[`perm_levels_markdown_${val}`], oldSettings.permLevels.markdown[val]); return acc; - }, {}) + }, {}); const newSettings = { filters: arraySetting(req.body.filters, oldSettings.filters), @@ -94,6 +94,7 @@ module.exports = async (req, res, next) => { }, overboardLimit: numberSetting(req.body.overboard_limit, oldSettings.overboardLimit), overboardCatalogLimit: numberSetting(req.body.overboard_catalog_limit, oldSettings.overboardCatalogLimit), + allowCustomOverboard: booleanSetting(req.body.allow_custom_overboard, oldSettings.allowCustomOverboard), cacheTemplates: booleanSetting(req.body.cache_templates, oldSettings.cacheTemplates), lockWait: numberSetting(req.body.lock_wait, oldSettings.lockWait), pruneModlogs: numberSetting(req.body.prune_modlogs, oldSettings.pruneModlogs), diff --git a/models/pages/overboard.js b/models/pages/overboard.js index 91dce767..60e8e89c 100644 --- a/models/pages/overboard.js +++ b/models/pages/overboard.js @@ -6,33 +6,40 @@ const { Posts, Boards } = require(__dirname+'/../../db/') module.exports = async (req, res, next) => { - const { overboardLimit } = config.get; + const { overboardLimit, allowCustomOverboard } = config.get; - //sliced to overboardLimit optimisation because there could only be max 1 thread from each of unique boards anyway - let selectedBoards = []; - const addList = (req.query.add ? (typeof req.query.add === 'string' ? req.query.add.split(',') : req.query.add) : []) - .slice(0, overboardLimit) - .map(b => b.trim()) - .filter(b => b) - .sort(); - const removeList = (req.query.rem ? (typeof req.query.rem === 'string' ? req.query.rem.split(',') : req.query.rem) : []) - .slice(0, overboardLimit) - .map(b => b.trim()) - .filter(b => b) - .sort(); - const addBoards = [...new Set(addList)] - const removeBoardsSet = new Set(removeList); - const removeBoards = [...removeBoardsSet]; - let includeDefault = req.query.include_default === 'true'; - if (!includeDefault && addBoards.length === 0 && removeBoards.length === 0) { - //...really? - includeDefault = true; - } + let selectedBoards = [] + , addBoards = [] + , removeBoards = [] + , removeBoardsSet = new Set() + , includeDefault = true + , cacheQueryString = ''; - //similar to board list - const cacheQuery = new URLSearchParams({ include_default: includeDefault, add: addBoards, rem: removeBoards }); - cacheQuery.sort(); - const cacheQueryString = cacheQuery.toString(); + if (allowCustomOverboard === true) { + //sliced to overboardLimit optimisation because there could only be max 1 thread from each of unique boards anyway + const addList = (req.query.add ? (typeof req.query.add === 'string' ? req.query.add.split(',') : req.query.add) : []) + .slice(0, overboardLimit) + .map(b => b.trim()) + .filter(b => b) + .sort(); + const removeList = (req.query.rem ? (typeof req.query.rem === 'string' ? req.query.rem.split(',') : req.query.rem) : []) + .slice(0, overboardLimit) + .map(b => b.trim()) + .filter(b => b) + .sort(); + addBoards = [...new Set(addList)] + removeBoardsSet = new Set(removeList); + removeBoards = [...removeBoardsSet]; + includeDefault = req.query.include_default === 'true'; + if (!includeDefault && addBoards.length === 0) { + //...really? + includeDefault = true; + } + //similar to board list + const cacheQuery = new URLSearchParams({ include_default: includeDefault, add: addBoards, rem: removeBoards }); + cacheQuery.sort(); + cacheQueryString = cacheQuery.toString(); + } let threads = (await cache.get(`overboard:${cacheQueryString}`)) || []; if (!threads || threads.length === 0) { @@ -54,7 +61,7 @@ module.exports = async (req, res, next) => { res .set('Cache-Control', 'public, max-age=60') - if (req.path === '/overboard.html') { + if (req.path === '/overboard.json') { res.json({ threads, }); @@ -66,6 +73,7 @@ module.exports = async (req, res, next) => { removeBoards, selectedBoards, cacheQueryString, + allowCustomOverboard, }); } diff --git a/models/pages/overboardcatalog.js b/models/pages/overboardcatalog.js index 9e35a12f..aa217489 100644 --- a/models/pages/overboardcatalog.js +++ b/models/pages/overboardcatalog.js @@ -8,28 +8,35 @@ module.exports = async (req, res, next) => { const { overboardCatalogLimit, allowCustomOverboard } = config.get; - let selectedBoards = []; - const addList = (req.query.add ? (typeof req.query.add === 'string' ? req.query.add.split(',') : req.query.add) : []) - .slice(0, overboardCatalogLimit) - .map(b => b.trim()) - .filter(b => b) - .sort(); - const removeList = (req.query.rem ? (typeof req.query.rem === 'string' ? req.query.rem.split(',') : req.query.rem) : []) - .slice(0, overboardCatalogLimit) - .map(b => b.trim()) - .filter(b => b) - .sort(); - const addBoards = [...new Set(addList)] - const removeBoardsSet = new Set(removeList); - const removeBoards = [...removeBoardsSet]; - let includeDefault = req.query.include_default === 'true'; - if (!includeDefault && addBoards.length === 0 && removeBoards.length === 0) { - includeDefault = true; - } + let selectedBoards = [] + , addBoards = [] + , removeBoards = [] + , removeBoardsSet = new Set() + , includeDefault = true + , cacheQueryString = ''; - const cacheQuery = new URLSearchParams({ include_default: includeDefault, add: addBoards, rem: removeBoards }); - cacheQuery.sort(); - const cacheQueryString = cacheQuery.toString(); + if (allowCustomOverboard === true) { + const addList = (req.query.add ? (typeof req.query.add === 'string' ? req.query.add.split(',') : req.query.add) : []) + .slice(0, overboardCatalogLimit) + .map(b => b.trim()) + .filter(b => b) + .sort(); + const removeList = (req.query.rem ? (typeof req.query.rem === 'string' ? req.query.rem.split(',') : req.query.rem) : []) + .slice(0, overboardCatalogLimit) + .map(b => b.trim()) + .filter(b => b) + .sort(); + addBoards = [...new Set(addList)] + removeBoardsSet = new Set(removeList); + removeBoards = [...removeBoardsSet]; + includeDefault = req.query.include_default === 'true'; + if (!includeDefault && addBoards.length === 0) { + includeDefault = true; + } + const cacheQuery = new URLSearchParams({ include_default: includeDefault, add: addBoards, rem: removeBoards }); + cacheQuery.sort(); + cacheQueryString = cacheQuery.toString(); + } let threads = (await cache.get(`catalog:${cacheQueryString}`)) || []; if (!threads || threads.length === 0) { @@ -51,7 +58,7 @@ module.exports = async (req, res, next) => { res .set('Cache-Control', 'public, max-age=60') - if (req.path === '/catalog.html') { + if (req.path === '/catalog.json') { res.json({ threads, }); @@ -63,6 +70,7 @@ module.exports = async (req, res, next) => { removeBoards, selectedBoards, cacheQueryString, + allowCustomOverboard, }); } diff --git a/package-lock.json b/package-lock.json index 21c8c6c5..6ff3e51d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "jschan", - "version": "0.1.5", + "version": "0.1.6", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -8129,9 +8129,9 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-root": { "version": "0.1.1", diff --git a/package.json b/package.json index 8bfdc1e0..b1d06dfd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jschan", "version": "0.1.6", - "migrateVersion": "0.1.5", + "migrateVersion": "0.1.6", "description": "", "main": "server.js", "dependencies": { diff --git a/views/pages/globalmanagesettings.pug b/views/pages/globalmanagesettings.pug index dfb1bf5f..54af13e2 100644 --- a/views/pages/globalmanagesettings.pug +++ b/views/pages/globalmanagesettings.pug @@ -92,6 +92,10 @@ block content .row .label Overboard Catalog Thread Limit input(type='number' name='overboard_catalog_limit' value=settings.overboardCatalogLimit) + .row + .label Allow Custom Overboard + label.postform-style.ph-5 + input(type='checkbox', name='allow_custom_overboard' value='true' checked=settings.allowCustomOverboard) .row .label Prune Modlogs Days input(type='number', name='prune_modlogs' value=settings.pruneModlogs) diff --git a/views/pages/overboard.pug b/views/pages/overboard.pug index 5ada99d8..4d417024 100644 --- a/views/pages/overboard.pug +++ b/views/pages/overboard.pug @@ -13,20 +13,21 @@ block content | ( a(href=`/catalog.html?${cacheQueryString}`) Catalog View | ) - .flexcenter.mv-10 - form.form-post(action='/overboard.html' method='GET') - .col - .row - .label Include Default Boards - label.postform-style.ph-5 - input(type='checkbox', name='include_default', value='true' checked=includeDefault) - .row - .label Add Boards - input(type='text' name='add' value=addBoards.join(',') placeholder='comma separated') - .row - .label Remove Boards - input(type='text' name='rem' value=removeBoards.join(',') placeholder='comma separated') - input(type='submit', value='Filter') + if allowCustomOverboard === true + .flexcenter.mv-10 + form.form-post(action='/overboard.html' method='GET') + .col + .row + .label Include Default Boards + label.postform-style.ph-5 + input(type='checkbox', name='include_default', value='true' checked=includeDefault) + .row + .label Add Boards + input(type='text' name='add' value=addBoards.join(',') placeholder='comma separated') + .row + .label Remove Boards + input(type='text' name='rem' value=removeBoards.join(',') placeholder='comma separated') + input(type='submit', value='Filter') +announcements(true, true, false) hr(size=1) if threads.length === 0 diff --git a/views/pages/overboardcatalog.pug b/views/pages/overboardcatalog.pug index 0830a86c..673786b5 100644 --- a/views/pages/overboardcatalog.pug +++ b/views/pages/overboardcatalog.pug @@ -14,20 +14,21 @@ block content | ( a(href=`/overboard.html?${cacheQueryString}`) Index View | ) - .flexcenter.mv-10 - form.form-post(action='/catalog.html' method='GET') - .col - .row - .label Include Default Boards - label.postform-style.ph-5 - input(type='checkbox', name='include_default', value='true' checked=includeDefault) - .row - .label Add Boards - input(type='text' name='add' value=addBoards.join(',') placeholder='comma separated') - .row - .label Remove Boards - input(type='text' name='rem' value=removeBoards.join(',') placeholder='comma separated') - input(type='submit', value='Filter') + if allowCustomOverboard === true + .flexcenter.mv-10 + form.form-post(action='/catalog.html' method='GET') + .col + .row + .label Include Default Boards + label.postform-style.ph-5 + input(type='checkbox', name='include_default', value='true' checked=includeDefault) + .row + .label Add Boards + input(type='text' name='add' value=addBoards.join(',') placeholder='comma separated') + .row + .label Remove Boards + input(type='text' name='rem' value=removeBoards.join(',') placeholder='comma separated') + input(type='submit', value='Filter') +announcements() include ../includes/stickynav.pug .wrapbar