first commit
This commit is contained in:
@@ -0,0 +1,218 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user