197 lines
6.9 KiB
PHP
197 lines
6.9 KiB
PHP
<?php
|
|
/**
|
|
* @file classes/user/maps/Schema.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2000-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class Schema
|
|
*
|
|
* @brief Map users to the properties defined in the user schema
|
|
*/
|
|
|
|
namespace PKP\user\maps;
|
|
|
|
use APP\facades\Repo;
|
|
use Illuminate\Support\Enumerable;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\plugins\Hook;
|
|
use PKP\services\PKPSchemaService;
|
|
use PKP\user\User;
|
|
|
|
class Schema extends \PKP\core\maps\Schema
|
|
{
|
|
public Enumerable $collection;
|
|
|
|
public string $schema = PKPSchemaService::SCHEMA_USER;
|
|
|
|
/**
|
|
* Map a publication
|
|
*
|
|
* Includes all properties in the user schema.
|
|
*/
|
|
public function map(User $item): array
|
|
{
|
|
return $this->mapByProperties($this->getProps(), $item);
|
|
}
|
|
|
|
/**
|
|
* Summarize a user
|
|
*
|
|
* Includes properties with the apiSummary flag in the user schema.
|
|
*/
|
|
public function summarize(User $item): array
|
|
{
|
|
return $this->mapByProperties($this->getSummaryProps(), $item);
|
|
}
|
|
|
|
/**
|
|
* Summarize a user with reviewer data
|
|
*
|
|
* Includes properties with the apiSummary flag in the user schema.
|
|
*/
|
|
public function summarizeReviewer(User $item): array
|
|
{
|
|
return $this->mapByProperties(array_merge($this->getSummaryProps(), ['reviewsActive', 'reviewsCompleted', 'reviewsDeclined', 'reviewsCancelled', 'averageReviewCompletionDays', 'dateLastReviewAssignment', 'reviewerRating']), $item);
|
|
}
|
|
|
|
/**
|
|
* Map a collection of Users
|
|
*
|
|
* @see self::map
|
|
*/
|
|
public function mapMany(Enumerable $collection): Enumerable
|
|
{
|
|
$this->collection = $collection;
|
|
return $collection->map(function ($item) {
|
|
return $this->map($item);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Summarize a collection of users
|
|
*
|
|
* @see self::summarize
|
|
*/
|
|
public function summarizeMany(Enumerable $collection): Enumerable
|
|
{
|
|
$this->collection = $collection;
|
|
return $collection->map(function ($item) {
|
|
return $this->summarize($item);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Summarize a collection of reviewers
|
|
*
|
|
* @see self::summarizeReviewer
|
|
*/
|
|
public function summarizeManyReviewers(Enumerable $collection): Enumerable
|
|
{
|
|
$this->collection = $collection;
|
|
return $collection->map(function ($item) {
|
|
return $this->summarizeReviewer($item);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Map schema properties of a user to an assoc array
|
|
*/
|
|
protected function mapByProperties(array $props, User $user): array
|
|
{
|
|
$output = [];
|
|
|
|
foreach ($props as $prop) {
|
|
switch ($prop) {
|
|
case 'id':
|
|
$output[$prop] = (int) $user->getId();
|
|
break;
|
|
case 'fullName':
|
|
$output[$prop] = $user->getFullName();
|
|
break;
|
|
case 'gossip':
|
|
if (Repo::user()->canCurrentUserGossip($user->getId())) {
|
|
$output[$prop] = $user->getGossip();
|
|
}
|
|
break;
|
|
case 'reviewsActive':
|
|
$output[$prop] = $user->getData('incompleteCount');
|
|
break;
|
|
case 'reviewsCompleted':
|
|
$output[$prop] = $user->getData('completeCount');
|
|
break;
|
|
case 'reviewsDeclined':
|
|
$output[$prop] = $user->getData('declinedCount');
|
|
break;
|
|
case 'reviewsCancelled':
|
|
$output[$prop] = $user->getData('cancelledCount');
|
|
break;
|
|
case 'averageReviewCompletionDays':
|
|
$output[$prop] = $user->getData('averageTime');
|
|
break;
|
|
case 'dateLastReviewAssignment':
|
|
$output[$prop] = $user->getData('lastAssigned');
|
|
break;
|
|
case 'disabledReason':
|
|
$output[$prop] = $user->getDisabledReason();
|
|
break;
|
|
case '_href':
|
|
$output[$prop] = $this->getApiUrl(
|
|
'users/' . $user->getId(),
|
|
$this->context->getData('urlPath')
|
|
);
|
|
break;
|
|
case 'groups':
|
|
$output[$prop] = null;
|
|
if ($this->context) {
|
|
$userGroups = Repo::userGroup()->userUserGroups($user->getId(), $this->context->getId());
|
|
$output[$prop] = [];
|
|
foreach ($userGroups as $userGroup) {
|
|
$output[$prop][] = [
|
|
'id' => (int) $userGroup->getId(),
|
|
'name' => $userGroup->getName(null),
|
|
'abbrev' => $userGroup->getAbbrev(null),
|
|
'roleId' => (int) $userGroup->getRoleId(),
|
|
'showTitle' => (bool) $userGroup->getShowTitle(),
|
|
'permitSelfRegistration' => (bool) $userGroup->getPermitSelfRegistration(),
|
|
'permitMetadataEdit' => (bool) $userGroup->getPermitMetadataEdit(),
|
|
'recommendOnly' => (bool) $userGroup->getRecommendOnly(),
|
|
];
|
|
}
|
|
}
|
|
break;
|
|
case 'interests':
|
|
$output[$prop] = [];
|
|
if ($this->context) {
|
|
$interestDao = DAORegistry::getDAO('InterestDAO'); /** @var \PKP\user\InterestDAO $interestDao */
|
|
$interestEntryIds = $interestDao->getUserInterestIds($user->getId());
|
|
if (!empty($interestEntryIds)) {
|
|
$interestEntryDao = DAORegistry::getDAO('InterestEntryDAO'); /** @var \PKP\user\InterestEntryDAO $interestEntryDao */
|
|
$results = $interestEntryDao->getByIds($interestEntryIds);
|
|
$output[$prop] = [];
|
|
while ($interest = $results->next()) {
|
|
$output[$prop][] = [
|
|
'id' => (int) $interest->getId(),
|
|
'interest' => $interest->getInterest(),
|
|
];
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
$output[$prop] = $user->getData($prop);
|
|
break;
|
|
}
|
|
|
|
$output = $this->schemaService->addMissingMultilingualValues($this->schema, $output, $this->context->getSupportedFormLocales());
|
|
|
|
Hook::call('UserSchema::getProperties::values', [$this, &$output, $user, $props]);
|
|
|
|
ksort($output);
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
}
|