Files
NodeBB/src/socket.io/topics.js

329 lines
7.7 KiB
JavaScript
Raw Normal View History

2014-03-03 15:26:15 -05:00
'use strict';
var topics = require('../topics'),
2014-02-27 23:45:12 -05:00
categories = require('../categories'),
threadTools = require('../threadTools'),
2014-01-16 16:10:23 -05:00
index = require('./index'),
2014-02-10 14:15:54 -05:00
user = require('../user'),
db = require('./../database'),
2014-03-21 17:59:46 -04:00
meta = require('./../meta'),
2014-01-26 16:22:50 -05:00
async = require('async'),
SocketTopics = {};
2014-01-16 16:10:23 -05:00
SocketTopics.post = function(socket, data, callback) {
2014-01-14 07:39:01 -05:00
2014-01-16 19:58:57 -05:00
if(!data) {
return callback(new Error('[[error:invalid-data]]'));
2014-01-16 19:58:57 -05:00
}
if (!socket.uid && !parseInt(meta.config.allowGuestPosting, 10)) {
return callback(new Error('[[error:not-logged-in]]'));
}
2014-02-20 02:05:49 -05:00
topics.post({uid: socket.uid, title: data.title, content: data.content, cid: data.category_id, thumb: data.topic_thumb}, function(err, result) {
if(err) {
return callback(err);
}
if (result) {
2014-03-11 15:18:14 -04:00
2014-01-16 16:10:23 -05:00
index.server.sockets.in('category_' + data.category_id).emit('event:new_topic', result.topicData);
index.server.sockets.in('recent_posts').emit('event:new_topic', result.topicData);
2014-03-11 15:18:14 -04:00
index.server.sockets.in('home').emit('event:new_topic', result.topicData);
2014-03-11 18:46:16 -04:00
index.server.sockets.in('home').emit('event:new_post', {
posts: result.postData
});
2014-01-16 16:10:23 -05:00
index.server.sockets.in('user/' + socket.uid).emit('event:new_post', {
posts: result.postData
});
module.parent.exports.emitTopicPostStats();
2014-03-03 15:26:15 -05:00
callback();
}
});
};
2014-01-16 16:10:23 -05:00
SocketTopics.postcount = function(socket, tid, callback) {
topics.getTopicField(tid, 'postcount', callback);
};
SocketTopics.markAsRead = function(socket, data) {
if(!data || !data.tid || !data.uid) {
return;
}
topics.markAsRead(data.tid, data.uid, function(err) {
topics.pushUnreadCount(data.uid);
topics.markTopicNotificationsRead(data.tid, data.uid);
});
};
SocketTopics.markTidsRead = function(socket, tids, callback) {
2014-03-03 15:26:15 -05:00
if (!Array.isArray(tids)) {
2014-03-03 15:26:15 -05:00
return callback(new Error('invalid-data'));
}
topics.markTidsRead(socket.uid, tids, function(err) {
2014-01-16 16:10:23 -05:00
if(err) {
return callback(err);
}
2014-01-16 16:10:23 -05:00
topics.pushUnreadCount(socket.uid);
2014-01-16 16:10:23 -05:00
for (var i=0; i<tids.length; ++i) {
topics.markTopicNotificationsRead(tids[i], socket.uid);
}
2014-03-03 15:26:15 -05:00
callback();
});
};
SocketTopics.markAllRead = function(socket, data, callback) {
topics.getUnreadTids(socket.uid, 0, -1, function(err, tids) {
if (err) {
return callback(err);
}
SocketTopics.markTidsRead(socket, tids, callback);
});
};
SocketTopics.markCategoryTopicsRead = function(socket, cid, callback) {
topics.getUnreadTids(socket.uid, 0, -1, function(err, tids) {
if (err) {
return callback(err);
}
var keys = tids.map(function(tid) {
return 'topic:' + tid;
});
db.getObjectsFields(keys, ['tid', 'cid'], function(err, topicData) {
if (err) {
return callback(err);
}
tids = topicData.filter(function(topic) {
return parseInt(topic.cid, 10) === parseInt(cid, 10);
}).map(function(topic) {
return topic.tid;
});
SocketTopics.markTidsRead(socket, tids, callback);
});
});
};
2014-01-17 17:26:07 -05:00
SocketTopics.markAsUnreadForAll = function(socket, tid, callback) {
topics.markAsUnreadForAll(tid, function(err) {
if(err) {
return callback(err);
}
db.sortedSetAdd('topics:recent', Date.now(), tid, function(err) {
if(err) {
return callback(err);
}
topics.pushUnreadCount();
callback();
});
2014-01-17 17:26:07 -05:00
});
2014-03-21 17:59:46 -04:00
};
2014-01-17 17:26:07 -05:00
2014-01-16 19:58:57 -05:00
function doTopicAction(action, socket, tid, callback) {
if(!tid) {
return callback(new Error('Invalid tid'));
}
2014-01-16 19:58:57 -05:00
threadTools.privileges(tid, socket.uid, function(err, privileges) {
2014-01-16 16:10:23 -05:00
if(err) {
return callback(err);
}
2014-01-16 16:10:23 -05:00
2014-01-16 19:58:57 -05:00
if(!privileges || !privileges.editable) {
2014-01-16 16:10:23 -05:00
return callback(new Error('not-allowed'));
}
2014-01-16 19:58:57 -05:00
if(threadTools[action]) {
threadTools[action](tid, socket.uid, callback);
}
});
2014-03-21 17:59:46 -04:00
}
2014-01-16 19:58:57 -05:00
SocketTopics.delete = function(socket, tid, callback) {
doTopicAction('delete', socket, tid, callback);
};
2014-01-16 16:10:23 -05:00
2014-01-16 19:58:57 -05:00
SocketTopics.restore = function(socket, tid, callback) {
doTopicAction('restore', socket, tid, callback);
};
2014-01-16 16:10:23 -05:00
2014-01-16 19:58:57 -05:00
SocketTopics.lock = function(socket, tid, callback) {
doTopicAction('lock', socket, tid, callback);
};
2014-01-16 19:58:57 -05:00
SocketTopics.unlock = function(socket, tid, callback) {
doTopicAction('unlock', socket, tid, callback);
};
2014-01-16 16:10:23 -05:00
2014-01-16 19:58:57 -05:00
SocketTopics.pin = function(socket, tid, callback) {
doTopicAction('pin', socket, tid, callback);
};
2014-01-16 16:10:23 -05:00
2014-01-16 19:58:57 -05:00
SocketTopics.unpin = function(socket, tid, callback) {
doTopicAction('unpin', socket, tid, callback);
};
2014-01-16 16:10:23 -05:00
SocketTopics.createTopicFromPosts = function(socket, data, callback) {
if(!socket.uid) {
socket.emit('event:alert', {
title: 'Can&apos;t fork',
message: 'Guests can&apos;t fork topics!',
type: 'warning',
timeout: 2000
});
return;
}
2014-01-16 20:53:32 -05:00
if(!data || !data.title || !data.pids || !Array.isArray(data.pids)) {
return callback(new Error('invalid data'));
}
topics.createTopicFromPosts(socket.uid, data.title, data.pids, callback);
};
2014-01-16 16:10:23 -05:00
SocketTopics.movePost = function(socket, data, callback) {
if(!socket.uid) {
socket.emit('event:alert', {
title: 'Can&apos;t fork',
message: 'Guests can&apos;t fork topics!',
type: 'warning',
timeout: 2000
});
return;
}
2014-01-16 20:53:32 -05:00
if(!data || !data.pid || !data.tid) {
return callback(new Error('invalid data'));
}
2014-01-19 17:28:08 -05:00
threadTools.privileges(data.tid, socket.uid, function(err, privileges) {
if(err) {
return callback(err);
}
if(!(privileges.admin || privileges.moderator)) {
return callback(new Error('not allowed'));
}
topics.movePostToTopic(data.pid, data.tid, callback);
});
};
2014-01-16 16:10:23 -05:00
SocketTopics.move = function(socket, data, callback) {
2014-01-16 20:53:32 -05:00
if(!data || !data.tid || !data.cid) {
return callback(new Error('invalid data'));
}
2014-01-16 16:10:23 -05:00
threadTools.move(data.tid, data.cid, function(err) {
if(err) {
return callback(err);
}
index.server.sockets.in('topic_' + data.tid).emit('event:topic_moved', {
2014-01-16 20:53:32 -05:00
tid: data.tid
2014-01-16 16:10:23 -05:00
});
2014-01-16 20:53:32 -05:00
callback(null);
2014-01-16 16:10:23 -05:00
});
};
2014-01-16 16:10:23 -05:00
SocketTopics.followCheck = function(socket, tid, callback) {
2014-01-16 20:53:32 -05:00
threadTools.isFollowing(tid, socket.uid, callback);
};
2014-01-16 16:10:23 -05:00
SocketTopics.follow = function(socket, tid, callback) {
2014-01-16 20:53:32 -05:00
if(!socket.uid) {
return callback(new Error('not-logged-in'));
}
2014-01-16 20:53:32 -05:00
threadTools.toggleFollow(tid, socket.uid, callback);
};
2014-01-16 16:10:23 -05:00
SocketTopics.loadMore = function(socket, data, callback) {
if(!data || !data.tid || !(parseInt(data.after, 10) >= 0)) {
2014-01-16 20:53:32 -05:00
return callback(new Error('invalid data'));
}
2014-02-10 14:15:54 -05:00
user.getSettings(socket.uid, function(err, settings) {
if(err) {
return callback(err);
}
2014-01-24 20:00:56 -05:00
2014-02-10 14:15:54 -05:00
var start = parseInt(data.after, 10),
end = start + settings.postsPerPage - 1;
async.parallel({
posts: function(next) {
2014-02-26 16:43:21 -05:00
topics.getTopicPosts(data.tid, start, end, socket.uid, false, next);
2014-02-10 14:15:54 -05:00
},
privileges: function(next) {
threadTools.privileges(data.tid, socket.uid, next);
}
2014-03-10 00:17:06 -04:00
}, callback);
});
};
2014-01-16 16:10:23 -05:00
SocketTopics.loadMoreRecentTopics = function(socket, data, callback) {
2014-01-29 15:08:14 -05:00
if(!data || !data.term || !data.after) {
2014-01-16 20:53:32 -05:00
return callback(new Error('invalid data'));
}
2014-01-26 17:17:34 -05:00
var start = parseInt(data.after, 10),
end = start + 9;
2014-01-16 20:53:32 -05:00
topics.getLatestTopics(socket.uid, start, end, data.term, callback);
};
2014-01-16 16:10:23 -05:00
SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) {
2014-01-29 15:08:14 -05:00
if(!data || !data.after) {
return callback(new Error('invalid data'));
}
2014-01-26 17:17:34 -05:00
var start = parseInt(data.after, 10),
end = start + 9;
2014-01-16 20:53:32 -05:00
topics.getUnreadTopics(socket.uid, start, end, callback);
};
2014-01-30 19:46:25 -05:00
SocketTopics.loadMoreFromSet = function(socket, data, callback) {
if(!data || !data.after || !data.set) {
return callback(new Error('invalid data'));
}
var start = parseInt(data.after, 10),
end = start + 9;
topics.getTopicsFromSet(socket.uid, data.set, start, end, callback);
};
2014-01-24 20:00:56 -05:00
SocketTopics.getPageCount = function(socket, tid, callback) {
2014-02-10 14:15:54 -05:00
topics.getPageCount(tid, socket.uid, callback);
2014-01-30 19:46:25 -05:00
};
2014-01-24 20:00:56 -05:00
2014-02-27 23:45:12 -05:00
SocketTopics.getTidPage = function(socket, tid, callback) {
topics.getTidPage(tid, socket.uid, callback);
};
SocketTopics.getTidIndex = function(socket, tid, callback) {
categories.getTopicIndex(tid, callback);
};
module.exports = SocketTopics;