@ -1,10 +1,12 @@
'use strict' ;
'use strict' ;
var async = require ( 'async' ) ,
var async = require ( 'async' ) ;
db = require ( '../database' ) ,
privileges = require ( '../privileges' ) ,
var db = require ( '../database' ) ;
plugins = require ( '../plugins' ) ,
var privileges = require ( '../privileges' ) ;
utils = require ( '../../public/src/utils' ) ;
var groups = require ( '../groups' ) ;
var plugins = require ( '../plugins' ) ;
var utils = require ( '../../public/src/utils' ) ;
module . exports = function ( Categories ) {
module . exports = function ( Categories ) {
@ -17,6 +19,7 @@ module.exports = function(Categories) {
db . incrObjectField ( 'global' , 'nextCid' , next ) ;
db . incrObjectField ( 'global' , 'nextCid' , next ) ;
} ,
} ,
function ( cid , next ) {
function ( cid , next ) {
data . name = data . name || 'Category ' + cid ;
var slug = cid + '/' + utils . slugify ( data . name ) ;
var slug = cid + '/' + utils . slugify ( data . name ) ;
var order = data . order || cid ; // If no order provided, place it at the end
var order = data . order || cid ; // If no order provided, place it at the end
var colours = Categories . assignColours ( ) ;
var colours = Categories . assignColours ( ) ;
@ -58,6 +61,12 @@ module.exports = function(Categories) {
] , next ) ;
] , next ) ;
} ,
} ,
function ( results , next ) {
function ( results , next ) {
if ( data . cloneFromCid && parseInt ( data . cloneFromCid , 10 ) ) {
return Categories . copySettingsFrom ( data . cloneFromCid , category . cid , next ) ;
}
next ( null , category ) ;
} ,
function ( category , next ) {
plugins . fireHook ( 'action:category.create' , category ) ;
plugins . fireHook ( 'action:category.create' , category ) ;
next ( null , category ) ;
next ( null , category ) ;
}
}
@ -65,10 +74,94 @@ module.exports = function(Categories) {
} ;
} ;
Categories . assignColours = function ( ) {
Categories . assignColours = function ( ) {
var backgrounds = [ '#AB4642' , '#DC9656' , '#F7CA88' , '#A1B56C' , '#86C1B9' , '#7CAFC2' , '#BA8BAF' , '#A16946' ] ,
var backgrounds = [ '#AB4642' , '#DC9656' , '#F7CA88' , '#A1B56C' , '#86C1B9' , '#7CAFC2' , '#BA8BAF' , '#A16946' ] ;
text = [ '#fff' , '#fff' , '#333' , '#fff' , '#333' , '#fff' , '#fff' , '#fff' ] ,
var text = [ '#fff' , '#fff' , '#333' , '#fff' , '#333' , '#fff' , '#fff' , '#fff' ] ;
index = Math . floor ( Math . random ( ) * backgrounds . length ) ;
var index = Math . floor ( Math . random ( ) * backgrounds . length ) ;
return [ backgrounds [ index ] , text [ index ] ] ;
return [ backgrounds [ index ] , text [ index ] ] ;
} ;
} ;
Categories . copySettingsFrom = function ( fromCid , toCid , callback ) {
var destination ;
async . waterfall ( [
function ( next ) {
async . parallel ( {
source : async . apply ( db . getObject , 'category:' + fromCid ) ,
destination : async . apply ( db . getObject , 'category:' + toCid )
} , next ) ;
} ,
function ( results , next ) {
if ( ! results . source ) {
return next ( new Error ( '[[error:invalid-cid]]' ) ) ;
}
destination = results . destination ;
var tasks = [ ] ;
if ( parseInt ( results . source . parentCid , 10 ) ) {
tasks . push ( async . apply ( db . sortedSetAdd , 'cid:' + results . source . parentCid + ':children' , results . source . order , toCid ) ) ;
}
if ( destination && parseInt ( destination . parentCid , 10 ) ) {
tasks . push ( async . apply ( db . sortedSetRemove , 'cid:' + destination . parentCid + ':children' , toCid ) ) ;
}
destination . description = results . source . description ;
destination . descriptionParsed = results . source . descriptionParsed ;
destination . icon = results . source . icon ;
destination . bgColor = results . source . bgColor ;
destination . color = results . source . color ;
destination . link = results . source . link ;
destination . numRecentReplies = results . source . numRecentReplies ;
destination . class = results . source . class ;
destination . imageClass = results . source . imageClass ;
destination . parentCid = results . source . parentCid || 0 ;
tasks . push ( async . apply ( db . setObject , 'category:' + toCid , destination ) ) ;
async . series ( tasks , next ) ;
} ,
function ( results , next ) {
Categories . copyPrivilegesFrom ( fromCid , toCid , next ) ;
}
] , function ( err ) {
callback ( err , destination ) ;
} ) ;
} ;
Categories . copyPrivilegesFrom = function ( fromCid , toCid , callback ) {
var privilegeList = [
'find' , 'read' , 'topics:create' , 'topics:reply' , 'purge' , 'mods' ,
'groups:find' , 'groups:read' , 'groups:topics:create' , 'groups:topics:reply' , 'groups:purge' , 'groups:moderate'
] ;
async . each ( privilegeList , function ( privilege , next ) {
copyPrivilege ( privilege , fromCid , toCid , next ) ;
} , callback ) ;
} ;
function copyPrivilege ( privilege , fromCid , toCid , callback ) {
async . waterfall ( [
function ( next ) {
db . getSortedSetRange ( 'group:cid:' + toCid + ':privileges:' + privilege + ':members' , 0 , - 1 , next ) ;
} ,
function ( currentMembers , next ) {
async . eachSeries ( currentMembers , function ( member , next ) {
groups . leave ( 'cid:' + toCid + ':privileges:' + privilege , member , next ) ;
} , next ) ;
} ,
function ( next ) {
db . getSortedSetRange ( 'group:cid:' + fromCid + ':privileges:' + privilege + ':members' , 0 , - 1 , next ) ;
} ,
function ( members , next ) {
if ( ! members || ! members . length ) {
return callback ( ) ;
}
async . eachSeries ( members , function ( member , next ) {
groups . join ( 'cid:' + toCid + ':privileges:' + privilege , member , next ) ;
} , next ) ;
}
] , callback ) ;
}
} ;
} ;