array( self::ACTION_ELEMENT_ADD => array( self::CONDITION_USER_NOT_CONNECTED, self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_ELEMENT_NOTE => array( self::CONDITION_USER_NOT_CONNECTED, self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_COMMENT_ALERT => array( self::CONDITION_USER_NOT_CONNECTED, self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_ELEMENT_ALERT => array( self::CONDITION_USER_NOT_CONNECTED, self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_TAG_ADD => array( self::CONDITION_USER_NOT_CONNECTED, self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_ELEMENT_TAGS_PROPOSITION => array( self::CONDITION_USER_NOT_CONNECTED, self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_GROUP_ADD => array( self::CONDITION_USER_NOT_CONNECTED, self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_ELEMENT_ADD_TO_FAVORITES => array( self::CONDITION_USER_NOT_CONNECTED ), self::ACTION_COMMENT_ADD => array( self::CONDITION_USER_NOT_CONNECTED ), self::ACTION_USER_FOLLOW => array( self::CONDITION_USER_NOT_CONNECTED ), self::ACTION_GET_FAVORITES_TAGS => array( self::CONDITION_USER_NOT_CONNECTED ), self::ACTION_PLAYLIST_ADD_ELEMENT => array( self::CONDITION_USER_NOT_CONNECTED ), self::ACTION_PLAYLIST_UPDATE_ORDER => array( self::CONDITION_USER_NOT_CONNECTED ), self::ACTION_PLAYLIST_REMOVE_ELEMENT => array( self::CONDITION_USER_NOT_CONNECTED ), self::ACTION_PLAYLIST_CREATE => array( self::CONDITION_USER_NOT_CONNECTED ), self::ACTION_PLAYLIST_COPY => array( self::CONDITION_USER_NOT_CONNECTED ), self::ACTION_PLAYLIST_DELETE => array( self::CONDITION_USER_NOT_CONNECTED ), self::ACTION_PLAYLIST_UNPICK => array( self::CONDITION_USER_NOT_CONNECTED ), self::ACTION_PLAYLIST_PICK => array( self::CONDITION_USER_NOT_CONNECTED ) ), self::AFFECT_NO_SCORING => array( self::ACTION_ELEMENT_NOTE => array( self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_ELEMENT_ADD_TO_FAVORITES => array( self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_ELEMENT_TAGS_PROPOSITION => array( self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_USER_FOLLOW => array( self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_PLAYLIST_ADD_ELEMENT => array( self::CONDITION_USER_EMAIL_NOT_CONFIRMED ), self::ACTION_PLAYLIST_REMOVE_ELEMENT => array( self::CONDITION_USER_EMAIL_NOT_CONFIRMED ) ) ); private $user; private $anonymous = false; public function __construct($user) { if ($user instanceof User) { $this->user = $user; } else if ($user == 'anon.') { $this->user = new User(); $this->anonymous = true; } else { throw new \Exception('Unable to determine type of user'); } } public function canMakeAction($action) { if ($this->actionIsAffectedBy(self::AFFECT_CANT_MAKE, $action) !== false) return false; return true; } protected function actionCanBeAffectedBy($affect, $action) { if (!array_key_exists($affect, self::$affecteds_actions)) throw new \Exception("Unknow action $action"); if (array_key_exists($action, self::$affecteds_actions[$affect])) return true; return false; } public function actionIsAffectedBy($affect, $action) { if ($this->actionCanBeAffectedBy($affect, $action)) { foreach (self::$affecteds_actions[$affect][$action] as $affected_condition) { if ($this->userIsInThisCondition($affected_condition)) { return $affected_condition; } } } return false; } public function userIsInThisCondition($condition) { $affected_condition_method = 'is'.$condition; if ($this->$affected_condition_method()) { return true; } return false; } protected function isUserNotConnected() { if ($this->anonymous) { return true; } return false; } protected function isUserEmailNotConfirmed() { if ($this->user->isEmailConfirmed()) { return false; } return true; } public function getConditionForAffectedAction($action) { } }