Exemple #1
0
	function update($data,$cache,&$changes) {
		$time = time();

		$question = $data->question;
		if(property_exists($question,'id')) {
			$questionRecord = $cache['questionRecord'];

			if(	property_exists($question,'question') ||
				property_exists($question,'mode') ||
				property_exists($data,'answers') ||
				property_exists($data,'deletedAnswerIds')
				) {
				if(property_exists($question,'question')){
					$questionRecord->question = MediabirdUtility::purifyHTML($question->question);
				}
				if(property_exists($question,'mode')) {
					$questionRecord->question_mode = $question->mode;
				}
				$questionRecord->modified = $this->db->datetime($time);
				$questionRecord->modifier = $this->userId;
					
				if($this->db->updateRecord(MediabirdConfig::tableName("Question",true),$questionRecord)) {
					$question = clone $question;
					$question->question = $questionRecord->question;
					$question->modifier = $questionRecord->modifier;
					$question->modified = $time;
				}
				else {
					return MediabirdConstants::serverError;
				}
			}
			else {
				$question = (object)array(
					'id'=>intval($questionRecord->id)
				);
			}
		}
		else {
			$questionRecord = (object)null;
			//data given by user
			$questionRecord->question = MediabirdUtility::purifyHTML($question->question);
			$questionRecord->question_mode = $question->mode;

			//default data
			$questionRecord->user_id = $this->userId;
			$questionRecord->created = $questionRecord->modified = $this->db->datetime($time);
			$questionRecord->modifier = $this->userId;
				
			//insert new record
			if($questionRecord->id=$this->db->insertRecord(MediabirdConfig::tableName("Question",true),$questionRecord)) {
				$question = (object) array(
						'id'=>intval($questionRecord->id),
						'question'=>$questionRecord->question,
						'mode'=>$questionRecord->question_mode,
						'userId'=>$questionRecord->user_id,
						'modified'=>$time,
						'modifier'=>$questionRecord->modifier
				);
			}
			else {
				return MediabirdConstants::serverError;
			}
		}
		
		$changes['questions'] = array($question);
		
		//create and store questions
		if(property_exists($data,'answers')) {
			$answerRecords = isset($cache['answerRecords']) ? $cache['answerRecords'] : array();
			$question->answers = array();
			
			foreach($data->answers as $answer) {
				if(property_exists($answer,'id')) {
					//update record
					$found = false;
					foreach($answerRecords as $answerRecord) {
						if($answerRecord->id==$answer->id) {
							$found = true;
							break;
						}
					}
					if($found) {
						$answerRecord->answer = MediabirdUtility::purifyHTML($answer->answer);
						$answerRecord->modified = $this->db->datetime($time);
						if($this->db->updateRecord(MediabirdConfig::tableName("Answer",true),$answerRecord)) {
							$answer = clone $answer;
							$answer->answer = $answerRecord->answer;
							$answer->modified = $time;
							$changes['answers'] []= $answer;
						}
						else {
							return MediabirdConstants::serverError;
						}
					}
					else {
						return MediabirdConstants::serverError;
					}
				}
				else {
					$answerRecord = (object)null;
					$answerRecord->answer = MediabirdUtility::purifyHTML($answer->answer);
					$answerRecord->question_id = $question->id;
					$answerRecord->user_id = $this->userId;
					$answerRecord->created = $answerRecord->modified = $this->db->datetime($time);
					if($answerRecord->id = $this->db->insertRecord(MediabirdConfig::tableName("Answer",true),$answerRecord)) {
						$answer = (object) array(
								'id'=>intval($answerRecord->id),
								'answer'=>$answerRecord->answer,
								'userId'=>$answerRecord->user_id,
								'modified'=>$time
						);
						$question->answers []= $answer;
					}
					else {
						return MediabirdConstants::serverError;
					}
				}
			}
		}
			
		//create new votes
		if(property_exists($data,'votedAnswerIds')) {
			$votedAnswerIds = array_values($data->votedAnswerIds);

			$question->votes = array();
			
			//retrieve possible votes
			$select = "answer_id IN (".join(",",$votedAnswerIds).") AND user_id=$this->userId";

			$voteRecords = $this->db->getRecords(MediabirdConfig::tableName("Vote",true),$select);
			$voteRecords = $voteRecords ? $voteRecords : array();

			//do not vote if already voted for!
			foreach($voteRecords as $voteRecord) {
				$key = array_search(intval($voteRecord->id),$votedAnswerIds);
				if($key!==false) {
					array_splice($votedAnswerIds,$key,1);
				}
			}

			foreach($votedAnswerIds as $votedAnswerId) {
				$voteRecord = (object)null;
				$voteRecord->answer_id = $votedAnswerId;
				$voteRecord->user_id = $this->userId;
				$voteRecord->created = $voteRecord->modified = $this->db->datetime($time);
					
				if($voteRecord->id=$this->db->insertRecord(MediabirdConfig::tableName("Vote",true),$voteRecord)) {
					$vote = (object)array(
						'id'=>intval($voteRecord->id),
						'modified'=>$time,
						'userId'=>$voteRecord->user_id,
						'answerId'=>$voteRecord->answer_id
					);
					$question->votes []= $vote;
				}
				else {
					return MediabirdConstants::serverError;
				}
			}
		}
			
		//delete old votes
		if(property_exists($data,'unvotedAnswerIds')) {
			$unvotedAnswerIds = $data->unvotedAnswerIds;
			$select = "answer_id IN (".join(",",$unvotedAnswerIds).") AND user_id=$this->userId";
			if($this->db->deleteRecords(MediabirdConfig::tableName("Vote",true),$select)) {
				$changes['unvotedAnswerIds'] = array_values($unvotedAnswerIds);
			}
		}
			
		//update star
		if(property_exists($data,'starAnswerId')) {
			$starAnswerId = $data->starAnswerId;
			
			$select = "user_id=$this->userId AND question_id=$question->id";
			if($starRecord=$this->db->getRecord(MediabirdConfig::tableName("Star",true),$select)) {
				if($starAnswerId!=0) {
					//update star record
					$starRecord->answer_id = $starAnswerId;
					$starRecord->modified = $this->db->datetime($time);
					if($this->db->updateRecord(MediabirdConfig::tableName("Star",true),$starRecord)) {
						$star = (object) array(
							'id'=>intval($starRecord->id),
							'userId'=>$this->userId,
							'answerId'=>$starAnswerId,
							'modified'=>$time
						);
						$question->stars = array($star);
					}
					else {
						return MediabirdConstants::serverError;
					}
				}
				else {
					//delete star
					$select = "id=$starRecord->id";
					if($this->db->deleteRecords(MediabirdConfig::tableName("Star",true),$select)) {
						$changes['removedStarIds'] = array(intval($starRecord->id));
					}
					else {
						return MediabirdConstants::serverError;
					}
				}
			}
			else if($starAnswerId!=0) {
				//create new star record
				$starRecord = (object)null;
				$starRecord->answer_id = $starAnswerId;
				$starRecord->user_id = $this->userId;
				$starRecord->question_id = $question->id;
				$starRecord->created = $starRecord->modified = $this->db->datetime($time);
				if($starRecord->id = $this->db->insertRecord(MediabirdConfig::tableName("Star",true),$starRecord)) {
					$star = (object) array(
							'id'=>intval($starRecord->id),
							'userId'=>$this->userId,
							'answerId'=>$starAnswerId,
							'modified'=>$time
					);
					$question->stars = array($star);
				}
				else {
					return MediabirdConstants::serverError;
				}
			}
		}
			
			
		//delete answers that are to be deleted
		if(property_exists($data,'deletedAnswerIds')) {
			$deletedAnswerIds = $data->deletedAnswerIds;

			//delete votes, stars
			$selectStars = $selectVotes = "answer_id IN (".join(",",$deletedAnswerIds).")";

			$this->db->deleteRecords(MediabirdConfig::tableName("Vote",true),$selectVotes);
			$this->db->deleteRecords(MediabirdConfig::tableName("Star",true),$selectStars);

			//delete answers
			$select = "id IN (".join(",",$deletedAnswerIds).")";
			$this->db->deleteRecords(MediabirdConfig::tableName("Answer",true),$select);

			$changes['removedAnswerIds'] = array_values($deletedAnswerIds);
		}
		
		return MediabirdConstants::processed;
	}
Exemple #2
0
	function validate($data,&$cache,&$reason) {
		$validates = is_object($data) && MediabirdUtility::checkKeyset($data,$this->updateParams,true);
			
		//id must be integer
		if($validates && (!property_exists($data,"id") || !is_int($data->id))) {
			$validates = false;
		}

		if($validates && property_exists($data,"content") && ((!is_string($data->content) && $data->content != null) || strlen($data->content) > MediabirdContent::maxCardSize)) {
		//if given, content must be string and smaller in size than maxsize
			$validates = false;
		}

		//card must exist and user must have access rights
		if($validates) {
			$select = "card_id=$data->id AND topic_id IN (
				SELECT topic_id FROM ".MediabirdConfig::tableName('Right')." WHERE mask>=".MediabirdTopicAccessConstants::allowEditingContent." AND user_id=$this->userId
			)";
			if(!$record = $this->db->getRecord(MediabirdConfig::tableName('CardContent',true),$select)) {
				$reason = MediabirdConstants::accessDenied;
				$validates = false;
			}
		}
		
		//if content given, modification date must be supplied as well to make sure this card hasn't changed in between!
		if($validates && property_exists($data,"content") && (!property_exists($data,'modified') || !is_int($data->modified))) {
			$validates = false;
		}
		
		// make sure modification date matches database value if content given
		if($validates && property_exists($data,"content") && $data->modified != $this->db->timestamp($record->modified)) {
			$reason = MediabirdConstants::invalidRevision;
			$validates = false;
		}
		
		if($validates) {
			//check check-out condition
			$minuteAgo = time()-60;

			$locked = $record->locked_by != $this->userId && $record->locked_by != 0 && $this->db->timestamp($record->locked_time) > $minuteAgo;

			if($locked) {
				$reason = MediabirdConstants::locked;
				$validates = false;
			}
		}
			
		if($validates && property_exists($data,'checkout')) {
			$validates = in_array($data->checkout,array(0,1),true);
		}
			
		if($validates && property_exists($data,'content')) {
			$cache['content'] = $data->content != null ? MediabirdUtility::purifyHTML($data->content) : null;
		}
		
		if($validates) {
			$cache['record'] = $record;
		}

		if(!$validates && !isset($reason)) {
			$reason = MediabirdConstants::invalidData;
		}

		return $validates;
	}