questlab/models/QuesttopicsModel.inc
2016-05-28 12:30:53 +02:00

487 lines
16 KiB
PHP

<?php
/**
* The Legend of Z
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
* @copyright 2014 Heinrich-Heine-Universität Düsseldorf
* @license http://www.gnu.org/licenses/gpl.html
* @link https://bitbucket.org/coderkun/the-legend-of-z
*/
namespace hhu\z\models;
/**
* Model to interact with Questtopics-table.
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
*/
class QuesttopicsModel extends \hhu\z\Model
{
/**
* Construct a new QuesttopicsModel.
*/
public function __construct()
{
parent::__construct();
}
/**
* Get a Questtopic by its URL.
*
* @param int $seminaryId ID of Seminary
* @param string $questtopicUrl URL-Title of Questtopic
* @return array Questtopic data
*/
public function getQuesttopicByUrl($seminaryId, $questtopicUrl)
{
$data = $this->db->query(
'SELECT id, title, url '.
'FROM questtopics '.
'WHERE seminary_id = ? AND url = ?',
'is',
$seminaryId, $questtopicUrl
);
if(empty($data)) {
throw new \nre\exceptions\IdNotFoundException($questtopicUrl);
}
return $data[0];
}
/**
* Get a Questtopic by its ID.
*
* @param int $questtopicId ID of Questtopic
* @return array Questtopic data
*/
public function getQuesttopicById($questtopicId)
{
$data = $this->db->query(
'SELECT id, title, url '.
'FROM questtopics '.
'WHERE id = ?',
'i',
$questtopicId
);
if(empty($data)) {
throw new \nre\exceptions\IdNotFoundException($questtopicId);
}
return $data[0];
}
/**
* Get all Questtopics for a Seminary.
*
* @param int $seminaryId ID of Seminary
* @return array List of Questtopics
*/
public function getQuesttopicsForSeminary($seminaryId)
{
return $this->db->query(
'SELECT id, title, url '.
'FROM questtopics '.
'WHERE seminary_id = ? '.
'ORDER BY title ASC',
'i',
$seminaryId
);
}
/**
* Copy all Questtopics and their subtopics of a Seminary.
*
* @param int $userId ID of creating user
* @param int $sourceSeminaryId ID of Seminary to copy from
* @param int $targetSeminaryId ID of Seminary to copy to
* @param array $questIds Mapping of Quest-IDs from source Seminary to target Seminary
* @return array Mapping of Questsubtopic-IDs from source Seminary to targetSeminary
*/
public function copyQuesttopicsOfSeminary($userId, $sourceSeminaryId, $targetSeminaryId, $questIds)
{
$questsubtopicIds = array();
// Get Questtopics
$questtopics = $this->getQuesttopicsForSeminary($sourceSeminaryId);
foreach($questtopics as &$questtopic)
{
// Copy Questtopic
$this->db->query(
'INSERT INTO questtopics '.
'(created_user_id, seminary_id, title, url) '.
'SELECT ?, ?, title, url '.
'FROM questtopics '.
'WHERE id = ?',
'iii',
$userId, $targetSeminaryId,
$questtopic['id']
);
$targetQuesttopicId = $this->db->getInsertId();
// Get Questsubtopics
$questsubtopics = $this->getSubtopicsForQuesttopic($questtopic['id']);
foreach($questsubtopics as &$questsubtopic)
{
// Copy Questsubtopic
$this->db->query(
'INSERT INTO questsubtopics '.
'(created_user_id, questtopic_id, title, url) '.
'SELECT ?, ?, title, url '.
'FROM questsubtopics '.
'WHERE id = ?',
'iii',
$userId, $targetQuesttopicId,
$questsubtopic['id']
);
$questsubtopicIds[$questsubtopic['id']] = $this->db->getInsertId();
// Get Quest links
$quests = $this->db->query(
'SELECT quest_id '.
'FROM quests_questsubtopics '.
'WHERE questsubtopic_id = ?',
'i',
$questsubtopic['id']
);
foreach($quests as &$quest)
{
$this->db->query(
'INSERT INTO quests_questsubtopics '.
'(quest_id, questsubtopic_id) '.
'VALUES '.
'(?, ?)',
'ii',
$questIds[$quest['quest_id']],
$questsubtopicIds[$questsubtopic['id']]
);
}
}
}
return $questsubtopicIds;
}
/**
* Get count of Quests that are linked to a Questtopic.
*
* @param int $questtopicId ID of Questtopic
* @return int Count of Quests
*/
public function getQuestCountForQuesttopic($questtopicId)
{
$data = $this->db->query(
'SELECT count(DISTINCT quests_questsubtopics.quest_id) AS c ' .
'FROM questsubtopics '.
'LEFT JOIN quests_questsubtopics ON quests_questsubtopics.questsubtopic_id = questsubtopics.id '.
'WHERE questsubtopics.questtopic_id = ?',
'i',
$questtopicId
);
if(!empty($data)) {
return $data[0]['c'];
}
return 0;
}
/**
* Get count of Quests that are linked to a Questtopic and are
* unlocked by a Character.
*
* @param int $questtopicId ID of Questtopic
* @param int $characterId ID of Character
* @return int Count of Quests
*/
public function getCharacterQuestCountForQuesttopic($questtopicId, $characterId)
{
$data = $this->db->query(
'SELECT count(DISTINCT quests_characters.quest_id) AS c '.
'FROM questsubtopics '.
'LEFT JOIN quests_questsubtopics ON quests_questsubtopics.questsubtopic_id = questsubtopics.id '.
'INNER JOIN quests_characters ON quests_characters.quest_id = quests_questsubtopics.quest_id AND quests_characters.character_id = ? AND quests_characters.status = 3 '.
'WHERE questsubtopics.questtopic_id = ?',
'ii',
$characterId,
$questtopicId
);
if(!empty($data)) {
return $data[0]['c'];
}
return 0;
}
/**
* Get alle Questsubtopics for a Questtopic.
*
* @param int $questtopicId ID of Questtopic
* @return array List of Questsubtopics for this Questtopic
*/
public function getSubtopicsForQuesttopic($questtopicId)
{
return $this->db->query(
'SELECT id, questtopic_id, title, url '.
'FROM questsubtopics '.
'WHERE questsubtopics.questtopic_id = ? '.
'ORDER BY title ASC',
'i',
$questtopicId
);
}
/**
* Get all Questsubtopics for a Quest.
*
* @param int $questId ID of Quest
* @return array List of Questsubtopics
*/
public function getQuestsubtopicsForQuest($questId)
{
return $this->db->query(
'SELECT DISTINCT id, questtopic_id, title, url '.
'FROM quests_questsubtopics '.
'INNER JOIN questsubtopics ON questsubtopics.id = quests_questsubtopics.questsubtopic_id '.
'WHERE quests_questsubtopics.quest_id = ? '.
'ORDER BY questsubtopics.title ASC',
'i',
$questId
);
}
/**
* Set Questsubtopics for a Quest.
*
* @param int $questId ID of Quest to set subtopics for
* @param array $questsubtopicIds List of IDs of subtopics to set
*/
public function setQuestsubtopicsForQuest($questId, $questsubtopicIds)
{
$this->db->setAutocommit(false);
try {
// Remove Questsubtopics
$this->db->query(
'DELETE FROM quests_questsubtopics '.
'WHERE quest_id = ?',
'i',
$questId
);
// Add Questsubtopics
foreach($questsubtopicIds as &$questsubtopicId)
{
$this->db->query(
'INSERT INTO quests_questsubtopics '.
'(quest_id, questsubtopic_id) '.
'VALUES '.
'(?, ?)',
'ii',
$questId, $questsubtopicId
);
}
}
catch(\nre\exceptions\DatamodelException $e) {
$this->db->rollback();
$this->db->setAutocommit(true);
throw $e;
}
$this->db->setAutocommit(true);
}
/**
* Check if a Questtopic title already exists.
*
* @param string $title Questtopic title to check
* @param int $questtopicId Do not check this ID (for editing)
* @return boolean Whether Questtopic title exists or not
*/
public function questtopicTitleExists($title, $questtopicId=null)
{
$data = $this->db->query(
'SELECT id '.
'FROM questtopics '.
'WHERE title = ? OR url = ?',
'ss',
$title,
\nre\core\Linker::createLinkParam($title)
);
return (!empty($data) && (is_null($questtopicId) || $questtopicId != $data[0]['id']));
}
/**
* Create a new Questtopic for a Seminary.
*
* @param int $userId ID of creating user
* @param int $seminaryId ID of Seminary
* @param string $title Title for new Questtopic
* @return int ID of newly created Questtopic
*/
public function createQuesttopic($userId, $seminaryId, $title)
{
$this->db->query(
'INSERT INTO questtopics '.
'(created_user_id, seminary_id, title, url) '.
'VALUES '.
'(?, ?, ?, ?) ',
'iiss',
$userId,
$seminaryId,
$title,
\nre\core\Linker::createLinkParam($title)
);
return $this->db->getInsertId();
}
/**
* Edit a Questtopic.
*
* @param int $questtopicId ID of Questtopic to edit
* @param string $title New title of Questtopic
*/
public function editQuesttopic($questtopicId, $title)
{
$this->db->query(
'UPDATE questtopics '.
'SET title = ?, url = ? '.
'WHERE id = ?',
'ssi',
$title,
\nre\core\Linker::createLinkParam($title),
$questtopicId
);
}
/**
* Delete a Questtopic.
*
* @param int $questtopicId ID of Questtopic to delete
*/
public function deleteQuesttopic($questtopicId)
{
$this->db->query('DELETE FROM questtopics WHERE id = ?', 'i', $questtopicId);
}
/**
* Check if a Questsubtopic title already exists.
*
* @param int $questtopicId ID of Questtopic
* @param string $title Questsubtopic title to check
* @param int $questsubtopicId Do not check this ID (for editing)
* @return boolean Whether Questsubtopic title exists or not
*/
public function questsubtopicTitleExists($questtopicId, $title, $questsubtopicId=null)
{
$data = $this->db->query(
'SELECT id '.
'FROM questsubtopics '.
'WHERE questtopic_id = ? AND (title = ? OR url = ?)',
'iss',
$questtopicId,
$title,
\nre\core\Linker::createLinkParam($title)
);
return (!empty($data) && (is_null($questsubtopicId) || $questsubtopicId != $data[0]['id']));
}
/**
* Create a new Questsubtopic for a Questtopic.
*
* @param int $userId ID of creating user
* @param int $questtopicId ID of Qusttopic
* @param string $title Title for new Questtopic
* @return int ID of newly created Questsubtopic
*/
public function createQuestsubtopic($userId, $questtopicId, $title)
{
$this->db->query(
'INSERT INTO questsubtopics '.
'(created_user_id, questtopic_id, title, url) '.
'VALUES '.
'(?, ?, ?, ?) ',
'iiss',
$userId,
$questtopicId,
$title,
\nre\core\Linker::createLinkParam($title)
);
return $this->db->getInsertId();
}
/**
* Edit a Questsubtopic.
*
* @param int $questsubtopicId ID of Questsubtopic to edit
* @param string $title New title of Questsubtopic
*/
public function editQuestsubtopic($questsubtopicId, $title)
{
$this->db->query(
'UPDATE questsubtopics '.
'SET title = ?, url = ? '.
'WHERE id = ?',
'ssi',
$title,
\nre\core\Linker::createLinkParam($title),
$questsubtopicId
);
}
/**
* Delete a Questsubtopic.
*
* @param int $questtopicId ID of Questsubtopic to delete
*/
public function deleteQuestsubtopic($questtopicId)
{
$this->db->query('DELETE FROM questsubtopics WHERE id = ?', 'i', $questtopicId);
}
/**
* Delete all Questtopics of a Seminary.
*
* @param int $seminaryId ID of Seminary to delete Questtopics of
*/
public function deleteQuesttopicsOfSeminary($seminaryId)
{
$this->db->query('DELETE FROM questtopics WHERE seminary_id = ?', 'i', $seminaryId);
}
}
?>