168 lines
5.5 KiB
PHP
168 lines
5.5 KiB
PHP
<?php
|
|
/**
|
|
* @file classes/publication/maps/Schema.php
|
|
*
|
|
* Copyright (c) 2014-2020 Simon Fraser University
|
|
* Copyright (c) 2000-2020 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class Schema
|
|
*
|
|
* @brief Map publications to the properties defined in the publication schema
|
|
*/
|
|
|
|
namespace PKP\publication\maps;
|
|
|
|
use APP\core\Request;
|
|
use APP\facades\Repo;
|
|
use APP\publication\Publication;
|
|
use APP\submission\Submission;
|
|
use Illuminate\Support\Enumerable;
|
|
use Illuminate\Support\LazyCollection;
|
|
use PKP\citation\CitationDAO;
|
|
use PKP\context\Context;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\services\PKPSchemaService;
|
|
use PKP\submission\Genre;
|
|
|
|
class Schema extends \PKP\core\maps\Schema
|
|
{
|
|
/** */
|
|
public Enumerable $collection;
|
|
|
|
/** */
|
|
public string $schema = PKPSchemaService::SCHEMA_PUBLICATION;
|
|
|
|
/** @var Submission */
|
|
public $submission;
|
|
|
|
/** @var bool */
|
|
public $anonymize;
|
|
|
|
/** @var LazyCollection UserGroup The user groups for this context. */
|
|
public $userGroups;
|
|
|
|
/** @var Genre[] The file genres for this context. */
|
|
public array $genres;
|
|
|
|
public function __construct(Submission $submission, LazyCollection $userGroups, array $genres, Request $request, Context $context, PKPSchemaService $schemaService)
|
|
{
|
|
parent::__construct($request, $context, $schemaService);
|
|
$this->submission = $submission;
|
|
$this->userGroups = $userGroups;
|
|
$this->genres = $genres;
|
|
}
|
|
|
|
/**
|
|
* Map a publication
|
|
*
|
|
* Includes all properties in the publication schema.
|
|
*/
|
|
public function map(Publication $item, bool $anonymize = false): array
|
|
{
|
|
return $this->mapByProperties($this->getProps(), $item, $anonymize);
|
|
}
|
|
|
|
/**
|
|
* Summarize a publication
|
|
*
|
|
* Includes properties with the apiSummary flag in the publication schema.
|
|
*/
|
|
public function summarize(Publication $item, bool $anonymize = false): array
|
|
{
|
|
return $this->mapByProperties($this->getSummaryProps(), $item, $anonymize);
|
|
}
|
|
|
|
/**
|
|
* Map a collection of Publications
|
|
*
|
|
* @see self::map
|
|
*/
|
|
public function mapMany(Enumerable $collection, bool $anonymize = false): Enumerable
|
|
{
|
|
$this->collection = $collection;
|
|
return $collection->map(function ($item) use ($anonymize) {
|
|
return $this->map($item, $anonymize);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Summarize a collection of Publications
|
|
*
|
|
* @see self::summarize
|
|
*/
|
|
public function summarizeMany(Enumerable $collection, bool $anonymize = false): Enumerable
|
|
{
|
|
$this->collection = $collection;
|
|
return $collection->map(function ($item) use ($anonymize) {
|
|
return $this->summarize($item, $anonymize);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Map schema properties of a Publication to an assoc array
|
|
*/
|
|
protected function mapByProperties(array $props, Publication $publication, bool $anonymize): array
|
|
{
|
|
$this->anonymize = $anonymize;
|
|
|
|
$output = [];
|
|
|
|
foreach ($props as $prop) {
|
|
switch ($prop) {
|
|
case '_href':
|
|
$output[$prop] = $this->getApiUrl(
|
|
'submissions/' . $publication->getData('submissionId') . '/publications/' . $publication->getId(),
|
|
$this->context->getData('urlPath')
|
|
);
|
|
break;
|
|
case 'authors':
|
|
if ($this->anonymize) {
|
|
$output[$prop] = [];
|
|
} else {
|
|
$output[$prop] = Repo::author()->getSchemaMap()->summarizeMany($publication->getData('authors'))->values();
|
|
}
|
|
break;
|
|
case 'authorsString':
|
|
$output[$prop] = $this->anonymize ? '' : $publication->getAuthorString($this->userGroups);
|
|
break;
|
|
case 'authorsStringIncludeInBrowse':
|
|
$output[$prop] = $this->anonymize ? '' : $publication->getAuthorString($this->userGroups, true);
|
|
break;
|
|
case 'authorsStringShort':
|
|
$output[$prop] = $this->anonymize ? '' : $publication->getShortAuthorString();
|
|
break;
|
|
case 'categoryIds':
|
|
$output[$prop] = $publication->getData('categoryIds');
|
|
break;
|
|
case 'citations':
|
|
$citationDao = DAORegistry::getDAO('CitationDAO'); /** @var CitationDAO $citationDao */
|
|
$output[$prop] = array_map(
|
|
function ($citation) {
|
|
return $citation->getCitationWithLinks();
|
|
},
|
|
$citationDao->getByPublicationId($publication->getId())->toArray()
|
|
);
|
|
break;
|
|
case 'doiObject':
|
|
if ($publication->getData('doiObject')) {
|
|
$retVal = Repo::doi()->getSchemaMap()->summarize($publication->getData('doiObject'));
|
|
} else {
|
|
$retVal = null;
|
|
}
|
|
|
|
$output[$prop] = $retVal;
|
|
break;
|
|
case 'fullTitle':
|
|
$output[$prop] = $publication->getFullTitles('html');
|
|
break;
|
|
default:
|
|
$output[$prop] = $publication->getData($prop);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
}
|