<?php
/**
* @file classes/journal/JournalDAO.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2003-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class JournalDAO
*
* @ingroup journal
*
* @see Journal
*
* @brief Operations for retrieving and modifying Journal objects.
*/
namespace APP\journal;
use APP\core\Application;
use APP\facades\Repo;
use PKP\context\ContextDAO;
use PKP\db\DAORegistry;
use PKP\metadata\MetadataTypeDescription;
/**
* @extends ContextDAO<Journal>
*/
class JournalDAO extends ContextDAO
{
/** @copydoc SchemaDAO::$schemaName */
public $schemaName = 'context';
/** @copydoc SchemaDAO::$tableName */
public $tableName = 'journals';
/** @copydoc SchemaDAO::$settingsTableName */
public $settingsTableName = 'journal_settings';
/** @copydoc SchemaDAO::$primaryKeyColumn */
public $primaryKeyColumn = 'journal_id';
/** @var array Maps schema properties for the primary table to their column names */
public $primaryTableColumns = [
'id' => 'journal_id',
'urlPath' => 'path',
'enabled' => 'enabled',
'seq' => 'seq',
'primaryLocale' => 'primary_locale',
'currentIssueId' => 'current_issue_id'
];
/**
* Create a new DataObject of the appropriate class
*
* @return Journal
*/
public function newDataObject()
{
return new Journal();
}
/**
* Retrieve the IDs and titles of all journals in an associative array.
*
* @return array<int,string>
*/
public function getTitles($enabledOnly = false)
{
$journals = [];
$journalIterator = $this->getAll($enabledOnly);
while ($journal = $journalIterator->next()) {
$journals[$journal->getId()] = $journal->getLocalizedName();
}
return $journals;
}
/**
* Delete the public IDs of all publishing objects in a journal.
*
* @param int $journalId
* @param string $pubIdType One of the NLM pub-id-type values or
* 'other::something' if not part of the official NLM list
* (see <http://dtd.nlm.nih.gov/publishing/tag-library/n-4zh0.html>).
*/
public function deleteAllPubIds($journalId, $pubIdType)
{
Repo::galley()->dao->deleteAllPubIds($journalId, $pubIdType);
Repo::submissionFile()->dao->deleteAllPubIds($journalId, $pubIdType);
Repo::issue()->dao->deleteAllPubIds($journalId, $pubIdType);
Repo::publication()->dao->deleteAllPubIds($journalId, $pubIdType);
}
/**
* Check whether the given public ID exists for any publishing
* object in a journal.
*
* @param int $journalId
* @param string $pubIdType One of the NLM pub-id-type values or
* 'other::something' if not part of the official NLM list
* (see <http://dtd.nlm.nih.gov/publishing/tag-library/n-4zh0.html>).
* @param string $pubId
* @param int $assocType The object type of an object to be excluded from
* the search. Identified by one of the Application::ASSOC_TYPE_* constants.
* @param int $assocId The id of an object to be excluded from the search.
* @param bool $forSameType Whether only the same objects should be considered.
*
* @return bool
*/
public function anyPubIdExists(
$journalId,
$pubIdType,
$pubId,
$assocType = MetadataTypeDescription::ASSOC_TYPE_ANY,
$assocId = 0,
$forSameType = false
) {
$pubObjectDaos = [
Application::ASSOC_TYPE_ISSUE => Repo::issue()->dao,
Application::ASSOC_TYPE_PUBLICATION => Repo::publication()->dao,
Application::ASSOC_TYPE_GALLEY => Application::getRepresentationDAO(),
Application::ASSOC_TYPE_ISSUE_GALLEY => DAORegistry::getDAO('IssueGalleyDAO'),
Application::ASSOC_TYPE_SUBMISSION_FILE => Repo::submissionFile()->dao,
];
if ($forSameType) {
$dao = $pubObjectDaos[$assocType];
$excludedId = $assocId;
if ($dao->pubIdExists($pubIdType, $pubId, $excludedId, $journalId)) {
return true;
}
return false;
}
foreach ($pubObjectDaos as $daoAssocType => $dao) {
if ($assocType == $daoAssocType) {
$excludedId = $assocId;
} else {
$excludedId = 0;
}
if ($dao->pubIdExists($pubIdType, $pubId, $excludedId, $journalId)) {
return true;
}
}
return false;
}
/**
* Sets current_issue_id for context to null.
* This is necessary because current_issue_id should explicitly be set to null rather than unset.
*
* @param int $contextId
*
* @return int
*/
public function removeCurrentIssue($contextId)
{
return $this->update(
"UPDATE {$this->tableName} SET current_issue_id = null WHERE {$this->primaryKeyColumn} = ?",
[(int) $contextId]
);
}
}
if (!PKP_STRICT_MODE) {
class_alias('\APP\journal\JournalDAO', '\JournalDAO');
}
|