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; }
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; }