diff --git a/controllers/forms.js b/controllers/forms.js index 946f6206..da521304 100644 --- a/controllers/forms.js +++ b/controllers/forms.js @@ -2,10 +2,10 @@ const express = require('express') , router = express.Router() - , Boards = require(__dirname+'/../db-models/boards.js') - , Posts = require(__dirname+'/../db-models/posts.js') - , Trips = require(__dirname+'/../db-models/trips.js') - , Bans = require(__dirname+'/../db-models/bans.js') + , Boards = require(__dirname+'/../db/boards.js') + , Posts = require(__dirname+'/../db/posts.js') + , Trips = require(__dirname+'/../db/trips.js') + , Bans = require(__dirname+'/../db/bans.js') , banPoster = require(__dirname+'/../models/forms/ban-poster.js') , removeBans = require(__dirname+'/../models/forms/removebans.js') , makePost = require(__dirname+'/../models/forms/make-post.js') diff --git a/controllers/pages.js b/controllers/pages.js index 8c8a354b..e9a37d0a 100644 --- a/controllers/pages.js +++ b/controllers/pages.js @@ -45,7 +45,7 @@ router.get('/:board/manage', Boards.exists, isLoggedIn, hasPerms, manage); router.get('/globalmanage', isLoggedIn, hasPerms, globalmanage); // board page/recents -router.get('/:board/:page(\\d+)?', Boards.exists, numberConverter, board); +router.get('/:board', Boards.exists, numberConverter, board); // thread view page router.get('/:board/thread/:id(\\d+)', Boards.exists, numberConverter, thread); diff --git a/db-models/accounts.js b/db/accounts.js similarity index 100% rename from db-models/accounts.js rename to db/accounts.js diff --git a/db-models/bans.js b/db/bans.js similarity index 100% rename from db-models/bans.js rename to db/bans.js diff --git a/db-models/boards.js b/db/boards.js similarity index 100% rename from db-models/boards.js rename to db/boards.js diff --git a/helpers/db.js b/db/db.js similarity index 100% rename from helpers/db.js rename to db/db.js diff --git a/db-models/posts.js b/db/posts.js similarity index 100% rename from db-models/posts.js rename to db/posts.js diff --git a/db-models/trips.js b/db/trips.js similarity index 100% rename from db-models/trips.js rename to db/trips.js diff --git a/helpers/bancheck.js b/helpers/bancheck.js index 5e53bff6..684f4cbf 100644 --- a/helpers/bancheck.js +++ b/helpers/bancheck.js @@ -1,6 +1,6 @@ 'use strict'; -const Bans = require(__dirname+'/../db-models/bans.js') +const Bans = require(__dirname+'/../db/bans.js') , hasPerms = require(__dirname+'/hasperms.js'); module.exports = async (req, res, next) => { diff --git a/helpers/markdown.js b/helpers/markdown.js index 7a3d5f43..8e9435d9 100644 --- a/helpers/markdown.js +++ b/helpers/markdown.js @@ -1,6 +1,6 @@ 'use strict'; -const Posts = require(__dirname+'/../db-models/posts.js') +const Posts = require(__dirname+'/../db/posts.js') , greentextRegex = /^>[^>].+/gm , redtextRegex = /^<[^<].+/gm , boldRegex = /==.+==/gm diff --git a/helpers/number-converter.js b/helpers/number-converter.js index e103ba83..6604e1ad 100644 --- a/helpers/number-converter.js +++ b/helpers/number-converter.js @@ -19,6 +19,16 @@ module.exports = (req, res, next) => { req.params.page = +req.params.page; } + //and query + if (req.query.p) { + const pnum = +req.query.p; + if (Number.isSafeInteger(pnum)) { + req.query.p = +req.query.p; + } else { + req.query.p = null; + } + } + next(); } diff --git a/helpers/quotes.js b/helpers/quotes.js index 0d6786aa..428b6cf9 100644 --- a/helpers/quotes.js +++ b/helpers/quotes.js @@ -1,6 +1,6 @@ 'use strict'; -const Posts = require(__dirname+'/../db-models/posts.js') +const Posts = require(__dirname+'/../db/posts.js') , quoteRegex = />>\d+/gm; module.exports = async (board, text) => { diff --git a/helpers/tripcode.js b/helpers/tripcode.js index f7736f5c..e1ac247b 100644 --- a/helpers/tripcode.js +++ b/helpers/tripcode.js @@ -1,6 +1,6 @@ 'use strict'; -const Tripcodes = require(__dirname+'/../db-models/trips.js') +const Tripcodes = require(__dirname+'/../db/trips.js') , crypto = require('crypto'); module.exports = async (password) => { diff --git a/models/forms/ban-poster.js b/models/forms/ban-poster.js index 30ac18fe..8ee14f41 100644 --- a/models/forms/ban-poster.js +++ b/models/forms/ban-poster.js @@ -2,8 +2,8 @@ const uploadDirectory = require(__dirname+'/../../helpers/uploadDirectory.js') , hasPerms = require(__dirname+'/../../helpers/hasperms.js') - , Bans = require(__dirname+'/../../db-models/bans.js') - , Posts = require(__dirname+'/../../db-models/posts.js'); + , Bans = require(__dirname+'/../../db/bans.js') + , Posts = require(__dirname+'/../../db/posts.js'); module.exports = async (req, res, next, board, checkedPosts) => { diff --git a/models/forms/delete-post.js b/models/forms/delete-post.js index d4360fdb..85e08b00 100644 --- a/models/forms/delete-post.js +++ b/models/forms/delete-post.js @@ -6,7 +6,7 @@ const path = require('path') , unlink = util.promisify(fs.unlink) , uploadDirectory = require(__dirname+'/../../helpers/uploadDirectory.js') , hasPerms = require(__dirname+'/../../helpers/hasperms.js') - , Posts = require(__dirname+'/../../db-models/posts.js'); + , Posts = require(__dirname+'/../../db/posts.js'); module.exports = async (req, res, next, checkedPosts) => { diff --git a/models/forms/dismiss-report.js b/models/forms/dismiss-report.js index 15d3b147..fa4d1cd5 100644 --- a/models/forms/dismiss-report.js +++ b/models/forms/dismiss-report.js @@ -1,6 +1,6 @@ 'use strict'; -const Posts = require(__dirname+'/../../db-models/posts.js') +const Posts = require(__dirname+'/../../db/posts.js') , hasPerms = require(__dirname+'/../../helpers/hasperms.js'); module.exports = async (req, res, next) => { diff --git a/models/forms/edit-post.js b/models/forms/edit-post.js index 6b293bc2..37efbecd 100644 --- a/models/forms/edit-post.js +++ b/models/forms/edit-post.js @@ -1,6 +1,6 @@ 'use strict'; -const Posts = require(__dirname+'/../../db-models/posts.js'); +const Posts = require(__dirname+'/../../db/posts.js'); module.exports = async (req, res, next) => { diff --git a/models/forms/login.js b/models/forms/login.js index fa5940e1..fa8e8b1a 100644 --- a/models/forms/login.js +++ b/models/forms/login.js @@ -1,7 +1,7 @@ 'use strict'; const bcrypt = require('bcrypt') - , Accounts = require(__dirname+'/../../db-models/accounts.js'); + , Accounts = require(__dirname+'/../../db/accounts.js'); module.exports = async (req, res, next) => { diff --git a/models/forms/make-post.js b/models/forms/make-post.js index b5b16c41..9839e99c 100644 --- a/models/forms/make-post.js +++ b/models/forms/make-post.js @@ -6,7 +6,7 @@ const uuidv4 = require('uuid/v4') , crypto = require('crypto') , randomBytes = util.promisify(crypto.randomBytes) , uploadDirectory = require(__dirname+'/../../helpers/uploadDirectory.js') - , Posts = require(__dirname+'/../../db-models/posts.js') + , Posts = require(__dirname+'/../../db/posts.js') , getTripCode = require(__dirname+'/../../helpers/tripcode.js') , linkQuotes = require(__dirname+'/../../helpers/quotes.js') , simpleMarkdown = require(__dirname+'/../../helpers/markdown.js') diff --git a/models/forms/register.js b/models/forms/register.js index ef79e9fd..51f96bf5 100644 --- a/models/forms/register.js +++ b/models/forms/register.js @@ -1,7 +1,7 @@ 'use strict'; const bcrypt = require('bcrypt') - , Accounts = require(__dirname+'/../../db-models/accounts.js'); + , Accounts = require(__dirname+'/../../db/accounts.js'); module.exports = async (req, res, next) => { diff --git a/models/forms/removebans.js b/models/forms/removebans.js index 9293729a..db0af77a 100644 --- a/models/forms/removebans.js +++ b/models/forms/removebans.js @@ -1,6 +1,6 @@ 'use strict'; -const Bans = require(__dirname+'/../../db-models/bans.js') +const Bans = require(__dirname+'/../../db/bans.js') , { ObjectId } = require('mongodb'); module.exports = async (req, res, next) => { diff --git a/models/forms/report-post.js b/models/forms/report-post.js index b745d264..dad4bf94 100644 --- a/models/forms/report-post.js +++ b/models/forms/report-post.js @@ -1,6 +1,6 @@ 'use strict'; -const Posts = require(__dirname+'/../../db-models/posts.js'); +const Posts = require(__dirname+'/../../db/posts.js'); module.exports = async (req, res, next) => { diff --git a/models/forms/spoiler-post.js b/models/forms/spoiler-post.js index 088fa714..f819ba2a 100644 --- a/models/forms/spoiler-post.js +++ b/models/forms/spoiler-post.js @@ -6,7 +6,7 @@ const path = require('path') , unlink = util.promisify(fs.unlink) , uploadDirectory = require(__dirname+'/../../helpers/uploadDirectory.js') , hasPerms = require(__dirname+'/../../helpers/hasperms.js') - , Posts = require(__dirname+'/../../db-models/posts.js'); + , Posts = require(__dirname+'/../../db/posts.js'); module.exports = async (req, res, next, checkedPosts) => { diff --git a/models/pages/board.js b/models/pages/board.js index 5a1389eb..fa82182c 100644 --- a/models/pages/board.js +++ b/models/pages/board.js @@ -1,22 +1,28 @@ 'use strict'; -const Posts = require(__dirname+'/../../db-models/posts.js'); +const Posts = require(__dirname+'/../../db/posts.js'); module.exports = async (req, res, next) => { //get the recently bumped thread & preview posts + const page = req.query.p || 1; let threads; let pages; try { - threads = await Posts.getRecent(req.params.board, req.params.page || 1); pages = Math.ceil((await Posts.getPages(req.params.board)) / 10); + if (page > pages) { + return next(); + } + threads = await Posts.getRecent(req.params.board, page); } catch (err) { return next(err); } + //render the page res.render('board', { csrf: req.csrfToken(), threads: threads || [], - pages: pages + pages, + page, }); } diff --git a/models/pages/catalog.js b/models/pages/catalog.js index a8cb2ac2..2dd42f0a 100644 --- a/models/pages/catalog.js +++ b/models/pages/catalog.js @@ -1,6 +1,6 @@ 'use strict'; -const Posts = require(__dirname+'/../../db-models/posts.js'); +const Posts = require(__dirname+'/../../db/posts.js'); module.exports = async (req, res, next) => { diff --git a/models/pages/globalmanage.js b/models/pages/globalmanage.js index 51bf9157..30f775d1 100644 --- a/models/pages/globalmanage.js +++ b/models/pages/globalmanage.js @@ -1,6 +1,6 @@ 'use strict'; -const Posts = require(__dirname+'/../../db-models/posts.js'); +const Posts = require(__dirname+'/../../db/posts.js'); module.exports = async (req, res, next) => { diff --git a/models/pages/home.js b/models/pages/home.js index 2bfbb9e7..cdddc7ba 100644 --- a/models/pages/home.js +++ b/models/pages/home.js @@ -1,6 +1,6 @@ 'use strict'; -const Boards = require(__dirname+'/../../db-models/boards.js'); +const Boards = require(__dirname+'/../../db/boards.js'); module.exports = async (req, res, next) => { diff --git a/models/pages/manage.js b/models/pages/manage.js index 1ef2ec91..a4b7cc02 100644 --- a/models/pages/manage.js +++ b/models/pages/manage.js @@ -1,7 +1,7 @@ 'use strict'; -const Posts = require(__dirname+'/../../db-models/posts.js') - , Bans = require(__dirname+'/../../db-models/bans.js'); +const Posts = require(__dirname+'/../../db/posts.js') + , Bans = require(__dirname+'/../../db/bans.js'); module.exports = async (req, res, next) => { diff --git a/models/pages/thread.js b/models/pages/thread.js index 3ff515ce..1a887e60 100644 --- a/models/pages/thread.js +++ b/models/pages/thread.js @@ -1,6 +1,6 @@ 'use strict'; -const Posts = require(__dirname+'/../../db-models/posts.js'); +const Posts = require(__dirname+'/../../db/posts.js'); module.exports = async (req, res, next) => { diff --git a/server.js b/server.js index be89365c..8773f802 100644 --- a/server.js +++ b/server.js @@ -53,7 +53,7 @@ const express = require('express') // use pug view engine app.set('view engine', 'pug'); app.set('views', path.join(__dirname, 'views/pages')); - app.enable('view cache'); +// app.enable('view cache'); // static files app.use('/css', express.static(__dirname + '/static/css')); diff --git a/static/css/style.css b/static/css/style.css index d4a1988b..2a45827a 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -92,8 +92,12 @@ object { color: green; } +blockquote a { + color: #d00; +} + blockquote { - word-break: break-all; + /*word-break: break-all;*/ white-space: pre-wrap; } @@ -123,8 +127,12 @@ input, textarea { } .action-wrapper { - /*align-items: center;*/ - /*flex-direction: row;*/ + display: flex; + flex-direction: column; +} + +.action-wrapper * { + margin: 3px 0; } .form-post { @@ -172,10 +180,6 @@ input, textarea { figure { } -blockquote a { - color: #d00; -} - input textarea { padding: 8px; } @@ -316,6 +320,10 @@ hr { @media only screen and (max-width: 800px) { + body { + /*font-size: 14pt;*/ + } + input { height: 30px; } @@ -328,6 +336,10 @@ hr { width: 100%; } + blockquote { + margin: 1em; + } + .post-check { top: 2px; margin-left: 2px!important; diff --git a/views/includes/deletefooter.pug b/views/includes/deletefooter.pug index 7f74c19f..0aba7b03 100644 --- a/views/includes/deletefooter.pug +++ b/views/includes/deletefooter.pug @@ -1,15 +1,25 @@ -section.action-wrapper - span - label - input.post-check(type='checkbox', name='delete' value=1) - | Delete - label - input.post-check(type='checkbox', name='spoiler' value=1) - | Spoiler - input#password(type='password', name='password', placeholder='post password' autocomplete='off') - span - label - input.post-check(type='checkbox', name='report' value=1) - | Report - input#report(type='text', name='reason', placeholder='reason' autocomplete='off') - input(type='submit', value='submit') +.action-wrapper Actions: + label + input.post-check(type='checkbox', name='delete' value=1) + | Delete Post + label + input.post-check(type='checkbox', name='spoiler' value=1) + | Spoiler Images + label + input#password(type='text', name='password', placeholder='post password' autocomplete='off') +.action-wrapper Mod Actions: + label + input.post-check(type='checkbox', name='dismiss' value=1) + | Dismiss Reports + label + input.post-check(type='checkbox', name='ban' value=1) + | Ban Poster + label + input.post-check(type='checkbox', name='global_ban' value=1) + | Global Ban Poster + label + input.post-check(type='checkbox', name='preserve_post' value=1) + | Show Post In Ban + label + input#report(type='text', name='reason', placeholder='ban reason' autocomplete='off') +input(type='submit', value='submit') diff --git a/views/includes/pages.pug b/views/includes/pages.pug new file mode 100644 index 00000000..e9834882 --- /dev/null +++ b/views/includes/pages.pug @@ -0,0 +1,6 @@ +span.pages Page: + - for(let i = 1; i <= pages; i++) + if i === page + span: a(href=`/${board._id}?p=${i}`) [#{i}] + else + span: a(href=`/${board._id}?p=${i}`) #{i} diff --git a/views/pages/board.pug b/views/pages/board.pug index a1d39007..e95e6304 100644 --- a/views/pages/board.pug +++ b/views/pages/board.pug @@ -10,6 +10,8 @@ block content include ../includes/postform.pug .mode Posting mode: Thread [#[a.no-decoration(href=`/${board._id}/catalog`) Catalog]] hr(size=1) + include ../includes/pages.pug + hr(size=1) form(action='/forms/board/'+board._id+'/actions' method='POST' enctype='application/x-www-form-urlencoded') input(type='hidden' name='_csrf' value=csrf) if threads.length === 0 @@ -20,10 +22,7 @@ block content +post(thread, true) for post in thread.replies +post(post, true) - hr(size=1) - if pages > 0 - span.pages Page - - for(let i = 0; i < pages; i++) - span: a(href=`/${board._id}/${i+1}`) #{i+1} - hr(size=1) + hr(size=1) + include ../includes/pages.pug + hr(size=1) include ../includes/deletefooter.pug diff --git a/views/pages/manage.pug b/views/pages/manage.pug index 35fcc8a8..888fbf32 100644 --- a/views/pages/manage.pug +++ b/views/pages/manage.pug @@ -14,42 +14,24 @@ block content if posts.length === 0 p No reports. hr(size=1) - for post in posts - section.thread - +post(post, false, true) + else + for post in posts + section.thread + +post(post, false, true) + hr(size=1) + include ../includes/deletefooter.pug hr(size=1) - section.action-wrapper - label - input.post-check(type='checkbox', name='delete' value=1) - | Delete Post - label - input.post-check(type='checkbox', name='spoiler' value=1) - | Spoiler Images - label - input.post-check(type='checkbox', name='dismiss' value=1) - | Dismiss Reports - label - input.post-check(type='checkbox', name='ban' value=1) - | Ban Poster - label - input.post-check(type='checkbox', name='global_ban' value=1) - | Global Ban Poster - label - input.post-check(type='checkbox', name='preserve_post' value=1) - | Show Post In Ban - label - input#report(type='text', name='reason', placeholder='ban reason' autocomplete='off') - input(type='submit', value='submit') - hr(size=1) h4 Bans: form(action=`/forms/board/${board._id}/unban` method='POST' enctype='application/x-www-form-urlencoded') input(type='hidden' name='_csrf' value=csrf) if bans.length === 0 p No bans. hr(size=1) - for ban in bans - section.thread - +ban(ban) - hr(size=1) - section.action-wrapper - input(type='submit', value='unban') + else + for ban in bans + section.thread + +ban(ban) + hr(size=1) + section.action-wrapper + input(type='submit', value='unban') + diff --git a/wipe.js b/wipe.js index 09f59161..cf542eb8 100644 --- a/wipe.js +++ b/wipe.js @@ -10,11 +10,11 @@ const Mongo = require(__dirname+'/helpers/db.js') (async () => { console.log('connecting to db...') await Mongo.connect(); - const Boards = require(__dirname+'/db-models/boards.js') - , Posts = require(__dirname+'/db-models/posts.js') - , Bans = require(__dirname+'/db-models/bans.js') - , Trips = require(__dirname+'/db-models/trips.js') - , Accounts = require(__dirname+'/db-models/accounts.js'); + const Boards = require(__dirname+'/db/boards.js') + , Posts = require(__dirname+'/db/posts.js') + , Bans = require(__dirname+'/db/bans.js') + , Trips = require(__dirname+'/db/trips.js') + , Accounts = require(__dirname+'/db/accounts.js'); console.log('deleting accounts') await Accounts.deleteAll(); console.log('deleting posts')