You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
2.1 KiB
JavaScript

'use strict';
const nconf = require('nconf');
const user = require('../user');
const plugins = require('../plugins');
const topics = require('../topics');
const posts = require('../posts');
const helpers = require('./helpers');
exports.get = async function (req, res, callback) {
res.locals.metaTags = {
...res.locals.metaTags,
name: 'robots',
content: 'noindex',
};
const data = await plugins.hooks.fire('filter:composer.build', {
req: req,
res: res,
next: callback,
templateData: {},
});
if (res.headersSent) {
return;
}
if (!data || !data.templateData) {
return callback(new Error('[[error:invalid-data]]'));
}
if (data.templateData.disabled) {
res.render('', {
title: '[[modules:composer.compose]]',
});
} else {
data.templateData.title = '[[modules:composer.compose]]';
res.render('compose', data.templateData);
}
};
exports.post = async function (req, res) {
const { body } = req;
const data = {
uid: req.uid,
req: req,
timestamp: Date.now(),
content: body.content,
fromQueue: false,
};
req.body.noscript = 'true';
if (!data.content) {
return helpers.noScriptErrors(req, res, '[[error:invalid-data]]', 400);
}
async function queueOrPost(postFn, data) {
const shouldQueue = await posts.shouldQueue(req.uid, data);
if (shouldQueue) {
delete data.req;
return await posts.addToQueue(data);
}
return await postFn(data);
}
try {
let result;
if (body.tid) {
data.tid = body.tid;
result = await queueOrPost(topics.reply, data);
} else if (body.cid) {
data.cid = body.cid;
data.title = body.title;
data.tags = [];
data.thumb = '';
result = await queueOrPost(topics.post, data);
} else {
throw new Error('[[error:invalid-data]]');
}
if (result.queued) {
return res.redirect(`${nconf.get('relative_path') || '/'}?noScriptMessage=[[success:post-queued]]`);
}
const uid = result.uid ? result.uid : result.topicData.uid;
user.updateOnlineUsers(uid);
const path = result.pid ? `/post/${result.pid}` : `/topic/${result.topicData.slug}`;
res.redirect(nconf.get('relative_path') + path);
} catch (err) {
helpers.noScriptErrors(req, res, err.message, 400);
}
};