way to delete banners

merge-requests/208/head
fatchan 5 years ago
parent 92f8e993d9
commit 82bc97ea3f
  1. 37
      controllers/forms.js
  2. 26
      db/boards.js
  3. 28
      models/forms/deletebanners.js
  4. 2
      models/forms/make-post.js
  5. 9
      models/forms/uploadbanners.js
  6. 2
      server.js
  7. 6
      static/css/style.css
  8. 18
      views/includes/bannerform.pug

@ -10,6 +10,7 @@ const express = require('express')
, removeBans = require(__dirname+'/../models/forms/removebans.js')
, makePost = require(__dirname+'/../models/forms/make-post.js')
, uploadBanners = require(__dirname+'/../models/forms/uploadbanners.js')
, deleteBanners = require(__dirname+'/../models/forms/deletebanners.js')
, deletePosts = require(__dirname+'/../models/forms/delete-post.js')
, spoilerPosts = require(__dirname+'/../models/forms/spoiler-post.js')
, reportPosts = require(__dirname+'/../models/forms/report-post.js')
@ -182,6 +183,42 @@ router.post('/board/:board/addbanners', Boards.exists, banCheck, hasPerms, numbe
});
//delete banners
router.post('/board/:board/deletebanners', Boards.exists, banCheck, hasPerms, numberConverter, async (req, res, next) => {
const errors = [];
if (!req.body.checkedbanners || req.body.checkedbanners.length === 0 || req.body.checkedbanners.length > 10) {
errors.push('Must select 1-10 banners to delete');
}
if (errors.length > 0) {
return res.status(400).render('message', {
'title': 'Bad request',
'errors': errors,
'redirect': `/${req.params.board}/manage`
})
}
for (let i = 0; i < req.body.checkedbanners.length; i++) {
if (!res.locals.board.banners.includes(req.body.checkedbanners[i])) {
return res.status(400).render('message', {
'title': 'Bad request',
'errors': 'Invalid banners selected',
'redirect': `/${req.params.board}/manage`
})
}
}
try {
await deleteBanners(req, res, next);
} catch (err) {
console.error(err);
return next(err);
}
});
//report/delete/spoiler/ban
router.post('/board/:board/actions', Boards.exists, banCheck, numberConverter, async (req, res, next) => {

@ -1,8 +1,7 @@
'use strict';
const Mongo = require(__dirname+'/db.js')
, db = Mongo.client.db('jschan')
, boardCache = new Map();
, db = Mongo.client.db('jschan');
module.exports = {
@ -32,6 +31,18 @@ module.exports = {
return db.collection('boards').deleteMany({});
},
removeBanners: (board, filenames) => {
return db.collection('boards').updateOne(
{
'_id': board,
}, {
'$pullAll': {
'banners': filenames
}
}
);
},
addBanners: (board, filenames) => {
return db.collection('boards').updateOne(
{
@ -46,18 +57,9 @@ module.exports = {
);
},
cache: async () => {
const boards = await module.exports.find();
for (let i = 0; i < boards.length; i++) {
const board = boards[i];
boardCache.set(board._id, board);
}
},
exists: async (req, res, next) => {
//const board = await module.exports.findOne(req.params.board);
const board = boardCache.get(req.params.board);
const board = await module.exports.findOne(req.params.board);
if (!board) {
return res.status(404).render('404');
}

@ -0,0 +1,28 @@
'use strict';
const uuidv4 = require('uuid/v4')
, path = require('path')
, util = require('util')
, fs = require('fs')
, unlink = util.promisify(fs.unlink)
, uploadDirectory = require(__dirname+'/../../helpers/uploadDirectory.js')
, Boards = require(__dirname+'/../../db/boards.js');
module.exports = async (req, res, next) => {
const redirect = `/${req.params.board}/manage`
await Promise.all(req.body.checkedbanners.map(async filename => {
unlink(uploadDirectory + filename);
}));
// i dont think there is a way to get the number of array items removed with $pullAll
// so i cant return how many banners were deleted
await Boards.removeBanners(req.params.board, req.body.checkedbanners);
return res.render('message', {
'title': 'Success',
'message': `Deleted banners.`,
'redirect': redirect
});
}

@ -152,7 +152,7 @@ console.log(file);
//tripcode
if (groups.tripcode) {
const tripcode = await getTripCode(groups.tripcode);
name += `!!${tripcode}`;
name += `##${tripcode}`;
}
//capcode
if (groups.capcode && hasPerms(req, res)) {

@ -11,8 +11,7 @@ const uuidv4 = require('uuid/v4')
module.exports = async (req, res, next, numFiles) => {
// check if this is responding to an existing thread
let redirect = `/${req.params.board}/manage`
const redirect = `/${req.params.board}/manage`
// check all mime types befoer we try saving anything
for (let i = 0; i < numFiles; i++) {
@ -57,6 +56,10 @@ module.exports = async (req, res, next, numFiles) => {
await Boards.addBanners(req.params.board, filenames);
return res.redirect(redirect);
return res.render('message', {
'title': 'Success',
'message': `Uploaded ${filenames.length} banners.`,
'redirect': redirect
});
}

@ -20,8 +20,6 @@ const express = require('express')
// let db connect
await Mongo.connect();
const Boards = require(__dirname+'/db/boards.js');
await Boards.cache();
// parse forms and allow file uploads
app.use(bodyParser.urlencoded({extended: true}));

@ -256,8 +256,14 @@ input textarea {
color: white;
}
.banner-check {
display: flex;
align-items: center;
}
.board-banner {
margin: 10px;
max-width: 100%;
}
.board-description {

@ -1,14 +1,20 @@
section.form-wrapper
label.toggle-label Upload Banners
label.toggle-label Add Banners
input.toggle(type='checkbox')
form.form-post.togglable(action=`/forms/board/${board._id}/addbanners`, enctype='multipart/form-data', method='POST')
input(type='hidden' name='_csrf' value=csrf)
span
input#file(type='file', name='file' multiple)
input(type='submit', value='submit')
section.form-wrapper
label.toggle-label Delete Banners
input.toggle(type='checkbox')
form.form-post.togglable(action=`/forms/board/${board._id}/deletebanners`, enctype='application/x-www-form-urlencoded', method='POST')
input(type='hidden' name='_csrf' value=csrf)
each banner in board.banners
label.banner-check
input(type='checkbox' name='checkedbanners[]' value=banner)
object.board-banner(data=`/img/${banner}` width='300' height='100')
input(type='submit', value='submit')

Loading…
Cancel
Save