219 lines
7.6 KiB
PHP
219 lines
7.6 KiB
PHP
<?php
|
|
/**
|
|
* @file classes/issue/maps/Schema.php
|
|
*
|
|
* Copyright (c) 2014-2023 Simon Fraser University
|
|
* Copyright (c) 2003-2023 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class Schema
|
|
*
|
|
* @brief Map sections to the properties defined in the issue schema
|
|
*/
|
|
|
|
namespace APP\issue\maps;
|
|
|
|
use APP\core\Application;
|
|
use APP\facades\Repo;
|
|
use APP\issue\Issue;
|
|
use APP\issue\IssueGalleyDAO;
|
|
use APP\journal\Journal;
|
|
use Illuminate\Support\Enumerable;
|
|
use Illuminate\Support\LazyCollection;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\services\PKPSchemaService;
|
|
use PKP\submission\Genre;
|
|
use PKP\userGroup\UserGroup;
|
|
|
|
class Schema extends \PKP\core\maps\Schema
|
|
{
|
|
/** @copydoc \PKP\core\maps\Schema::$collection */
|
|
public Enumerable $collection;
|
|
|
|
/** @copydoc \PKP\core\maps\Schema::$schema */
|
|
public string $schema = PKPSchemaService::SCHEMA_ISSUE;
|
|
|
|
/** @var LazyCollection<int,UserGroup> The user groups for this context. */
|
|
public LazyCollection $userGroups;
|
|
|
|
/** @var Genre[] The genres for this context. */
|
|
public array $genres;
|
|
|
|
/**
|
|
* Map an Issue
|
|
*
|
|
* Includes all properties in the Issue schema
|
|
*
|
|
* @param LazyCollection<int,UserGroup> $userGroups The user groups of this content
|
|
* @param Genre[] $genres The genres of this context
|
|
*/
|
|
public function map(Issue $item, Journal $context, LazyCollection $userGroups, array $genres): array
|
|
{
|
|
$this->userGroups = $userGroups;
|
|
$this->genres = $genres;
|
|
return $this->mapByProperties($this->getProps(), $item);
|
|
}
|
|
|
|
/**
|
|
* Summarize an Issue
|
|
*
|
|
* Includes properties with the apiSummary flag in the Issue schema.
|
|
*
|
|
*/
|
|
public function summarize(Issue $item, Journal $context): array
|
|
{
|
|
$this->context = $context;
|
|
return $this->mapByProperties($this->getSummaryProps(), $item);
|
|
}
|
|
|
|
/**
|
|
* Map a collection of Issues
|
|
*
|
|
* @see self::map
|
|
*
|
|
* @param LazyCollection<int,UserGroup> $userGroups The user groups of this content
|
|
* @param Genre[] $genres The genres of this context
|
|
*/
|
|
public function mapMany(Enumerable $collection, Journal $context, LazyCollection $userGroups, array $genres): Enumerable
|
|
{
|
|
$this->collection = $collection;
|
|
return $collection->map(function ($item) use ($context, $userGroups, $genres) {
|
|
return $this->map($item, $context, $userGroups, $genres);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Summarize a collection of Issues
|
|
*
|
|
* @see self::summarize
|
|
*/
|
|
public function summarizeMany(Enumerable $collection, Journal $context): Enumerable
|
|
{
|
|
$this->collection = $collection;
|
|
return $collection->map(function ($item) use ($context) {
|
|
return $this->summarize($item, $context);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Map schema properties of an Issue to an assoc array
|
|
*
|
|
*/
|
|
private function mapByProperties(array $props, Issue $issue): array
|
|
{
|
|
$output = [];
|
|
|
|
foreach ($props as $prop) {
|
|
switch ($prop) {
|
|
case '_href':
|
|
$output[$prop] = $this->getApiUrl('issues/' . $issue->getId(), $this->context->getData('urlPath'));
|
|
break;
|
|
case 'articles':
|
|
$data = [];
|
|
|
|
$submissions = Repo::submission()
|
|
->getCollector()
|
|
->filterByContextIds([$issue->getJournalId()])
|
|
->filterByIssueIds([$issue->getId()])
|
|
->getMany();
|
|
|
|
foreach ($submissions as $submission) {
|
|
$data[] = Repo::submission()->getSchemaMap()->summarize($submission, $this->userGroups, $this->genres);
|
|
}
|
|
|
|
$output[$prop] = $data;
|
|
break;
|
|
case 'coverImageUrl':
|
|
$output[$prop] = $issue->getCoverImageUrls();
|
|
break;
|
|
case 'doiObject':
|
|
if ($issue->getData('doiObject')) {
|
|
$retVal = Repo::doi()->getSchemaMap()->summarize($issue->getData('doiObject'));
|
|
} else {
|
|
$retVal = null;
|
|
}
|
|
|
|
$output[$prop] = $retVal;
|
|
break;
|
|
case 'galleys':
|
|
$data = [];
|
|
/** @var IssueGalleyDAO $issueGalleyDao */
|
|
$issueGalleyDao = DAORegistry::getDAO('IssueGalleyDAO');
|
|
$galleys = $issueGalleyDao->getByIssueId($issue->getId());
|
|
if (!empty($galleys)) {
|
|
$request = Application::get()->getRequest();
|
|
foreach ($galleys as $galley) {
|
|
$data[] = [
|
|
'fileId' => $galley->getData('fileId'),
|
|
'label' => $galley->getData('label'),
|
|
'locale' => $galley->getData('locale'),
|
|
'pub-id::publisher-id' => $galley->getData('pub-id::publisher-id'),
|
|
'sequence' => $galley->getData('sequence'),
|
|
'urlPublished' => $request->getDispatcher()->url(
|
|
$request,
|
|
Application::ROUTE_PAGE,
|
|
$this->context->getPath(),
|
|
'issue',
|
|
'view',
|
|
[
|
|
$galley->getIssueId(),
|
|
$galley->getId()
|
|
]
|
|
),
|
|
'urlRemote' => $galley->getData('urlRemote'),
|
|
];
|
|
}
|
|
}
|
|
$output[$prop] = $data;
|
|
break;
|
|
case 'publishedUrl':
|
|
$output['publishedUrl'] = $this->request->getDispatcher()->url(
|
|
$this->request,
|
|
Application::ROUTE_PAGE,
|
|
$this->context->getPath(),
|
|
'issue',
|
|
'view',
|
|
$issue->getId()
|
|
);
|
|
break;
|
|
case 'sections':
|
|
$data = [];
|
|
$sections = Repo::section()->getByIssueId($issue->getId());
|
|
if (!empty($sections)) {
|
|
$seq = 1;
|
|
foreach ($sections as $section) {
|
|
$sectionProperties = Repo::section()->getSchemaMap()->summarize($section);
|
|
$sectionProperties['seq'] = $seq;
|
|
$seq++;
|
|
$data[] = $sectionProperties;
|
|
}
|
|
}
|
|
$output[$prop] = $data;
|
|
break;
|
|
case 'identification':
|
|
$output[$prop] = $issue->getIssueIdentification();
|
|
break;
|
|
|
|
default:
|
|
$output[$prop] = $issue->getData($prop);
|
|
}
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
|
|
/**
|
|
* Map an issue with only the issue identification for the stats list
|
|
*/
|
|
public function mapToStats(Issue $issue): array
|
|
{
|
|
$props = $this->mapByProperties([
|
|
'_href',
|
|
'id',
|
|
'identification',
|
|
'publishedUrl'
|
|
], $issue);
|
|
return $props;
|
|
}
|
|
}
|