2014-03-03 15:26:15 -05:00
'use strict' ;
2014-01-10 10:46:26 -05:00
var topics = require ( '../topics' ) ,
2014-02-27 23:45:12 -05:00
categories = require ( '../categories' ) ,
2014-01-10 10:46:26 -05:00
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' ) ,
2014-02-21 22:13:13 -05:00
db = require ( './../database' ) ,
2014-01-26 16:22:50 -05:00
async = require ( 'async' ) ,
2014-01-10 10:46:26 -05:00
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 ( 'Invalid data' ) ) ;
}
if ( ! socket . uid && ! parseInt ( meta . config . allowGuestPosting , 10 ) ) {
2014-01-10 10:46:26 -05:00
socket . emit ( 'event:alert' , {
title : 'Post Unsuccessful' ,
message : 'You don't seem to be logged in, so you cannot reply.' ,
type : 'danger' ,
timeout : 2000
} ) ;
2014-01-23 15:46:39 -05:00
return callback ( new Error ( 'not-logged-in' ) ) ;
2014-01-10 10:46:26 -05:00
}
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 ) {
2014-01-10 10:46:26 -05:00
if ( err ) {
if ( err . message === 'title-too-short' ) {
2014-01-10 16:00:03 -05:00
module . parent . exports . emitAlert ( socket , 'Title too short' , 'Please enter a longer title. At least ' + meta . config . minimumTitleLength + ' characters.' ) ;
2014-01-10 10:46:26 -05:00
} else if ( err . message === 'title-too-long' ) {
2014-01-10 16:00:03 -05:00
module . parent . exports . emitAlert ( socket , 'Title too long' , 'Please enter a shorter title. Titles can\'t be longer than ' + meta . config . maximumTitleLength + ' characters.' ) ;
2014-01-10 10:46:26 -05:00
} else if ( err . message === 'content-too-short' ) {
2014-01-10 16:00:03 -05:00
module . parent . exports . emitContentTooShortAlert ( socket ) ;
2014-01-10 10:46:26 -05:00
} else if ( err . message === 'too-many-posts' ) {
2014-01-10 16:00:03 -05:00
module . parent . exports . emitTooManyPostsAlert ( socket ) ;
2014-01-10 10:46:26 -05:00
} else if ( err . message === 'no-privileges' ) {
socket . emit ( 'event:alert' , {
title : 'Unable to post' ,
message : 'You do not have posting privileges in this category.' ,
type : 'danger' ,
timeout : 7500
} ) ;
} else {
socket . emit ( 'event:alert' , {
title : 'Error' ,
message : err . message ,
type : 'warning' ,
timeout : 7500
} ) ;
}
2014-01-23 15:46:39 -05:00
return callback ( err ) ;
2014-01-10 10:46:26 -05:00
}
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' , {
2014-01-10 10:46:26 -05:00
posts : result . postData
} ) ;
module . parent . exports . emitTopicPostStats ( ) ;
2014-01-14 07:39:01 -05:00
socket . emit ( 'event:alert' , {
2014-01-10 10:46:26 -05:00
title : 'Thank you for posting' ,
message : 'You have successfully posted. Click here to view your post.' ,
type : 'success' ,
timeout : 2000
} ) ;
2014-03-03 15:26:15 -05:00
callback ( ) ;
2014-01-10 10:46:26 -05:00
}
} ) ;
} ;
2014-01-16 16:10:23 -05:00
SocketTopics . postcount = function ( socket , tid , callback ) {
2014-01-10 10:46:26 -05:00
topics . getTopicField ( tid , 'postcount' , callback ) ;
} ;
2014-01-21 10:06:13 -05:00
SocketTopics . markAsRead = function ( socket , data ) {
if ( ! data || ! data . tid || ! data . uid ) {
return ;
}
topics . markAsRead ( data . tid , data . uid , function ( err ) {
topics . pushUnreadCount ( data . uid ) ;
} ) ;
2014-02-21 22:13:13 -05:00
} ;
2014-01-21 10:06:13 -05:00
2014-01-16 16:10:23 -05:00
SocketTopics . markAllRead = function ( socket , data , callback ) {
2014-03-03 15:26:15 -05:00
if ( ! Array . isArray ( data ) ) {
return callback ( new Error ( 'invalid-data' ) ) ;
}
topics . markAllRead ( socket . uid , data , function ( err ) {
2014-01-16 16:10:23 -05:00
if ( err ) {
return callback ( err ) ;
2014-01-10 10:46:26 -05:00
}
2014-01-16 16:10:23 -05:00
2014-03-09 14:02:30 -04:00
index . server . sockets . in ( 'uid_' + socket . uid ) . emit ( 'event:unread.updateCount' , null , 0 ) ;
2014-01-16 16:10:23 -05:00
2014-03-03 15:26:15 -05:00
callback ( ) ;
2014-01-10 10:46:26 -05:00
} ) ;
} ;
2014-01-17 17:26:07 -05:00
SocketTopics . markAsUnreadForAll = function ( socket , tid , callback ) {
topics . markAsUnreadForAll ( tid , function ( err ) {
if ( err ) {
return callback ( err ) ;
}
2014-02-21 22:13:13 -05:00
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-01-16 19:58:57 -05:00
function doTopicAction ( action , socket , tid , callback ) {
if ( ! tid ) {
return callback ( new Error ( 'Invalid tid' ) ) ;
}
2014-01-10 10:46:26 -05:00
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-10 10:46:26 -05:00
}
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-01-10 10:46:26 -05:00
}
} ) ;
2014-02-21 22:13:13 -05:00
} ;
2014-01-10 10:46:26 -05: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-10 10:46:26 -05:00
} ;
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-10 10:46:26 -05:00
} ;
2014-01-16 16:10:23 -05:00
SocketTopics . createTopicFromPosts = function ( socket , data , callback ) {
if ( ! socket . uid ) {
2014-01-10 10:46:26 -05:00
socket . emit ( 'event:alert' , {
title : 'Can't fork' ,
message : 'Guests can'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-10 10:46:26 -05:00
} ;
2014-01-16 16:10:23 -05:00
SocketTopics . movePost = function ( socket , data , callback ) {
if ( ! socket . uid ) {
2014-01-10 10:46:26 -05:00
socket . emit ( 'event:alert' , {
title : 'Can't fork' ,
message : 'Guests can'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-10 10:46:26 -05:00
} ;
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-10 10:46:26 -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-10 10:46:26 -05:00
} ;
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-10 10:46:26 -05:00
}
2014-01-16 20:53:32 -05:00
threadTools . toggleFollow ( tid , socket . uid , callback ) ;
2014-01-10 10:46:26 -05:00
} ;
2014-01-16 16:10:23 -05:00
SocketTopics . loadMore = function ( socket , data , callback ) {
2014-02-17 20:57:12 -05:00
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 ) {
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-10 10:46:26 -05:00
} ) ;
} ;
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 ) ,
2014-01-10 10:46:26 -05:00
end = start + 9 ;
2014-01-16 20:53:32 -05:00
topics . getLatestTopics ( socket . uid , start , end , data . term , callback ) ;
2014-01-10 10:46:26 -05:00
} ;
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 ) ,
2014-01-10 10:46:26 -05:00
end = start + 9 ;
2014-01-16 20:53:32 -05:00
topics . getUnreadTopics ( socket . uid , start , end , callback ) ;
2014-01-10 10:46:26 -05:00
} ;
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 ) ;
} ;
2014-01-10 10:46:26 -05:00
module . exports = SocketTopics ;