Skip to content

Commit

Permalink
Merge 661bdc8 into 2da3251
Browse files Browse the repository at this point in the history
  • Loading branch information
BenLubar committed Oct 28, 2016
2 parents 2da3251 + 661bdc8 commit bd28b6f
Show file tree
Hide file tree
Showing 9 changed files with 155 additions and 3 deletions.
1 change: 1 addition & 0 deletions public/language/en_GB/topic.json
Expand Up @@ -16,6 +16,7 @@
"notify_me": "Be notified of new replies in this topic",
"quote": "Quote",
"reply": "Reply",
"replies_to_this_post": "Replies: %1",
"reply-as-topic": "Reply as topic",
"guest-login-reply": "Log in to reply",
"edit": "Edit",
Expand Down
4 changes: 3 additions & 1 deletion public/src/client/topic.js
Expand Up @@ -9,10 +9,11 @@ define('forum/topic', [
'forum/topic/postTools',
'forum/topic/events',
'forum/topic/posts',
'forum/topic/replies',
'navigator',
'sort',
'components'
], function (infinitescroll, threadTools, postTools, events, posts, navigator, sort, components) {
], function (infinitescroll, threadTools, postTools, events, posts, replies, navigator, sort, components) {
var Topic = {},
currentUrl = '';

Expand Down Expand Up @@ -51,6 +52,7 @@ define('forum/topic', [

postTools.init(tid);
threadTools.init(tid);
replies.init(tid);
events.init();

sort.handleSort('topicPostSort', 'user.setTopicSort', 'topic/' + ajaxify.data.slug);
Expand Down
60 changes: 60 additions & 0 deletions public/src/client/topic/replies.js
@@ -0,0 +1,60 @@
'use strict';

/* globals define, app, ajaxify, bootbox, socket, templates, utils, config */

define('forum/topic/replies', ['navigator', 'components', 'translator'], function (navigator, components, translator) {

var Replies = {};

Replies.init = function (tid) {
addPostHandlers(tid);
};

function addPostHandlers(tid) {
var postContainer = components.get('topic');

postContainer.on('click', '[component="post/reply-count"]', function () {
onRepliesClicked($(this), tid);
});
}

function onRepliesClicked(button, tid) {
var post = button.parents('[data-pid]');
var pid = post.data('pid');
var open = button.children('[component="post/replies/open"]');
var loading = button.children('[component="post/replies/loading"]');
var close = button.children('[component="post/replies/close"]');

if (open.is(':not(.hidden)')) {
open.addClass('hidden');
loading.removeClass('hidden');

socket.emit('posts.getReplies', pid, function (err, data) {
if (err) {
loading.addClass('hidden');
open.removeClass('hidden');

return app.alertError(err.message);
}

loading.addClass('hidden');
close.removeClass('hidden');

templates.parse('partials/posts_list', data, function (html) {
translator.translate(html, function (translated) {
$('<div>', {component: 'post/replies'}).html(translated).hide().insertAfter(button).slideDown('fast');
});
});
});
} else if (close.is(':not(.hidden)')) {
close.addClass('hidden');
open.removeClass('hidden');

post.find('[component="post/replies"]').slideUp('fast', function () {
$(this).remove();
});
}
}

return Replies;
});
9 changes: 9 additions & 0 deletions src/posts/create.js
Expand Up @@ -82,6 +82,15 @@ module.exports = function (Posts) {
function (next) {
db.sortedSetAdd('posts:pid', timestamp, postData.pid, next);
},
function (next) {
if (!postData.toPid) {
return next(null);
}
async.parallel([
async.apply(db.sortedSetAdd, 'pid:' + postData.toPid + ':replies', timestamp, postData.pid),
async.apply(db.incrObjectField, 'post:' + postData.toPid, 'replies')
], next);
},
function (next) {
db.incrObjectField('global', 'postCount', next);
}
Expand Down
14 changes: 14 additions & 0 deletions src/posts/delete.js
Expand Up @@ -137,6 +137,20 @@ module.exports = function (Posts) {
function (next) {
deletePostFromUsersVotes(pid, next);
},
function (next) {
Posts.getPostField(pid, 'toPid', function (err, toPid) {
if (err) {
return next(err);
}
if (!parseInt(toPid, 10)) {
return next(null);
}
async.parallel([
async.apply(db.sortedSetRemove, 'pid:' + toPid + ':replies', pid),
async.apply(db.decrObjectField, 'post:' + toPid, 'replies')
], next);
});
},
function (next) {
db.sortedSetsRemove(['posts:pid', 'posts:flagged'], pid, next);
},
Expand Down
7 changes: 7 additions & 0 deletions src/socket.io/posts.js
Expand Up @@ -118,6 +118,13 @@ SocketPosts.getPidIndex = function (socket, data, callback) {
posts.getPidIndex(data.pid, data.tid, data.topicPostSort, callback);
};

SocketPosts.getReplies = function (socket, pid, callback) {
if (!utils.isNumber(pid)) {
return callback(new Error('[[error:invalid-data]'));
}

posts.getPostSummariesFromSet('pid:' + pid + ':replies', socket.uid, 0, -1, callback);
};


module.exports = SocketPosts;
1 change: 1 addition & 0 deletions src/topics/posts.js
Expand Up @@ -123,6 +123,7 @@ module.exports = function (Topics) {
postObj.upvoted = results.voteData.upvotes[i];
postObj.downvoted = results.voteData.downvotes[i];
postObj.votes = postObj.votes || 0;
postObj.replies = postObj.replies || 0;
postObj.selfPost = !!parseInt(uid, 10) && parseInt(uid, 10) === parseInt(postObj.uid, 10);

// Username override for guests, if enabled
Expand Down
41 changes: 40 additions & 1 deletion src/upgrade.js
Expand Up @@ -10,7 +10,7 @@ var db = require('./database'),
schemaDate, thisSchemaDate,

// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
latestSchema = Date.UTC(2016, 9, 8);
latestSchema = Date.UTC(2016, 9, 14);

Upgrade.check = function (callback) {
db.get('schemaDate', function (err, value) {
Expand Down Expand Up @@ -907,6 +907,45 @@ Upgrade.upgrade = function (callback) {
winston.info('[2016/10/8] favourite -> bookmark refactor - skipped!');
next();
}
},
function (next) {
thisSchemaDate = Date.UTC(2016, 9, 14);

if (schemaDate < thisSchemaDate) {
updatesMade = true;
winston.info('[2016/10/14] Creating sorted sets for post replies');

var posts = require('./posts');
var batch = require('./batch');
batch.processSortedSet('posts:pid', function (ids, next) {
posts.getPostsFields(ids, ['pid', 'toPid', 'timestamp'], function (err, data) {
if (err) {
return next(err);
}

async.eachSeries(data, function (postData, next) {
if (!parseInt(postData.toPid, 10)) {
return next(null);
}
console.log('processing pid: ' + postData.pid + ' toPid: ' + postData.toPid);
async.parallel([
async.apply(db.sortedSetAdd, 'pid:' + postData.toPid + ':replies', postData.timestamp, postData.pid),
async.apply(db.incrObjectField, 'post:' + postData.toPid, 'replies')
], next);
}, next);
});
}, function (err) {
if (err) {
return next(err);
}

winston.info('[2016/10/14] Creating sorted sets for post replies - done');
Upgrade.update(thisSchemaDate, next);
});
} else {
winston.info('[2016/10/14] Creating sorted sets for post replies - skipped!');
next();
}
}
// Add new schema updates here
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 24!!!
Expand Down
21 changes: 20 additions & 1 deletion test/topics.js
Expand Up @@ -2,7 +2,7 @@
/*global require, before, beforeEach, after*/

var async = require('async');
var assert = require('assert');
var assert = require('assert');
var validator = require('validator');
var nconf = require('nconf');

Expand All @@ -11,6 +11,7 @@ var topics = require('../src/topics');
var categories = require('../src/categories');
var User = require('../src/user');
var groups = require('../src/groups');
var socketPosts = require('../src/socket.io/posts');

describe('Topic\'s', function () {
var topic;
Expand Down Expand Up @@ -120,6 +121,24 @@ describe('Topic\'s', function () {
});
});

it('should handle direct replies', function (done) {
topics.reply({uid: topic.userId, content: 'test reply', tid: newTopic.tid, toPid: newPost.pid}, function (err, result) {
assert.equal(err, null, 'was created with error');
assert.ok(result);

socketPosts.getReplies({uid: 0}, newPost.pid, function (err, response) {
assert.equal(err, null, 'posts.getReplies returned error');

assert.ok(response);

assert.equal(response.posts.length, 1, 'should have 1 result');
assert.equal(response.posts[0].pid, result.pid, 'result should be the reply we added');

done();
});
});
});

it('should fail to create new reply with invalid user id', function (done) {
topics.reply({uid: null, content: 'test post', tid: newTopic.tid}, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
Expand Down

0 comments on commit bd28b6f

Please sign in to comment.