TerIndexer.php 8.17 KB
Newer Older
1
<?php
2
namespace T3o\TerFe2\Solr\IndexQueue;
3

4
/*
5
 * This file is part of the TYPO3 CMS project.
6
 *
7 8 9
 * It is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License, either version 2
 * of the License, or any later version.
10
 *
11 12
 * For the full copyright and license information, please read the
 * LICENSE.txt file that was distributed with this source code.
13
 *
14 15
 * The TYPO3 project - inspiring people to share!
 */
16

17
use TYPO3\CMS\Core\Utility\GeneralUtility;
18
use ApacheSolrForTypo3\Solr\IndexQueue\Item;
19
use TYPO3\CMS\Core\Utility\VersionNumberUtility;
Thomas Löffler's avatar
Thomas Löffler committed
20
use T3o\TerFe2\Utility\Version;
21 22

/**
23
 * Class \T3o\TerFe2\Solr\IndexQueue\TerIndexer
24 25 26 27 28
 *
 * @author Sascha Egerer <sascha@sascha-egerer.de>
 * @author Thomas Löffler <thomas.loeffler@typo3.org>
 * @author Tomas Norre Mikkelsen <tomasnorre@gmail.com>
 */
Markus Sommer's avatar
Markus Sommer committed
29 30
class TerIndexer extends \ApacheSolrForTypo3\Solr\IndexQueue\Indexer
{
31 32 33


    /**
34
     * @var \TYPO3\CMS\Extbase\Object\ObjectManager
35 36 37 38
     */
    protected $objectManager;

    /**
39
     * @var \T3o\TerFe2\Domain\Repository\ExtensionRepository
40 41 42 43
     */
    protected $extensionRepository;


Markus Sommer's avatar
Markus Sommer committed
44 45
    public function __construct(array $options = array())
    {
46 47
        parent::__construct($options);

48
        $this->objectManager = GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\ObjectManager::class);
49
        $this->extensionRepository = $this->objectManager->get(\T3o\TerFe2\Domain\Repository\ExtensionRepository::class);
50

Markus Sommer's avatar
Markus Sommer committed
51
        $this->extensionRepository->setShowInsecure(false);
52 53 54
    }

    /**
55 56 57 58 59
     * Converts an item array (record) to a Solr document by mapping the
     * record's fields onto Solr document fields as configured in TypoScript.
     *
     * @param Item $item An index queue item
     * @param int $language Language Id
60
     * @return \Apache_Solr_Document The Solr document converted from the record
61
     */
62 63 64 65 66 67
    protected function itemToDocument(Item $item, $language = 0)
    {
        $document = null;

        $itemRecord = $this->getFullItemRecord($item, $language);
        if (!is_null($itemRecord)) {
Markus Sommer's avatar
Markus Sommer committed
68 69 70 71
            $itemIndexingConfiguration = $this->getItemTypeConfiguration(
                $item,
                $language
            );
72 73 74 75 76

            $document = $this->getBaseDocument($item, $itemRecord);
            $document = $this->addDocumentFieldsFromTyposcript($document, $itemIndexingConfiguration, $itemRecord);
            $document = $this->addSpecialFields($document, $itemRecord);
        }
77

78 79
        return $document;
    }
80

81 82 83 84 85
    /**
     * @param \Apache_Solr_Document $document
     * @param array $itemRecord
     * @return \Apache_Solr_Document
     */
86
    public function addSpecialFields(\Apache_Solr_Document $document, array $itemRecord)
87 88 89
    {
        $extension = $this->extensionRepository->findByUid($itemRecord['uid']);

90
        if ($extension instanceof \T3o\TerFe2\Domain\Model\Extension && $extension->getLastVersion() instanceof \T3o\TerFe2\Domain\Model\Version) {
91 92 93
            $typo3Dependency = $this->getDependencyVersionForPackage($extension, 'typo3');
            $document->setField('extensionMinTYPO3Version_tIntS', $typo3Dependency['minimum']);
            $document->setField('extensionMaxTYPO3Version_tIntS', $typo3Dependency['maximum']);
94

95 96 97 98 99
            $dependencyString = '';
            $dependencyString .= $typo3Dependency['minimum'] > 0 ? VersionNumberUtility::convertIntegerToVersionNumber($typo3Dependency['minimum']) : '';
            $dependencyString .= $typo3Dependency['maximum'] > 0 ? ' - ' . VersionNumberUtility::convertIntegerToVersionNumber($typo3Dependency['maximum']) : '';
            $document->setField('extensionDependency_stringS', $dependencyString ?: 'N/A');

100 101
            // is last version insecure
            $document->setField('insecure_boolS', $extension->getLastVersion()->getReviewState() === -1);
102
            $document->setField('outdated_boolS', $extension->getLastVersion()->getReviewState() === -2);
Thomas Löffler's avatar
Thomas Löffler committed
103

Thomas Löffler's avatar
Thomas Löffler committed
104 105 106 107 108
            // does this extension supports different versions?
            // @todo: use JSON with all versions to get them
            $lastVersion = $extension->getLastVersion();
            $document->setField('supports7_boolS', Version::doesExtensionVersionSupportTypo3Version($lastVersion, 7006000));
            $document->setField('supports8_boolS', Version::doesExtensionVersionSupportTypo3Version($lastVersion, 8007000));
Thomas Löffler's avatar
Thomas Löffler committed
109 110 111 112 113 114 115 116 117
            $typo3Support = [];
            if (Version::doesExtensionVersionSupportTypo3Version($lastVersion, 7006000)) {
                $typo3Support[] = '7 LTS';
            }
            if (Version::doesExtensionVersionSupportTypo3Version($lastVersion, 8007000)) {
                $typo3Support[] = '8 LTS';
            }
            $document->setField('typo3support_stringM', $typo3Support);

118 119 120
            $extensionIcon = $this->getExtensionIcon($itemRecord['ext_key'], $extension->getLastVersion()->getVersionString());
            $document->setField('extensionIcon_stringS', $extensionIcon);

Thomas Löffler's avatar
Thomas Löffler committed
121
            // add documentation link
122 123 124
            /** @var \T3o\TerFe2\Service\Documentation $documentationService */
            $documentationService = GeneralUtility::makeInstance(\T3o\TerFe2\Service\Documentation::class);
            $documentationLink = $documentationService->getDocumentationLink($extension->getExtKey(), $extension->getLastVersion()->getVersionString(), true);
Thomas Löffler's avatar
Thomas Löffler committed
125
            $document->setField('extensionDocumentationLink_stringS', $documentationLink);
126 127

            // get multiple authors
Thomas Löffler's avatar
Thomas Löffler committed
128 129 130 131
            $authors = [];
            if ($extension->getLastVersion() && $extension->getLastVersion()->getAuthor()) {
                $authors = GeneralUtility::trimExplode(',', $extension->getLastVersion()->getAuthor()->getName());
            }
132
            $document->setField('author_textWstM', $authors);
133 134
        }

135
        return $document;
136 137 138 139 140
    }

    /**
     * get the minimum dependency of an extension for a given $relationName (extension, php version, TYPO3 version...)
     *
141
     * @param \T3o\TerFe2\Domain\Model\Extension $extension
142
     * @param string $relationName The dependency to get the version from (e.g. "typo3" to get the minimum typo3 version)
Thomas Löffler's avatar
Thomas Löffler committed
143
     * @return array
144
     */
Markus Sommer's avatar
Markus Sommer committed
145 146
    protected function getDependencyVersionForPackage(\T3o\TerFe2\Domain\Model\Extension $extension, $relationName)
    {
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
        $versions = array(
            'minimum' => 0,
            'maximum' => 0
        );

        foreach ($extension->getLastVersion()->getSoftwareRelations() as $relation) {
            if ($relation->getRelationType() === 'depends' && $relation->getRelationKey() === $relationName) {
                $versions = array(
                    'minimum' => $relation->getMinimumVersion(),
                    'maximum' => $relation->getMaximumVersion()
                );
                break;
            }
        }

        return $versions;
    }

    /**
     * get the relative path for the extension icon
     * could be png or gif
     *
     * @param $extensionKey
     * @param $extensionVersion
     * @return string
     */
Markus Sommer's avatar
Markus Sommer committed
173 174
    protected function getExtensionIcon($extensionKey, $extensionVersion)
    {
175 176 177
        $fileTypesToCheck = [
            'svg',
            'png',
178
            'gif'
179
        ];
180 181 182 183

        $iconPath = 'fileadmin/ter/';
        $icon = '';

184 185 186 187 188 189 190 191 192 193
        foreach ($fileTypesToCheck as $fileType) {
            $iconFile = $this->generateIconFileName(
                $extensionKey,
                $extensionVersion,
                $fileType
            );
            if (file_exists(PATH_site . $iconPath . $iconFile)) {
                $icon = \T3o\TerFe2\Utility\File::getRelativeUrlFromAbsolutePath($iconPath . $iconFile);
                break;
            }
194 195 196 197 198 199 200 201 202 203 204 205 206
        }

        return $icon;
    }

    /**
     * generate the path to an extension icon for a specific version
     *
     * @param $extension
     * @param $version
     * @param $fileType
     * @return string
     */
Markus Sommer's avatar
Markus Sommer committed
207 208
    protected function generateIconFileName($extension, $version, $fileType)
    {
209 210 211 212 213 214 215
        if (empty($extension) || empty($version) || empty($fileType)) {
            return '';
        }
        $extension = strtolower($extension);
        $fileType = strtolower(trim($fileType, '. '));
        return $extension[0] . '/' . $extension[1] . '/' . $extension . '_' . $version . '.' . $fileType;
    }
216
}