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; } }