Ability to edit newsposts reference #298

merge-requests/208/head
Thomas Lynch 4 years ago
parent 77529034a6
commit cf43f650d6
  1. 2
      controllers/forms.js
  2. 40
      controllers/forms/editnews.js
  3. 7
      controllers/pages.js
  4. 19
      db/news.js
  5. 7
      helpers/paramconverter.js
  6. 1
      models/forms/addnews.js
  7. 35
      models/forms/editnews.js
  8. 25
      models/pages/editnews.js
  9. 1
      models/pages/index.js
  10. 7
      views/mixins/newspost.pug
  11. 23
      views/pages/editnews.pug
  12. 2
      views/pages/globalmanagenews.pug

@ -31,6 +31,7 @@ const express = require('express')
, addCustomPageController = require(__dirname+'/forms/addcustompage.js')
, deleteCustomPageController = require(__dirname+'/forms/deletecustompage.js')
, addNewsController = require(__dirname+'/forms/addnews.js')
, editNewsController = require(__dirname+'/forms/editnews.js')
, deleteNewsController = require(__dirname+'/forms/deletenews.js')
, uploadBannersController = require(__dirname+'/forms/uploadbanners.js')
, deleteBannersController = require(__dirname+'/forms/deletebanners.js')
@ -82,6 +83,7 @@ router.post('/global/editbans', useSession, sessionRefresh, csrf, calcPerms, isL
//router.post('/global/addban', geoAndTor, torPreBypassCheck, processIp, useSession, sessionRefresh, csrf, calcPerms, isLoggedIn, hasPerms(1), paramConverter, addBanController); //add ban manually without post
router.post('/global/deleteboard', useSession, sessionRefresh, csrf, paramConverter, calcPerms, isLoggedIn, hasPerms(1), deleteBoardController); //delete board
router.post('/global/addnews', useSession, sessionRefresh, csrf, calcPerms, isLoggedIn, hasPerms(0), addNewsController); //add new newspost
router.post('/global/editnews', useSession, sessionRefresh, csrf, calcPerms, isLoggedIn, hasPerms(0), paramConverter, editNewsController); //add new newspost
router.post('/global/deletenews', useSession, sessionRefresh, csrf, calcPerms, isLoggedIn, hasPerms(0), paramConverter, deleteNewsController); //delete news
router.post('/global/editaccounts', useSession, sessionRefresh, csrf, calcPerms, isLoggedIn, hasPerms(0), paramConverter, editAccountsController); //account editing
router.post('/global/settings', useSession, sessionRefresh, csrf, calcPerms, isLoggedIn, hasPerms(0), paramConverter, globalSettingsController); //global settings

@ -0,0 +1,40 @@
'use strict';
const editNews = require(__dirname+'/../../models/forms/editnews.js')
, dynamicResponse = require(__dirname+'/../../helpers/dynamic.js');
module.exports = async (req, res, next) => {
const errors = [];
if (!req.body.news_id) {
errors.push('Missing news id');
}
if (!req.body.message || res.locals.messageLength === 0) {
errors.push('Missing message');
}
if (res.locals.messageLength > 10000) {
errors.push('Message must be 10000 characters or less');
}
if (!req.body.title || req.body.title.length === 0) {
errors.push('Missing title');
}
if (req.body.title.length > 50) {
errors.push('Title must be 50 characters or less');
}
if (errors.length > 0) {
return dynamicResponse(req, res, 400, 'message', {
'title': 'Bad request',
'errors': errors,
'redirect': req.headers.referer || '/globalmanage/news.html'
});
}
try {
await editNews(req, res, next);
} catch (err) {
return next(err);
}
}

@ -21,7 +21,7 @@ const express = require('express')
manageBoard, manageThread, manageLogs, manageCatalog, manageCustomPages } = require(__dirname+'/../models/pages/manage/')
, { globalManageSettings, globalManageReports, globalManageBans, globalManageBoards,
globalManageRecent, globalManageAccounts, globalManageNews, globalManageLogs } = require(__dirname+'/../models/pages/globalmanage/')
, { changePassword, blockBypass, home, register, login, create,
, { changePassword, blockBypass, home, register, login, create, editNews,
board, catalog, banners, randombanner, news, captchaPage, overboard, overboardCatalog,
captcha, thread, modlog, modloglist, account, boardlist, customPage } = require(__dirname+'/../models/pages/');
@ -69,6 +69,11 @@ router.get('/globalmanage/news.html', useSession, sessionRefresh, isLoggedIn, ca
router.get('/globalmanage/accounts.html', useSession, sessionRefresh, isLoggedIn, calcPerms, hasPerms(0), csrf, globalManageAccounts);
router.get('/globalmanage/settings.html', useSession, sessionRefresh, isLoggedIn, calcPerms, hasPerms(0), csrf, globalManageSettings);
//edit pages
router.get('/editnews/:newsid([a-f0-9]{24}).html', useSession, sessionRefresh, isLoggedIn, calcPerms, hasPerms(0), csrf, paramConverter, editNews);
//TODO: edit post get endpoint
//TODO: edit board custom page get endpoint
//captcha
if (captchaOptions.type !== 'google' && captchaOptions.type !== 'hcaptcha') {
router.get('/captcha', geoAndTor, processIp, captcha); //get captcha image and cookie

@ -16,6 +16,25 @@ module.exports = {
.toArray();
},
findOne: (id) => {
return db.findOne({
'_id': id,
});
},
updateOne: (id, title, raw, markdown) => {
return db.updateOne({
'_id': id,
}, {
'$set': {
'title': title,
'message.raw': raw,
'message.markdown': markdown,
'edited': new Date(),
}
});
},
insertOne: (news) => {
return db.insertOne(news);
},

@ -104,6 +104,13 @@ module.exports = (req, res, next) => {
}
}
//ids for newspost editing
if (req.params.newsid) {
req.params.newsid = ObjectId(req.params.newsid);
}
if (req.body.news_id) {
req.body.news_id = ObjectId(req.body.news_id);
}
//thread id
if (req.params.id) {
req.params.id = +req.params.id;

@ -18,6 +18,7 @@ module.exports = async (req, res, next) => {
'markdown': markdownNews
},
'date': new Date(),
'edited': null,
};
await News.insertOne(post);

@ -0,0 +1,35 @@
'use strict';
const { News } = require(__dirname+'/../../db/')
, dynamicResponse = require(__dirname+'/../../helpers/dynamic.js')
, buildQueue = require(__dirname+'/../../queue.js')
, { prepareMarkdown } = require(__dirname+'/../../helpers/posting/markdown.js')
, messageHandler = require(__dirname+'/../../helpers/posting/message.js');
module.exports = async (req, res, next) => {
const message = prepareMarkdown(req.body.message, false);
const { message: markdownNews } = await messageHandler(message, null, null);
const updated = await News.updateOne(req.body.news_id, req.body.title, message, markdownNews).then(r => r.matchedCount);
if (updated === 0) {
return dynamicResponse(req, res, 400, 'message', {
'title': 'Bad request',
'errors': 'News post does not exist',
'redirect': req.headers.referer || '/globalmanage/news.html'
});
}
buildQueue.push({
'task': 'buildNews',
'options': {}
});
return dynamicResponse(req, res, 200, 'message', {
'title': 'Success',
'message': 'Updated newspost',
'redirect': '/globalmanage/news.html'
});
}

@ -0,0 +1,25 @@
'use strict';
const { News } = require(__dirname+'/../../db/');
module.exports = async (req, res, next) => {
let news;
try {
news = await News.findOne(req.params.newsid);
} catch (err) {
return next(err)
}
if (!news) {
return next();
}
res
.set('Cache-Control', 'private, max-age=5')
.render('editnews', {
csrf: req.csrfToken(),
news,
});
}

@ -22,4 +22,5 @@ module.exports = {
boardlist: require(__dirname+'/boardlist.js'),
overboard: require(__dirname+'/overboard.js'),
overboardCatalog: require(__dirname+'/overboardcatalog.js'),
editNews: require(__dirname+'/editnews.js'),
}

@ -8,6 +8,7 @@ mixin newspost(post, globalmanage=false)
input.left.post-check(type='checkbox', name='checkednews' value=post._id)
a.left(href=`#${post._id}`) #{post.title}
- const newsDate = new Date(post.date);
a.right.ml-5(href=`/editnews/${post._id}.html`) [Edit]
time.right.reltime(datetime=newsDate.toISOString()) #{newsDate.toLocaleString(undefined, {hourCycle:'h23'})}
tr
td
@ -15,3 +16,9 @@ mixin newspost(post, globalmanage=false)
p.no-m-p #{`${post.message.raw.substring(0,50)}...`}
else
pre.post-message.no-m-p !{post.message.markdown}
if post.edited
small.right.cb.edited
| Last edited
- const newsEditDate = new Date(post.edited);
time.reltime(datetime=newsEditDate.toISOString()) #{newsEditDate.toLocaleString(undefined, {hourCycle:'h23'})}

@ -0,0 +1,23 @@
extends ../layout.pug
block head
title Edit News
block content
h1.board-title Edit News
include ../includes/stickynav.pug
.form-wrapper.flex-center.mv-10
form.form-post(action='/forms/global/editnews' method='POST')
input(type='hidden' name='_csrf' value=csrf)
input(type='hidden' name='news_id' value=news._id)
.table-container.flex-center.mv-5
table
tr
th
input.edit.left(type='text' name='title' value=news.title required)
- const newsDate = new Date(news.date);
time.right.reltime(datetime=newsDate.toISOString()) #{newsDate.toLocaleString(undefined, {hourCycle:'h23'})}
tr
td
textarea.edit.fw(name='message' rows='10' placeholder='Supports post styling' required) #{news.message.raw}
input(type='submit', value='save')

@ -23,7 +23,7 @@ block content
input(type='submit', value='submit')
if news.length > 0
hr(size=1)
h4.no-m-p Delete News:
h4.no-m-p Manage News:
.form-wrapper.flexleft
form.form-post(action=`/forms/global/deletenews`, enctype='application/x-www-form-urlencoded', method='POST')
input(type='hidden' name='_csrf' value=csrf)

Loading…
Cancel
Save