diff --git a/coffee/components-manager.coffee b/coffee/components-manager.coffee index 95b6705..03113db 100644 --- a/coffee/components-manager.coffee +++ b/coffee/components-manager.coffee @@ -318,12 +318,13 @@ commandFunctions = # if action module params were send, store them oParams = oPayload.action_params - db.actionInvokers.storeUserParams id, user.username, JSON.stringify params for id, params of oParams + for id, params of oParams + db.actionInvokers.storeUserParams id, user.username, JSON.stringify params oParams = oPayload.action_functions # if action function arguments were send, store them for id, params of oParams arr = id.split ' -> ' - db.actionInvokers.storeUserArguments arr[ 0 ], arr[ 1 ], user.username, JSON.stringify params + db.actionInvokers.storeUserArguments user.username, rule.id, arr[ 0 ], arr[ 1 ], JSON.stringify params # Initialize the rule log db.resetLog user.username, rule.id diff --git a/coffee/dynamic-modules.coffee b/coffee/dynamic-modules.coffee index 42dc114..1ebd2b2 100644 --- a/coffee/dynamic-modules.coffee +++ b/coffee/dynamic-modules.coffee @@ -153,13 +153,14 @@ fTryToLoadModule = ( userId, ruleId, modId, src, dbMod, params, cb ) => oFuncArgs = {} for func of oFuncParams - dbMod.getUserArguments modId, func, userId, ( err, obj ) => + dbMod.getUserArguments userId, ruleId, modId, func, ( err, obj ) => if obj try oDecrypted = cryptico.decrypt obj, @oPrivateRSAkey oFuncArgs[ func ] = JSON.parse oDecrypted.plaintext + @log.info "DM | Found and attached user-specific arguments to #{ userId }, #{ ruleId }, #{ modId }" catch err - @log.warn "DM | Error during parsing of user defined params for #{ userId }, #{ ruleId }, #{ modId }" + @log.warn "DM | Error during parsing of user-specific arguments for #{ userId }, #{ ruleId }, #{ modId }" @log.warn err cb answ: answ diff --git a/coffee/event-poller.coffee b/coffee/event-poller.coffee index c8d0def..08daa20 100644 --- a/coffee/event-poller.coffee +++ b/coffee/event-poller.coffee @@ -49,6 +49,7 @@ process.on 'disconnect', () -> # If the process receives a message it is concerning the rules process.on 'message', ( msg ) -> + log.info "EP | Got info about new rule: #{ msg.event }" # Let's split the event string to find module and function in an array @@ -87,17 +88,17 @@ fLoadModule = ( msg ) -> if not listUserModules[msg.user] listUserModules[msg.user] = {} - iv = msg.rule.interval * 60 * 1000 + iv = msg.rule.event_interval * 60 * 1000 # We open up a new object for the rule it listUserModules[msg.user][msg.rule.id] = id: msg.rule.event pollfunc: arrName[1] - interval: iv + event_interval: iv module: result.module logger: result.logger log.info "EP | New event module '#{ arrName[0] }' loaded for user #{ msg.user }, - in rule #{ msg.rule.id }, polling every #{ iv } minutes" + in rule #{ msg.rule.id }, polling every #{ msg.rule.event_interval } minutes" setTimeout fCheckAndRun( msg.user, msg.rule.id ), iv if msg.event is 'new' or @@ -107,12 +108,13 @@ fLoadModule = ( msg ) -> fCheckAndRun = ( userId, ruleId ) -> () -> + log.info "EP | Check and run user #{ userId }, rule #{ ruleId }" if isRunning and listUserModules[userId] and listUserModules[userId][ruleId] oRule = listUserModules[userId][ruleId] fCallFunction userId, ruleId, oRule - setTimeout fCheckAndRun( userId, ruleId ), oRule.interval + setTimeout fCheckAndRun( userId, ruleId ), oRule.event_interval # We have to register the poll function in belows anonymous function # because we're fast iterating through the listUserModules and references will @@ -127,26 +129,30 @@ fCallFunction = ( userId, ruleId, oRule ) -> catch err log.info "EP | ERROR in module when polled: #{ oRule.id } #{ userId }: #{err.message}" oRule.logger err.message -# ### -# This function will loop infinitely every 10 seconds until isRunning is set to false +### +This function will loop infinitely every 10 seconds until isRunning is set to false -# @private pollLoop() -# ### -# pollLoop = () -> -# # We only loop if we're running -# if isRunning +@private pollLoop() +### +pollLoop = () -> + # We only loop if we're running + if isRunning -# # Go through all users -# for userName, oRules of listUserModules - -# # Go through each of the users modules -# for ruleName, myRule of oRules - -# # Call the event poller module function -# fCallFunction myRule, ruleName, userName - -# setTimeout pollLoop, 10000 + #FIXME a scheduler should go here because we are limited in setTimeout + # to an integer value -> ~24 days at maximum! -# # Finally if everything initialized we start polling for new events -# pollLoop() \ No newline at end of file + # # Go through all users + # for userName, oRules of listUserModules + + # # Go through each of the users modules + # for ruleName, myRule of oRules + + # # Call the event poller module function + # fCallFunction myRule, ruleName, userName + + setTimeout pollLoop, 10000 + + +# Finally if everything initialized we start polling for new events +pollLoop() \ No newline at end of file diff --git a/coffee/persistence.coffee b/coffee/persistence.coffee index bbecf0c..5c6ae58 100644 --- a/coffee/persistence.coffee +++ b/coffee/persistence.coffee @@ -217,45 +217,45 @@ class IndexedModules storeModule: ( userId, oModule ) => @log.info "DB | (IdxedMods) #{ @setname }.storeModule( #{ userId }, oModule )" @db.sadd "#{ @setname }s", oModule.id, - replyHandler "sadd '#{ oModule.id }' to '#{ @setname }'" + replyHandler "sadd '#{ @setname }s' -> '#{ oModule.id }'" @db.hmset "#{ @setname }:#{ oModule.id }", oModule, - replyHandler "hmset properties in hash '#{ @setname }:#{ oModule.id }'" + replyHandler "hmset '#{ @setname }:#{ oModule.id }' -> [oModule]" @linkModule oModule.id, userId #TODO add testing linkModule: ( mId, userId ) => @log.info "DB | (IdxedMods) #{ @setname }.linkModule( #{ mId }, #{ userId } )" @db.sadd "#{ @setname }:#{ mId }:users", userId, - replyHandler "sadd #{ userId } to '#{ @setname }:#{ mId }:users'" + replyHandler "sadd '#{ @setname }:#{ mId }:users' -> '#{ userId }'" @db.sadd "user:#{ userId }:#{ @setname }s", mId, - replyHandler "sadd #{ mId } to 'user:#{ userId }:#{ @setname }s'" + replyHandler "sadd 'user:#{ userId }:#{ @setname }s' -> #{ mId }" #TODO add testing unlinkModule: ( mId, userId ) => @log.info "DB | (IdxedMods) #{ @setname }.unlinkModule( #{ mId }, #{ userId } )" @db.srem "#{ @setname }:#{ mId }:users", userId, - replyHandler "srem #{ userId } from '#{ @setname }:#{ mId }:users'" + replyHandler "srem '#{ @setname }:#{ mId }:users' -> #{ userId }" @db.srem "user:#{ userId }:#{ @setname }s", mId, - replyHandler "srem #{ mId } from 'user:#{ userId }:#{ @setname }s'" + replyHandler "srem 'user:#{ userId }:#{ @setname }s' -> #{ mId }" #TODO add testing publish: ( mId ) => @log.info "DB | (IdxedMods) #{ @setname }.publish( #{ mId } )" @db.sadd "public-#{ @setname }s", mId, - replyHandler "sadd '#{ mId }' to 'public-#{ @setname }s'" + replyHandler "sadd 'public-#{ @setname }s' -> '#{ mId }'" #TODO add testing unpublish: ( mId ) => @log.info "DB | (IdxedMods) #{ @setname }.unpublish( #{ mId } )" @db.srem "public-#{ @setname }s", mId, - replyHandler "srem '#{ mId }' from 'public-#{ @setname }s'" + replyHandler "srem 'public-#{ @setname }s' -> '#{ mId }'" getModule: ( mId, cb ) => @log.info "DB | (IdxedMods) #{ @setname }.getModule( #{ mId } )" @db.hgetall "#{ @setname }:#{ mId }", cb getModuleField: ( mId, field, cb ) => - @log.info "DB | (IdxedMods) #{ @setname }.getModule( #{ mId } )" + @log.info "DB | (IdxedMods) #{ @setname }.getModuleField( #{ mId }, #{ field } )" @db.hget "#{ @setname }:#{ mId }", field, cb #TODO add testing @@ -265,7 +265,7 @@ class IndexedModules #TODO add testing getAvailableModuleIds: ( userId, cb ) => - @log.info "DB | (IdxedMods) #{ @setname }.getPublicModuleIds( #{ userId } )" + @log.info "DB | (IdxedMods) #{ @setname }.getAvailableModuleIds( #{ userId } )" @db.sunion "public-#{ @setname }s", "user:#{ userId }:#{ @setname }s", cb getModuleIds: ( cb ) => @@ -279,14 +279,18 @@ class IndexedModules deleteModule: ( mId ) => @log.info "DB | (IdxedMods) #{ @setname }.deleteModule( #{ mId } )" @db.srem "#{ @setname }s", mId, - replyHandler "srem '#{ mId }' from #{ @setname }s" + replyHandler "srem '#{ @setname }s' -> '#{ mId }'" @db.del "#{ @setname }:#{ mId }", - replyHandler "del of '#{ @setname }:#{ mId }'" + replyHandler "del '#{ @setname }:#{ mId }'" @unpublish mId @db.smembers "#{ @setname }:#{ mId }:users", ( err, obj ) => - @unlinkModule mId, userId for userId in obj - @deleteUserParams mId, userId for userId in obj - @deleteUserArguments mId, userId for userId in obj + for userId in obj + @unlinkModule mId, userId + @deleteUserParams mId, userId + exports.getUserLinkedRules userId, ( err, obj ) => + for rule in obj + @getUserArgumentsFunctions userId, rule, mId, ( err, obj ) => + @deleteUserArguments userId, rule, mId ### Stores user params for a module. They are expected to be RSA encrypted with helps of @@ -300,9 +304,9 @@ class IndexedModules storeUserParams: ( mId, userId, encData ) => @log.info "DB | (IdxedMods) #{ @setname }.storeUserParams( #{ mId }, #{ userId }, encData )" @db.sadd "#{ @setname }-params", "#{ mId }:#{ userId }", - replyHandler "sadd '#{ mId }:#{ userId }' to '#{ @setname }-params'" + replyHandler "sadd '#{ @setname }-params' -> '#{ mId }:#{ userId }'" @db.set "#{ @setname }-params:#{ mId }:#{ userId }", encData, - replyHandler "set user params in '#{ @setname }-params:#{ mId }:#{ userId }'" + replyHandler "set '#{ @setname }-params:#{ mId }:#{ userId }' -> [encData]" getUserParams: ( mId, userId, cb ) => @log.info "DB | (IdxedMods) #{ @setname }.getUserParams( #{ mId }, #{ userId } )" @@ -313,9 +317,9 @@ class IndexedModules @db.smembers "#{ @setname }-params", cb deleteUserParams: ( mId, userId ) => - @log.info "DB | (IdxedMods) #{ @setname }.deleteUserParams(#{ mId }, #{ userId } )" + @log.info "DB | (IdxedMods) #{ @setname }.deleteUserParams( #{ mId }, #{ userId } )" @db.srem "#{ @setname }-params", "#{ mId }:#{ userId }", - replyHandler "srem '#{ mId }:#{ userId }' from '#{ @setname }-params'" + replyHandler "srem '#{ @setname }-params' -> '#{ mId }:#{ userId }'" @db.del "#{ @setname }-params:#{ mId }:#{ userId }", replyHandler "del '#{ @setname }-params:#{ mId }:#{ userId }'" @@ -323,28 +327,34 @@ class IndexedModules Stores user arguments for a function within a module. They are expected to be RSA encrypted with helps of the provided cryptico JS library and will only be decrypted right before the module is loaded! - @private storeUserArguments( *mId, userId, encData* ) - @param {String} mId + @private storeUserArguments( *userId, ruleId, mId, funcId, encData* ) @param {String} userId + @param {String} ruleId + @param {String} mId + @param {String} funcId @param {object} encData ### - storeUserArguments: ( mId, funcId, userId, encData ) => - @log.info "DB | (IdxedMods) #{ @setname }.storeUserArguments( #{ mId }, #{ funcId }, #{ userId }, encData )" - @db.sadd "#{ @setname }:#{ mId }:#{ userId }:functions", funcId, - replyHandler "sadd '#{ funcId }' to '#{ @setname }:#{ mId }:#{ userId }:functions'" - @db.set "#{ @setname }:#{ mId }:#{ userId }:function:#{ funcId }", encData, - replyHandler "set user params in '#{ @setname }:#{ mId }:#{ userId }:function:#{ func }'" + storeUserArguments: ( userId, ruleId, mId, funcId, encData ) => + @log.info "DB | (IdxedMods) #{ @setname }.storeUserArguments( #{ userId }, #{ ruleId }, #{ mId }, #{ funcId }, encData )" + @db.sadd "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:functions", funcId, + replyHandler "sadd '#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:functions' -> '#{ funcId }'" + @db.set "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:function:#{ funcId }", encData, + replyHandler "set '#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:function:#{ funcId }' -> [encData]" - getUserArguments: ( mId, funcId, userId, cb ) => - @log.info "DB | (IdxedMods) #{ @setname }.getUserArguments( #{ mId }, #{ funcId }, #{ userId } )" - @db.get "#{ @setname }:#{ mId }:#{ userId }:function:#{ funcId }", cb + getUserArgumentsFunctions: ( userId, ruleId, mId, cb ) => + @log.info "DB | (IdxedMods) #{ @setname }.getUserArgumentsFunctions( #{ userId }, #{ ruleId }, #{ mId } )" + @db.get "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:functions", cb - deleteUserArguments: ( mId, userId ) => - @log.info "DB | (IdxedMods) #{ @setname }.deleteUserArguments(#{ mId }, #{ userId } )" - @db.smembers "#{ @setname }:#{ mId }:#{ userId }:functions", ( err, obj ) => + getUserArguments: ( userId, ruleId, mId, funcId, cb ) => + @log.info "DB | (IdxedMods) #{ @setname }.getUserArguments( #{ userId }, #{ ruleId }, #{ mId }, #{ funcId } )" + @db.get "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:function:#{ funcId }", cb + + deleteUserArguments: ( userId, ruleId, mId ) => + @log.info "DB | (IdxedMods) #{ @setname }.deleteUserArguments( #{ userId }, #{ ruleId }, #{ mId } )" + @db.smembers "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:functions", ( err, obj ) => for func in obj - @db.del "#{ @setname }:#{ mId }:#{ userId }:function:#{ func }", - replyHandler "del '#{ @setname }:#{ mId }:#{ userId }:function:#{ func }'" + @db.del "#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:function:#{ func }", + replyHandler "del '#{ @setname }:#{ userId }:#{ ruleId }:#{ mId }:function:#{ func }'" ### @@ -394,7 +404,7 @@ Query the DB for a rule and pass it to cb(err, obj). @param {function} cb ### exports.getRule = ( ruleId, cb ) => - @log.info "DB | get: 'rule:#{ ruleId }'" + @log.info "DB | getRule( '#{ ruleId }' )" @db.get "rule:#{ ruleId }", cb ### @@ -425,11 +435,11 @@ Store a string representation of a rule in the DB. @param {String} data ### exports.storeRule = ( ruleId, data ) => - @log.info "DB | storeRule: '#{ ruleId }'" + @log.info "DB | storeRule( '#{ ruleId }' )" @db.sadd 'rules', "#{ ruleId }", - replyHandler "sadd rules: '#{ ruleId }'" + replyHandler "sadd 'rules' -> '#{ ruleId }'" @db.set "rule:#{ ruleId }", data, - replyHandler "set 'rule:#{ ruleId }': data" + replyHandler "set 'rule:#{ ruleId }' -> [data]" ### Delete a string representation of a rule. @@ -439,26 +449,27 @@ Delete a string representation of a rule. @param {String} userId ### exports.deleteRule = ( ruleId ) => - @log.info "DB | deleteRule: '#{ ruleId }'" - @db.srem "rules", ruleId, replyHandler "srem 'rules': '#{ ruleId }'" - @db.del "rule:#{ ruleId }", replyHandler "del: 'rule:#{ ruleId }'" + @log.info "DB | deleteRule( '#{ ruleId }' )" + @db.srem "rules", ruleId, replyHandler "srem 'rules' -> '#{ ruleId }'" + @db.del "rule:#{ ruleId }", replyHandler "del 'rule:#{ ruleId }'" # We also need to delete all references in linked and active users @db.smembers "rule:#{ ruleId }:users", ( err, obj ) => delLinkedUserRule = ( userId ) => exports.resetLog userId, ruleId @db.srem "user:#{ userId }:rules", ruleId, - replyHandler "srem 'user:#{ userId }:rules': '#{ ruleId }'" + replyHandler "srem 'user:#{ userId }:rules' -> '#{ ruleId }'" delLinkedUserRule id for id in obj @db.del "rule:#{ ruleId }:users", replyHandler "del 'rule:#{ ruleId }:users'" @db.smembers "rule:#{ ruleId }:active-users", ( err, obj ) => delActiveUserRule = ( userId ) => @db.srem "user:#{ userId }:active-rules", ruleId, - replyHandler "srem 'user:#{ userId }:active-rules': '#{ ruleId }'" + replyHandler "srem 'user:#{ userId }:active-rules' -> '#{ ruleId }'" delActiveUserRule id for id in obj @db.del "rule:#{ ruleId }:active-users", replyHandler "del 'rule:#{ ruleId }:active-users'" + #TODO remove module links and params and arguments ### Associate a rule to a user. @@ -470,9 +481,9 @@ Associate a rule to a user. exports.linkRule = ( ruleId, userId ) => @log.info "DB | linkRule: '#{ ruleId }' to user '#{ userId }'" @db.sadd "rule:#{ ruleId }:users", userId, - replyHandler "sadd 'rule:#{ ruleId }:users': '#{ userId }'" + replyHandler "sadd 'rule:#{ ruleId }:users' -> '#{ userId }'" @db.sadd "user:#{ userId }:rules", ruleId, - replyHandler "sadd 'user:#{ userId }:rules': '#{ ruleId }'" + replyHandler "sadd 'user:#{ userId }:rules' -> '#{ ruleId }'" ### Get rules linked to a user and hand it to cb(err, obj). @@ -482,7 +493,7 @@ Get rules linked to a user and hand it to cb(err, obj). @param {function} cb ### exports.getUserLinkedRules = ( userId, cb ) => - @log.info "DB | getUserLinkedRules: 'user:#{ userId }:rules'" + @log.info "DB | getUserLinkedRules: smembers 'user:#{ userId }:rules'" @db.smembers "user:#{ userId }:rules", cb ### @@ -493,7 +504,7 @@ Get users linked to a rule and hand it to cb(err, obj). @param {function} cb ### exports.getRuleLinkedUsers = ( ruleId, cb ) => - @log.info "DB | getRuleLinkedUsers: 'rule:#{ ruleId }:users'" + @log.info "DB | getRuleLinkedUsers: smembers 'rule:#{ ruleId }:users'" @db.smembers "rule:#{ ruleId }:users", cb ### @@ -506,9 +517,9 @@ Delete an association of a rule to a user. exports.unlinkRule = ( ruleId, userId ) => @log.info "DB | unlinkRule: '#{ ruleId }:#{ userId }'" @db.srem "rule:#{ ruleId }:users", userId, - replyHandler "srem 'rule:#{ ruleId }:users': '#{ userId }'" + replyHandler "srem 'rule:#{ ruleId }:users' -> '#{ userId }'" @db.srem "user:#{ userId }:rules", ruleId, - replyHandler "srem 'user:#{ userId }:rules': '#{ ruleId }'" + replyHandler "srem 'user:#{ userId }:rules' -> '#{ ruleId }'" ### Activate a rule. @@ -520,9 +531,9 @@ Activate a rule. exports.activateRule = ( ruleId, userId ) => @log.info "DB | activateRule: '#{ ruleId }' for '#{ userId }'" @db.sadd "rule:#{ ruleId }:active-users", userId, - replyHandler "sadd 'rule:#{ ruleId }:active-users': '#{ userId }'" + replyHandler "sadd 'rule:#{ ruleId }:active-users' -> '#{ userId }'" @db.sadd "user:#{ userId }:active-rules", ruleId, - replyHandler "sadd 'user:#{ userId }:active-rules': '#{ ruleId }'" + replyHandler "sadd 'user:#{ userId }:active-rules' -> '#{ ruleId }'" ### Get rules activated for a user and hand it to cb(err, obj). @@ -556,7 +567,7 @@ Deactivate a rule. exports.deactivateRule = ( ruleId, userId ) => @log.info "DB | deactivateRule: '#{ ruleId }' for '#{ userId }'" @db.srem "rule:#{ ruleId }:active-users", userId, - replyHandler "srem 'rule:#{ ruleId }:active-users': '#{ userId }'" + replyHandler "srem 'rule:#{ ruleId }:active-users' -> '#{ userId }'" @db.srem "user:#{ userId }:active-rules", ruleId, replyHandler "srem 'user:#{ userId }:active-rules' '#{ ruleId }'" @@ -598,10 +609,10 @@ exports.storeUser = ( objUser ) => @log.info "DB | storeUser: '#{ objUser.username }'" if objUser and objUser.username and objUser.password @db.sadd 'users', objUser.username, - replyHandler "storing user key '#{ objUser.username }'" + replyHandler "sadd 'users' -> '#{ objUser.username }'" objUser.password = objUser.password @db.hmset "user:#{ objUser.username }", objUser, - replyHandler "storing user properties '#{ objUser.username }'" + replyHandler "hmset 'user:#{ objUser.username }' -> [objUser]" else @log.warn new Error 'DB | username or password was missing' @@ -634,35 +645,34 @@ Deletes a user and all his associated linked and active rules. ### exports.deleteUser = ( userId ) => @log.info "DB | deleteUser: '#{ userId }'" - @db.srem "users", userId, replyHandler "Deleting user key '#{ userId }'" - @db.del "user:#{ userId }", replyHandler "Deleting user '#{ userId }'" + @db.srem "users", userId, replyHandler "srem 'users' -> '#{ userId }'" + @db.del "user:#{ userId }", replyHandler "del 'user:#{ userId }'" # We also need to delete all linked rules @db.smembers "user:#{ userId }:rules", ( err, obj ) => delLinkedRuleUser = ( ruleId ) => @db.srem "rule:#{ ruleId }:users", userId, - replyHandler "Deleting user key '#{ userId }' in linked rule '#{ ruleId }'" + replyHandler "srem 'rule:#{ ruleId }:users' -> '#{ userId }'" delLinkedRuleUser id for id in obj @db.del "user:#{ userId }:rules", - replyHandler "Deleting user '#{ userId }' rules" + replyHandler "del 'user:#{ userId }:rules'" # We also need to delete all active rules @db.smembers "user:#{ userId }:active-rules", ( err, obj ) => delActivatedRuleUser = ( ruleId ) => @db.srem "rule:#{ ruleId }:active-users", userId, - replyHandler "Deleting user key '#{ userId }' in active rule '#{ ruleId }'" + replyHandler "srem 'rule:#{ ruleId }:active-users' -> '#{ userId }'" delActivatedRuleUser id for id in obj @db.del "user:#{ userId }:active-rules", - replyHandler "Deleting user '#{ userId }' rules" + replyHandler "del user:#{ userId }:active-rules" # We also need to delete all associated roles @db.smembers "user:#{ userId }:roles", ( err, obj ) => delRoleUser = ( roleId ) => @db.srem "role:#{ roleId }:users", userId, - replyHandler "Deleting user key '#{ userId }' in role '#{ roleId }'" + replyHandler "srem 'role:#{ roleId }:users' -> '#{ userId }'" delRoleUser id for id in obj - @db.del "user:#{ userId }:roles", - replyHandler "Deleting user '#{ userId }' roles" + @db.del "user:#{ userId }:roles", replyHandler "del 'user:#{ userId }:roles'" ### Checks the credentials and on success returns the user object to the @@ -707,11 +717,28 @@ Associate a role with a user. ### exports.storeUserRole = ( userId, role ) => @log.info "DB | storeUserRole: '#{ userId }:#{ role }'" - @db.sadd 'roles', role, replyHandler "adding role '#{ role }' to role index set" + @db.sadd 'roles', role, replyHandler "sadd '#{ role }' to 'roles'" @db.sadd "user:#{ userId }:roles", role, - replyHandler "adding role '#{ role }' to user '#{ userId }'" + replyHandler "sadd 'user:#{ userId }:roles' -> '#{ role }'" @db.sadd "role:#{ role }:users", userId, - replyHandler "adding user '#{ userId }' to role '#{ role }'" + replyHandler "sadd 'role:#{ role }:users' -> '#{ userId }'" + +### +Associate a role with a user. + +@public storeUserRole( *userId, role* ) +@param {String} userId +@param {String} role +### +exports.deleteRole = ( role ) => + @log.info "DB | deleteRole: '#{ role }'" + @db.smembers "role:#{ role }:users", ( err, obj ) => + delUserRole = ( userId ) => + @db.srem "user:#{ userId }:roles", role, + replyHandler "srem 'user:#{ userId }:roles' -> '#{ role }'" + delUserRole id for id in obj + @db.srem "roles", role, + replyHandler "srem 'roles' -> '#{ role }'" ### Fetch all roles of a user and pass them to cb(err, obj). @@ -745,9 +772,9 @@ Remove a role from a user. exports.removeUserRole = ( userId, role ) => @log.info "DB | removeRoleFromUser: role '#{ role }', user '#{ userId }'" @db.srem "user:#{ userId }:roles", role, - replyHandler "Removing role '#{ role }' from user '#{ userId }'" + replyHandler "srem 'user:#{ userId }:roles' -> '#{ role }'" @db.srem "role:#{ role }:users", userId, - replyHandler "Removing user '#{ userId }' from role '#{ role }'" + replyHandler "srem 'role:#{ role }:users' -> '#{ userId }'" ### diff --git a/examples/action-invokers/emailyak.coffee b/examples/action-invokers/emailyak.coffee index ed51d03..d868d92 100644 --- a/examples/action-invokers/emailyak.coffee +++ b/examples/action-invokers/emailyak.coffee @@ -37,5 +37,5 @@ exports.sendMail = ( sender, receipient, subject, content ) -> ToAddress: receipient Subject: subject TextBody: content - needlereq 'post', url, data, json: true, standardCallback 'sendMail' + needle.request 'post', url, data, json: true, standardCallback 'sendMail' diff --git a/examples/event-pollers/emailyak.coffee b/examples/event-pollers/emailyak.coffee index 9b45b5d..369d56c 100644 --- a/examples/event-pollers/emailyak.coffee +++ b/examples/event-pollers/emailyak.coffee @@ -16,7 +16,7 @@ exports.newMail = ( pushEvent ) -> # # Syntax: needle.request method, url, data, [options], callback # - needlereq 'get', url, null, null, ( err, resp, body ) -> + needle.request 'get', url, null, null, ( err, resp, body ) -> if err log 'Error in EmailYak EM newMail: ' + err.message else diff --git a/examples/event-pollers/probinder.coffee b/examples/event-pollers/probinder.coffee index 3d65b6f..487e01c 100644 --- a/examples/event-pollers/probinder.coffee +++ b/examples/event-pollers/probinder.coffee @@ -42,7 +42,7 @@ callService = ( args ) -> if not args.callback args.callback = standardCallback 'call' url = urlService + args.service + '/' + args.method - needlereq 'post', url, args.data, credentials, args.callback + needle.request 'post', url, args.data, credentials, args.callback ### Calls the user's unread content service. diff --git a/examples/event-pollers/weather.coffee b/examples/event-pollers/weather.coffee index 14e1110..c827e2d 100644 --- a/examples/event-pollers/weather.coffee +++ b/examples/event-pollers/weather.coffee @@ -32,7 +32,7 @@ Fetches the temperature ### getTemperature = ( cb ) -> url = urlService + '?APPID=' + params.openweatherKey + '&q=' + params.city - needlereq 'get', url, null, null, cb + needle.request 'get', url, null, null, cb ### Emits one event per day if the temperature today raises above user defined threshold diff --git a/js/components-manager.js b/js/components-manager.js index f047673..f4dc21c 100644 --- a/js/components-manager.js +++ b/js/components-manager.js @@ -411,7 +411,7 @@ Components Manager for (id in oParams) { params = oParams[id]; arr = id.split(' -> '); - db.actionInvokers.storeUserArguments(arr[0], arr[1], user.username, JSON.stringify(params)); + db.actionInvokers.storeUserArguments(user.username, rule.id, arr[0], arr[1], JSON.stringify(params)); } db.resetLog(user.username, rule.id); db.appendLog(user.username, rule.id, "INIT", "Rule '" + rule.id + "' initialized"); diff --git a/js/dynamic-modules.js b/js/dynamic-modules.js index 3d340fb..07c1c6d 100644 --- a/js/dynamic-modules.js +++ b/js/dynamic-modules.js @@ -173,15 +173,16 @@ Dynamic Modules if (dbMod) { oFuncArgs = {}; for (func in oFuncParams) { - dbMod.getUserArguments(modId, func, userId, function(err, obj) { + dbMod.getUserArguments(userId, ruleId, modId, func, function(err, obj) { var oDecrypted; if (obj) { try { oDecrypted = cryptico.decrypt(obj, _this.oPrivateRSAkey); - return oFuncArgs[func] = JSON.parse(oDecrypted.plaintext); + oFuncArgs[func] = JSON.parse(oDecrypted.plaintext); + return _this.log.info("DM | Found and attached user-specific arguments to " + userId + ", " + ruleId + ", " + modId); } catch (_error) { err = _error; - _this.log.warn("DM | Error during parsing of user defined params for " + userId + ", " + ruleId + ", " + modId); + _this.log.warn("DM | Error during parsing of user-specific arguments for " + userId + ", " + ruleId + ", " + modId); return _this.log.warn(err); } } diff --git a/js/event-poller.js b/js/event-poller.js index f73ce2f..fe3ad19 100644 --- a/js/event-poller.js +++ b/js/event-poller.js @@ -9,7 +9,7 @@ Dynamic Modules */ (function() { - var db, dynmod, fCallFunction, fCheckAndRun, fLoadModule, isRunning, listUserModules, log, logconf, logger; + var db, dynmod, fCallFunction, fCheckAndRun, fLoadModule, isRunning, listUserModules, log, logconf, logger, pollLoop; logger = require('./logging'); @@ -57,6 +57,7 @@ Dynamic Modules }); process.on('message', function(msg) { + log.info("EP | Got info about new rule: " + msg.event); if (msg.event === 'new' || msg.event === 'init') { fLoadModule(msg); } @@ -84,15 +85,15 @@ Dynamic Modules if (!listUserModules[msg.user]) { listUserModules[msg.user] = {}; } - iv = msg.rule.interval * 60 * 1000; + iv = msg.rule.event_interval * 60 * 1000; listUserModules[msg.user][msg.rule.id] = { id: msg.rule.event, pollfunc: arrName[1], - interval: iv, + event_interval: iv, module: result.module, logger: result.logger }; - log.info("EP | New event module '" + arrName[0] + "' loaded for user " + msg.user + ", in rule " + msg.rule.id + ", polling every " + iv + " minutes"); + log.info("EP | New event module '" + arrName[0] + "' loaded for user " + msg.user + ", in rule " + msg.rule.id + ", polling every " + msg.rule.event_interval + " minutes"); return setTimeout(fCheckAndRun(msg.user, msg.rule.id), iv); }); } @@ -106,10 +107,11 @@ Dynamic Modules fCheckAndRun = function(userId, ruleId) { return function() { var oRule; + log.info("EP | Check and run user " + userId + ", rule " + ruleId); if (isRunning && listUserModules[userId] && listUserModules[userId][ruleId]) { oRule = listUserModules[userId][ruleId]; fCallFunction(userId, ruleId, oRule); - return setTimeout(fCheckAndRun(userId, ruleId), oRule.interval); + return setTimeout(fCheckAndRun(userId, ruleId), oRule.event_interval); } }; }; @@ -131,4 +133,19 @@ Dynamic Modules } }; + + /* + This function will loop infinitely every 10 seconds until isRunning is set to false + + @private pollLoop() + */ + + pollLoop = function() { + if (isRunning) { + return setTimeout(pollLoop, 10000); + } + }; + + pollLoop(); + }).call(this); diff --git a/js/persistence.js b/js/persistence.js index 6b96382..4e69134 100644 --- a/js/persistence.js +++ b/js/persistence.js @@ -257,6 +257,7 @@ Persistence this.log = log; this.deleteUserArguments = __bind(this.deleteUserArguments, this); this.getUserArguments = __bind(this.getUserArguments, this); + this.getUserArgumentsFunctions = __bind(this.getUserArgumentsFunctions, this); this.storeUserArguments = __bind(this.storeUserArguments, this); this.deleteUserParams = __bind(this.deleteUserParams, this); this.getUserParamsIds = __bind(this.getUserParamsIds, this); @@ -293,31 +294,31 @@ Persistence IndexedModules.prototype.storeModule = function(userId, oModule) { this.log.info("DB | (IdxedMods) " + this.setname + ".storeModule( " + userId + ", oModule )"); - this.db.sadd("" + this.setname + "s", oModule.id, replyHandler("sadd '" + oModule.id + "' to '" + this.setname + "'")); - this.db.hmset("" + this.setname + ":" + oModule.id, oModule, replyHandler("hmset properties in hash '" + this.setname + ":" + oModule.id + "'")); + this.db.sadd("" + this.setname + "s", oModule.id, replyHandler("sadd '" + this.setname + "s' -> '" + oModule.id + "'")); + this.db.hmset("" + this.setname + ":" + oModule.id, oModule, replyHandler("hmset '" + this.setname + ":" + oModule.id + "' -> [oModule]")); return this.linkModule(oModule.id, userId); }; IndexedModules.prototype.linkModule = function(mId, userId) { this.log.info("DB | (IdxedMods) " + this.setname + ".linkModule( " + mId + ", " + userId + " )"); - this.db.sadd("" + this.setname + ":" + mId + ":users", userId, replyHandler("sadd " + userId + " to '" + this.setname + ":" + mId + ":users'")); - return this.db.sadd("user:" + userId + ":" + this.setname + "s", mId, replyHandler("sadd " + mId + " to 'user:" + userId + ":" + this.setname + "s'")); + this.db.sadd("" + this.setname + ":" + mId + ":users", userId, replyHandler("sadd '" + this.setname + ":" + mId + ":users' -> '" + userId + "'")); + return this.db.sadd("user:" + userId + ":" + this.setname + "s", mId, replyHandler("sadd 'user:" + userId + ":" + this.setname + "s' -> " + mId)); }; IndexedModules.prototype.unlinkModule = function(mId, userId) { this.log.info("DB | (IdxedMods) " + this.setname + ".unlinkModule( " + mId + ", " + userId + " )"); - this.db.srem("" + this.setname + ":" + mId + ":users", userId, replyHandler("srem " + userId + " from '" + this.setname + ":" + mId + ":users'")); - return this.db.srem("user:" + userId + ":" + this.setname + "s", mId, replyHandler("srem " + mId + " from 'user:" + userId + ":" + this.setname + "s'")); + this.db.srem("" + this.setname + ":" + mId + ":users", userId, replyHandler("srem '" + this.setname + ":" + mId + ":users' -> " + userId)); + return this.db.srem("user:" + userId + ":" + this.setname + "s", mId, replyHandler("srem 'user:" + userId + ":" + this.setname + "s' -> " + mId)); }; IndexedModules.prototype.publish = function(mId) { this.log.info("DB | (IdxedMods) " + this.setname + ".publish( " + mId + " )"); - return this.db.sadd("public-" + this.setname + "s", mId, replyHandler("sadd '" + mId + "' to 'public-" + this.setname + "s'")); + return this.db.sadd("public-" + this.setname + "s", mId, replyHandler("sadd 'public-" + this.setname + "s' -> '" + mId + "'")); }; IndexedModules.prototype.unpublish = function(mId) { this.log.info("DB | (IdxedMods) " + this.setname + ".unpublish( " + mId + " )"); - return this.db.srem("public-" + this.setname + "s", mId, replyHandler("srem '" + mId + "' from 'public-" + this.setname + "s'")); + return this.db.srem("public-" + this.setname + "s", mId, replyHandler("srem 'public-" + this.setname + "s' -> '" + mId + "'")); }; IndexedModules.prototype.getModule = function(mId, cb) { @@ -326,7 +327,7 @@ Persistence }; IndexedModules.prototype.getModuleField = function(mId, field, cb) { - this.log.info("DB | (IdxedMods) " + this.setname + ".getModule( " + mId + " )"); + this.log.info("DB | (IdxedMods) " + this.setname + ".getModuleField( " + mId + ", " + field + " )"); return this.db.hget("" + this.setname + ":" + mId, field, cb); }; @@ -336,7 +337,7 @@ Persistence }; IndexedModules.prototype.getAvailableModuleIds = function(userId, cb) { - this.log.info("DB | (IdxedMods) " + this.setname + ".getPublicModuleIds( " + userId + " )"); + this.log.info("DB | (IdxedMods) " + this.setname + ".getAvailableModuleIds( " + userId + " )"); return this.db.sunion("public-" + this.setname + "s", "user:" + userId + ":" + this.setname + "s", cb); }; @@ -352,24 +353,28 @@ Persistence IndexedModules.prototype.deleteModule = function(mId) { this.log.info("DB | (IdxedMods) " + this.setname + ".deleteModule( " + mId + " )"); - this.db.srem("" + this.setname + "s", mId, replyHandler("srem '" + mId + "' from " + this.setname + "s")); - this.db.del("" + this.setname + ":" + mId, replyHandler("del of '" + this.setname + ":" + mId + "'")); + this.db.srem("" + this.setname + "s", mId, replyHandler("srem '" + this.setname + "s' -> '" + mId + "'")); + this.db.del("" + this.setname + ":" + mId, replyHandler("del '" + this.setname + ":" + mId + "'")); this.unpublish(mId); return this.db.smembers("" + this.setname + ":" + mId + ":users", (function(_this) { return function(err, obj) { - var userId, _i, _j, _k, _len, _len1, _len2, _results; + var userId, _i, _len, _results; + _results = []; for (_i = 0, _len = obj.length; _i < _len; _i++) { userId = obj[_i]; _this.unlinkModule(mId, userId); - } - for (_j = 0, _len1 = obj.length; _j < _len1; _j++) { - userId = obj[_j]; _this.deleteUserParams(mId, userId); - } - _results = []; - for (_k = 0, _len2 = obj.length; _k < _len2; _k++) { - userId = obj[_k]; - _results.push(_this.deleteUserArguments(mId, userId)); + _results.push(exports.getUserLinkedRules(userId, function(err, obj) { + var rule, _j, _len1, _results1; + _results1 = []; + for (_j = 0, _len1 = obj.length; _j < _len1; _j++) { + rule = obj[_j]; + _results1.push(_this.getUserArgumentsFunctions(userId, rule, mId, function(err, obj) { + return _this.deleteUserArguments(userId, rule, mId); + })); + } + return _results1; + })); } return _results; }; @@ -389,8 +394,8 @@ Persistence IndexedModules.prototype.storeUserParams = function(mId, userId, encData) { this.log.info("DB | (IdxedMods) " + this.setname + ".storeUserParams( " + mId + ", " + userId + ", encData )"); - this.db.sadd("" + this.setname + "-params", "" + mId + ":" + userId, replyHandler("sadd '" + mId + ":" + userId + "' to '" + this.setname + "-params'")); - return this.db.set("" + this.setname + "-params:" + mId + ":" + userId, encData, replyHandler("set user params in '" + this.setname + "-params:" + mId + ":" + userId + "'")); + this.db.sadd("" + this.setname + "-params", "" + mId + ":" + userId, replyHandler("sadd '" + this.setname + "-params' -> '" + mId + ":" + userId + "'")); + return this.db.set("" + this.setname + "-params:" + mId + ":" + userId, encData, replyHandler("set '" + this.setname + "-params:" + mId + ":" + userId + "' -> [encData]")); }; IndexedModules.prototype.getUserParams = function(mId, userId, cb) { @@ -404,8 +409,8 @@ Persistence }; IndexedModules.prototype.deleteUserParams = function(mId, userId) { - this.log.info("DB | (IdxedMods) " + this.setname + ".deleteUserParams(" + mId + ", " + userId + " )"); - this.db.srem("" + this.setname + "-params", "" + mId + ":" + userId, replyHandler("srem '" + mId + ":" + userId + "' from '" + this.setname + "-params'")); + this.log.info("DB | (IdxedMods) " + this.setname + ".deleteUserParams( " + mId + ", " + userId + " )"); + this.db.srem("" + this.setname + "-params", "" + mId + ":" + userId, replyHandler("srem '" + this.setname + "-params' -> '" + mId + ":" + userId + "'")); return this.db.del("" + this.setname + "-params:" + mId + ":" + userId, replyHandler("del '" + this.setname + "-params:" + mId + ":" + userId + "'")); }; @@ -414,32 +419,39 @@ Persistence Stores user arguments for a function within a module. They are expected to be RSA encrypted with helps of the provided cryptico JS library and will only be decrypted right before the module is loaded! - @private storeUserArguments( *mId, userId, encData* ) - @param {String} mId + @private storeUserArguments( *userId, ruleId, mId, funcId, encData* ) @param {String} userId + @param {String} ruleId + @param {String} mId + @param {String} funcId @param {object} encData */ - IndexedModules.prototype.storeUserArguments = function(mId, funcId, userId, encData) { - this.log.info("DB | (IdxedMods) " + this.setname + ".storeUserArguments( " + mId + ", " + funcId + ", " + userId + ", encData )"); - this.db.sadd("" + this.setname + ":" + mId + ":" + userId + ":functions", funcId, replyHandler("sadd '" + funcId + "' to '" + this.setname + ":" + mId + ":" + userId + ":functions'")); - return this.db.set("" + this.setname + ":" + mId + ":" + userId + ":function:" + funcId, encData, replyHandler("set user params in '" + this.setname + ":" + mId + ":" + userId + ":function:" + func + "'")); + IndexedModules.prototype.storeUserArguments = function(userId, ruleId, mId, funcId, encData) { + this.log.info("DB | (IdxedMods) " + this.setname + ".storeUserArguments( " + userId + ", " + ruleId + ", " + mId + ", " + funcId + ", encData )"); + this.db.sadd("" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":functions", funcId, replyHandler("sadd '" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":functions' -> '" + funcId + "'")); + return this.db.set("" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":function:" + funcId, encData, replyHandler("set '" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":function:" + funcId + "' -> [encData]")); }; - IndexedModules.prototype.getUserArguments = function(mId, funcId, userId, cb) { - this.log.info("DB | (IdxedMods) " + this.setname + ".getUserArguments( " + mId + ", " + funcId + ", " + userId + " )"); - return this.db.get("" + this.setname + ":" + mId + ":" + userId + ":function:" + funcId, cb); + IndexedModules.prototype.getUserArgumentsFunctions = function(userId, ruleId, mId, cb) { + this.log.info("DB | (IdxedMods) " + this.setname + ".getUserArgumentsFunctions( " + userId + ", " + ruleId + ", " + mId + " )"); + return this.db.get("" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":functions", cb); }; - IndexedModules.prototype.deleteUserArguments = function(mId, userId) { - this.log.info("DB | (IdxedMods) " + this.setname + ".deleteUserArguments(" + mId + ", " + userId + " )"); - return this.db.smembers("" + this.setname + ":" + mId + ":" + userId + ":functions", (function(_this) { + IndexedModules.prototype.getUserArguments = function(userId, ruleId, mId, funcId, cb) { + this.log.info("DB | (IdxedMods) " + this.setname + ".getUserArguments( " + userId + ", " + ruleId + ", " + mId + ", " + funcId + " )"); + return this.db.get("" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":function:" + funcId, cb); + }; + + IndexedModules.prototype.deleteUserArguments = function(userId, ruleId, mId) { + this.log.info("DB | (IdxedMods) " + this.setname + ".deleteUserArguments( " + userId + ", " + ruleId + ", " + mId + " )"); + return this.db.smembers("" + this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":functions", (function(_this) { return function(err, obj) { var func, _i, _len, _results; _results = []; for (_i = 0, _len = obj.length; _i < _len; _i++) { func = obj[_i]; - _results.push(_this.db.del("" + _this.setname + ":" + mId + ":" + userId + ":function:" + func, replyHandler("del '" + _this.setname + ":" + mId + ":" + userId + ":function:" + func + "'"))); + _results.push(_this.db.del("" + _this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":function:" + func, replyHandler("del '" + _this.setname + ":" + userId + ":" + ruleId + ":" + mId + ":function:" + func + "'"))); } return _results; }; @@ -513,7 +525,7 @@ Persistence exports.getRule = (function(_this) { return function(ruleId, cb) { - _this.log.info("DB | get: 'rule:" + ruleId + "'"); + _this.log.info("DB | getRule( '" + ruleId + "' )"); return _this.db.get("rule:" + ruleId, cb); }; })(this); @@ -559,9 +571,9 @@ Persistence exports.storeRule = (function(_this) { return function(ruleId, data) { - _this.log.info("DB | storeRule: '" + ruleId + "'"); - _this.db.sadd('rules', "" + ruleId, replyHandler("sadd rules: '" + ruleId + "'")); - return _this.db.set("rule:" + ruleId, data, replyHandler("set 'rule:" + ruleId + "': data")); + _this.log.info("DB | storeRule( '" + ruleId + "' )"); + _this.db.sadd('rules', "" + ruleId, replyHandler("sadd 'rules' -> '" + ruleId + "'")); + return _this.db.set("rule:" + ruleId, data, replyHandler("set 'rule:" + ruleId + "' -> [data]")); }; })(this); @@ -576,14 +588,14 @@ Persistence exports.deleteRule = (function(_this) { return function(ruleId) { - _this.log.info("DB | deleteRule: '" + ruleId + "'"); - _this.db.srem("rules", ruleId, replyHandler("srem 'rules': '" + ruleId + "'")); - _this.db.del("rule:" + ruleId, replyHandler("del: 'rule:" + ruleId + "'")); + _this.log.info("DB | deleteRule( '" + ruleId + "' )"); + _this.db.srem("rules", ruleId, replyHandler("srem 'rules' -> '" + ruleId + "'")); + _this.db.del("rule:" + ruleId, replyHandler("del 'rule:" + ruleId + "'")); _this.db.smembers("rule:" + ruleId + ":users", function(err, obj) { var delLinkedUserRule, id, _i, _len, _results; delLinkedUserRule = function(userId) { exports.resetLog(userId, ruleId); - return _this.db.srem("user:" + userId + ":rules", ruleId, replyHandler("srem 'user:" + userId + ":rules': '" + ruleId + "'")); + return _this.db.srem("user:" + userId + ":rules", ruleId, replyHandler("srem 'user:" + userId + ":rules' -> '" + ruleId + "'")); }; _results = []; for (_i = 0, _len = obj.length; _i < _len; _i++) { @@ -596,7 +608,7 @@ Persistence _this.db.smembers("rule:" + ruleId + ":active-users", function(err, obj) { var delActiveUserRule, id, _i, _len, _results; delActiveUserRule = function(userId) { - return _this.db.srem("user:" + userId + ":active-rules", ruleId, replyHandler("srem 'user:" + userId + ":active-rules': '" + ruleId + "'")); + return _this.db.srem("user:" + userId + ":active-rules", ruleId, replyHandler("srem 'user:" + userId + ":active-rules' -> '" + ruleId + "'")); }; _results = []; for (_i = 0, _len = obj.length; _i < _len; _i++) { @@ -621,8 +633,8 @@ Persistence exports.linkRule = (function(_this) { return function(ruleId, userId) { _this.log.info("DB | linkRule: '" + ruleId + "' to user '" + userId + "'"); - _this.db.sadd("rule:" + ruleId + ":users", userId, replyHandler("sadd 'rule:" + ruleId + ":users': '" + userId + "'")); - return _this.db.sadd("user:" + userId + ":rules", ruleId, replyHandler("sadd 'user:" + userId + ":rules': '" + ruleId + "'")); + _this.db.sadd("rule:" + ruleId + ":users", userId, replyHandler("sadd 'rule:" + ruleId + ":users' -> '" + userId + "'")); + return _this.db.sadd("user:" + userId + ":rules", ruleId, replyHandler("sadd 'user:" + userId + ":rules' -> '" + ruleId + "'")); }; })(this); @@ -637,7 +649,7 @@ Persistence exports.getUserLinkedRules = (function(_this) { return function(userId, cb) { - _this.log.info("DB | getUserLinkedRules: 'user:" + userId + ":rules'"); + _this.log.info("DB | getUserLinkedRules: smembers 'user:" + userId + ":rules'"); return _this.db.smembers("user:" + userId + ":rules", cb); }; })(this); @@ -653,7 +665,7 @@ Persistence exports.getRuleLinkedUsers = (function(_this) { return function(ruleId, cb) { - _this.log.info("DB | getRuleLinkedUsers: 'rule:" + ruleId + ":users'"); + _this.log.info("DB | getRuleLinkedUsers: smembers 'rule:" + ruleId + ":users'"); return _this.db.smembers("rule:" + ruleId + ":users", cb); }; })(this); @@ -670,8 +682,8 @@ Persistence exports.unlinkRule = (function(_this) { return function(ruleId, userId) { _this.log.info("DB | unlinkRule: '" + ruleId + ":" + userId + "'"); - _this.db.srem("rule:" + ruleId + ":users", userId, replyHandler("srem 'rule:" + ruleId + ":users': '" + userId + "'")); - return _this.db.srem("user:" + userId + ":rules", ruleId, replyHandler("srem 'user:" + userId + ":rules': '" + ruleId + "'")); + _this.db.srem("rule:" + ruleId + ":users", userId, replyHandler("srem 'rule:" + ruleId + ":users' -> '" + userId + "'")); + return _this.db.srem("user:" + userId + ":rules", ruleId, replyHandler("srem 'user:" + userId + ":rules' -> '" + ruleId + "'")); }; })(this); @@ -687,8 +699,8 @@ Persistence exports.activateRule = (function(_this) { return function(ruleId, userId) { _this.log.info("DB | activateRule: '" + ruleId + "' for '" + userId + "'"); - _this.db.sadd("rule:" + ruleId + ":active-users", userId, replyHandler("sadd 'rule:" + ruleId + ":active-users': '" + userId + "'")); - return _this.db.sadd("user:" + userId + ":active-rules", ruleId, replyHandler("sadd 'user:" + userId + ":active-rules': '" + ruleId + "'")); + _this.db.sadd("rule:" + ruleId + ":active-users", userId, replyHandler("sadd 'rule:" + ruleId + ":active-users' -> '" + userId + "'")); + return _this.db.sadd("user:" + userId + ":active-rules", ruleId, replyHandler("sadd 'user:" + userId + ":active-rules' -> '" + ruleId + "'")); }; })(this); @@ -736,7 +748,7 @@ Persistence exports.deactivateRule = (function(_this) { return function(ruleId, userId) { _this.log.info("DB | deactivateRule: '" + ruleId + "' for '" + userId + "'"); - _this.db.srem("rule:" + ruleId + ":active-users", userId, replyHandler("srem 'rule:" + ruleId + ":active-users': '" + userId + "'")); + _this.db.srem("rule:" + ruleId + ":active-users", userId, replyHandler("srem 'rule:" + ruleId + ":active-users' -> '" + userId + "'")); return _this.db.srem("user:" + userId + ":active-rules", ruleId, replyHandler("srem 'user:" + userId + ":active-rules' '" + ruleId + "'")); }; })(this); @@ -798,9 +810,9 @@ Persistence return function(objUser) { _this.log.info("DB | storeUser: '" + objUser.username + "'"); if (objUser && objUser.username && objUser.password) { - _this.db.sadd('users', objUser.username, replyHandler("storing user key '" + objUser.username + "'")); + _this.db.sadd('users', objUser.username, replyHandler("sadd 'users' -> '" + objUser.username + "'")); objUser.password = objUser.password; - return _this.db.hmset("user:" + objUser.username, objUser, replyHandler("storing user properties '" + objUser.username + "'")); + return _this.db.hmset("user:" + objUser.username, objUser, replyHandler("hmset 'user:" + objUser.username + "' -> [objUser]")); } else { return _this.log.warn(new Error('DB | username or password was missing')); } @@ -849,12 +861,12 @@ Persistence exports.deleteUser = (function(_this) { return function(userId) { _this.log.info("DB | deleteUser: '" + userId + "'"); - _this.db.srem("users", userId, replyHandler("Deleting user key '" + userId + "'")); - _this.db.del("user:" + userId, replyHandler("Deleting user '" + userId + "'")); + _this.db.srem("users", userId, replyHandler("srem 'users' -> '" + userId + "'")); + _this.db.del("user:" + userId, replyHandler("del 'user:" + userId + "'")); _this.db.smembers("user:" + userId + ":rules", function(err, obj) { var delLinkedRuleUser, id, _i, _len, _results; delLinkedRuleUser = function(ruleId) { - return _this.db.srem("rule:" + ruleId + ":users", userId, replyHandler("Deleting user key '" + userId + "' in linked rule '" + ruleId + "'")); + return _this.db.srem("rule:" + ruleId + ":users", userId, replyHandler("srem 'rule:" + ruleId + ":users' -> '" + userId + "'")); }; _results = []; for (_i = 0, _len = obj.length; _i < _len; _i++) { @@ -863,11 +875,11 @@ Persistence } return _results; }); - _this.db.del("user:" + userId + ":rules", replyHandler("Deleting user '" + userId + "' rules")); + _this.db.del("user:" + userId + ":rules", replyHandler("del 'user:" + userId + ":rules'")); _this.db.smembers("user:" + userId + ":active-rules", function(err, obj) { var delActivatedRuleUser, id, _i, _len, _results; delActivatedRuleUser = function(ruleId) { - return _this.db.srem("rule:" + ruleId + ":active-users", userId, replyHandler("Deleting user key '" + userId + "' in active rule '" + ruleId + "'")); + return _this.db.srem("rule:" + ruleId + ":active-users", userId, replyHandler("srem 'rule:" + ruleId + ":active-users' -> '" + userId + "'")); }; _results = []; for (_i = 0, _len = obj.length; _i < _len; _i++) { @@ -876,11 +888,11 @@ Persistence } return _results; }); - _this.db.del("user:" + userId + ":active-rules", replyHandler("Deleting user '" + userId + "' rules")); + _this.db.del("user:" + userId + ":active-rules", replyHandler("del user:" + userId + ":active-rules")); _this.db.smembers("user:" + userId + ":roles", function(err, obj) { var delRoleUser, id, _i, _len, _results; delRoleUser = function(roleId) { - return _this.db.srem("role:" + roleId + ":users", userId, replyHandler("Deleting user key '" + userId + "' in role '" + roleId + "'")); + return _this.db.srem("role:" + roleId + ":users", userId, replyHandler("srem 'role:" + roleId + ":users' -> '" + userId + "'")); }; _results = []; for (_i = 0, _len = obj.length; _i < _len; _i++) { @@ -889,7 +901,7 @@ Persistence } return _results; }); - return _this.db.del("user:" + userId + ":roles", replyHandler("Deleting user '" + userId + "' roles")); + return _this.db.del("user:" + userId + ":roles", replyHandler("del 'user:" + userId + ":roles'")); }; })(this); @@ -947,9 +959,37 @@ Persistence exports.storeUserRole = (function(_this) { return function(userId, role) { _this.log.info("DB | storeUserRole: '" + userId + ":" + role + "'"); - _this.db.sadd('roles', role, replyHandler("adding role '" + role + "' to role index set")); - _this.db.sadd("user:" + userId + ":roles", role, replyHandler("adding role '" + role + "' to user '" + userId + "'")); - return _this.db.sadd("role:" + role + ":users", userId, replyHandler("adding user '" + userId + "' to role '" + role + "'")); + _this.db.sadd('roles', role, replyHandler("sadd '" + role + "' to 'roles'")); + _this.db.sadd("user:" + userId + ":roles", role, replyHandler("sadd 'user:" + userId + ":roles' -> '" + role + "'")); + return _this.db.sadd("role:" + role + ":users", userId, replyHandler("sadd 'role:" + role + ":users' -> '" + userId + "'")); + }; + })(this); + + + /* + Associate a role with a user. + + @public storeUserRole( *userId, role* ) + @param {String} userId + @param {String} role + */ + + exports.deleteRole = (function(_this) { + return function(role) { + _this.log.info("DB | deleteRole: '" + role + "'"); + _this.db.smembers("role:" + role + ":users", function(err, obj) { + var delUserRole, id, _i, _len, _results; + delUserRole = function(userId) { + return _this.db.srem("user:" + userId + ":roles", role, replyHandler("srem 'user:" + userId + ":roles' -> '" + role + "'")); + }; + _results = []; + for (_i = 0, _len = obj.length; _i < _len; _i++) { + id = obj[_i]; + _results.push(delUserRole(id)); + } + return _results; + }); + return _this.db.srem("roles", role, replyHandler("srem 'roles' -> '" + role + "'")); }; })(this); @@ -997,8 +1037,8 @@ Persistence exports.removeUserRole = (function(_this) { return function(userId, role) { _this.log.info("DB | removeRoleFromUser: role '" + role + "', user '" + userId + "'"); - _this.db.srem("user:" + userId + ":roles", role, replyHandler("Removing role '" + role + "' from user '" + userId + "'")); - return _this.db.srem("role:" + role + ":users", userId, replyHandler("Removing user '" + userId + "' from role '" + role + "'")); + _this.db.srem("user:" + userId + ":roles", role, replyHandler("srem 'user:" + userId + ":roles' -> '" + role + "'")); + return _this.db.srem("role:" + role + ":users", userId, replyHandler("srem 'role:" + role + ":users' -> '" + userId + "'")); }; })(this); diff --git a/testing/test_components-manager.coffee b/testing/test_components-manager.coffee index 9717a40..4880942 100644 --- a/testing/test_components-manager.coffee +++ b/testing/test_components-manager.coffee @@ -272,3 +272,5 @@ exports.ruleForge = setTimeout fWaitAgain, 200 setTimeout fWaitForPersistence, 200 + +# TODO we have to implement a lot of extensive testing for the component manager since it is a core feature \ No newline at end of file diff --git a/testing/test_persistence.coffee b/testing/test_persistence.coffee index bf11601..19ad1c5 100644 --- a/testing/test_persistence.coffee +++ b/testing/test_persistence.coffee @@ -29,11 +29,12 @@ oRuleTwo = objects.rules.ruleTwo exports.tearDown = ( cb ) -> db.deleteUser oUser.username + db.deleteRole 'tester' setTimeout cb, 100 -# ### -# # Test AVAILABILITY -# ### +### +# Test AVAILABILITY +### exports.Availability = testRequire: ( test ) -> test.expect 1 @@ -607,6 +608,7 @@ exports.User = db.getUserActivatedRules oUser.username, ( err, obj ) -> test.ok obj.length is 0, 'User still associated to activated rules!' + db.deleteRole 'tester' test.done() # Store the user and make some links @@ -616,6 +618,7 @@ exports.User = db.linkRule 'rule-3', oUser.username db.activateRule 'rule-1', oUser.username db.storeUserRole oUser.username, 'tester' + # Verify role is deleted setTimeout fWaitForPersistence, 100 @@ -644,7 +647,6 @@ exports.User = # Test ROLES ### exports.Roles = - testStore: ( test ) -> test.expect 2 diff --git a/testing/test_request-handler.coffee b/testing/test_request-handler.coffee index cc90744..f9df58a 100644 --- a/testing/test_request-handler.coffee +++ b/testing/test_request-handler.coffee @@ -71,6 +71,7 @@ exports.session = tearDown: ( cb ) => db.deleteUser @oUsr.username + db.purgeEventQueue() cb() testLoginAndOut: ( test ) => @@ -173,34 +174,34 @@ exports.events = setTimeout fPopEvent, 200 # try to fetch the db entry exports.testLoginOrPage = ( test ) -> - test.expect 3 + test.expect 3 - req = createRequest() + req = createRequest() + req.query = + page: 'forge_event' + resp = createResponse ( code, msg ) -> + + # Ensure we have to login first + test.ok msg.indexOf( 'document.title = \'Login\'' ) > 0, 'Didn\'t get login page?' + req = createLoggedInRequest() req.query = page: 'forge_event' resp = createResponse ( code, msg ) -> - - # Ensure we have to login first - test.ok msg.indexOf( 'document.title = \'Login\'' ) > 0, 'Didn\'t get login page?' + + # After being logged in we should get the expected page + test.ok msg.indexOf( 'document.title = \'Event Forge!\'' ) > 0, 'Didn\' get forge page?' req = createLoggedInRequest() req.query = - page: 'forge_event' + page: 'wrongpage' resp = createResponse ( code, msg ) -> - # After being logged in we should get the expected page - test.ok msg.indexOf( 'document.title = \'Event Forge!\'' ) > 0, 'Didn\' get forge page?' - req = createLoggedInRequest() - req.query = - page: 'wrongpage' - resp = createResponse ( code, msg ) -> + # A wrong page request should give back an error page + test.ok msg.indexOf( 'document.title = \'Error!\'' ) > 0, 'Didn\' get forge page?' + test.done() - # A wrong page request should give back an error page - test.ok msg.indexOf( 'document.title = \'Error!\'' ) > 0, 'Didn\' get forge page?' - test.done() - - rh.handleForge req, resp # set the handler to listening rh.handleForge req, resp # set the handler to listening rh.handleForge req, resp # set the handler to listening + rh.handleForge req, resp # set the handler to listening exports.testUserCommandsNoLogin = ( test ) -> diff --git a/webpages/handlers/coffee/edit_modules.coffee b/webpages/handlers/coffee/edit_modules.coffee index 114843d..a79f8a6 100644 --- a/webpages/handlers/coffee/edit_modules.coffee +++ b/webpages/handlers/coffee/edit_modules.coffee @@ -3,38 +3,25 @@ fOnLoad = () -> document.title = 'Edit Modules' $( '#pagetitle' ).text "{{{user.username}}}, edit your Modules!" - moduleType = $( '#module_type' ).val() $( '#module_type' ).change () -> - moduleType = $( this ).val() - console.log moduleType fFetchModules() - editor = ace.edit "editor" - editor.setTheme "ace/theme/monokai" - editor.setReadOnly true - editor.setShowPrintMargin false - fErrHandler = ( errMsg ) -> ( err ) -> if err.status is 401 window.location.href = 'forge?page=edit_modules' else - $( '#moduleName' ).html "