|
|
|
'use strict';
|
|
|
|
|
|
|
|
var async = require('async'),
|
|
|
|
|
|
|
|
meta = require('../meta'),
|
|
|
|
db = require('../database'),
|
|
|
|
plugins = require('../plugins'),
|
|
|
|
user = require('../user'),
|
|
|
|
topics = require('../topics'),
|
|
|
|
categories = require('../categories');
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = function(Posts) {
|
|
|
|
Posts.create = function(data, callback) {
|
|
|
|
var uid = data.uid,
|
|
|
|
tid = data.tid,
|
|
|
|
content = data.content.toString(),
|
|
|
|
timestamp = data.timestamp || Date.now();
|
|
|
|
|
|
|
|
if (!uid && parseInt(uid, 10) !== 0) {
|
|
|
|
return callback(new Error('[[error:invalid-uid]]'));
|
|
|
|
}
|
|
|
|
|
|
|
|
var postData;
|
|
|
|
|
|
|
|
async.waterfall([
|
|
|
|
function(next) {
|
|
|
|
db.incrObjectField('global', 'nextPid', next);
|
|
|
|
},
|
|
|
|
function(pid, next) {
|
|
|
|
|
|
|
|
postData = {
|
|
|
|
'pid': pid,
|
|
|
|
'uid': uid,
|
|
|
|
'tid': tid,
|
|
|
|
'content': content,
|
|
|
|
'timestamp': timestamp,
|
|
|
|
'reputation': 0,
|
|
|
|
'votes': 0,
|
|
|
|
'editor': '',
|
|
|
|
'edited': 0,
|
|
|
|
'deleted': 0
|
|
|
|
};
|
|
|
|
|
|
|
|
if (data.toPid) {
|
|
|
|
postData.toPid = data.toPid;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data.ip && parseInt(meta.config.trackIpPerPost, 10) === 1) {
|
|
|
|
postData.ip = data.ip;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (parseInt(uid, 10) === 0 && data.handle) {
|
|
|
|
postData.handle = data.handle;
|
|
|
|
}
|
|
|
|
|
|
|
|
plugins.fireHook('filter:post.save', postData, next);
|
|
|
|
},
|
|
|
|
function(postData, next) {
|
|
|
|
db.setObject('post:' + postData.pid, postData, next);
|
|
|
|
},
|
|
|
|
function(next) {
|
|
|
|
async.parallel([
|
|
|
|
function(next) {
|
|
|
|
user.onNewPostMade(postData, next);
|
|
|
|
},
|
|
|
|
function(next) {
|
|
|
|
topics.onNewPostMade(postData, next);
|
|
|
|
},
|
|
|
|
function(next) {
|
|
|
|
topics.getTopicFields(tid, ['cid', 'pinned'], function(err, topicData) {
|
|
|
|
if (err) {
|
|
|
|
return next(err);
|
|
|
|
}
|
|
|
|
postData.cid = topicData.cid;
|
|
|
|
categories.onNewPostMade(topicData.cid, topicData.pinned, postData, next);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
function(next) {
|
|
|
|
db.sortedSetAdd('posts:pid', timestamp, postData.pid, next);
|
|
|
|
},
|
|
|
|
function(next) {
|
|
|
|
db.incrObjectField('global', 'postCount', next);
|
|
|
|
}
|
|
|
|
], function(err) {
|
|
|
|
if (err) {
|
|
|
|
return next(err);
|
|
|
|
}
|
|
|
|
plugins.fireHook('filter:post.get', postData, next);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
function(postData, next) {
|
|
|
|
plugins.fireHook('action:post.save', postData);
|
|
|
|
next(null, postData);
|
|
|
|
}
|
|
|
|
], callback);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|