TerIndexer.php 9.42 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 ApacheSolrForTypo3\Solr\IndexQueue\Item;
18
use T3o\TerFe2\Utility\VersionUtility;
19 20
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\VersionNumberUtility;
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
     * @var \TYPO3\CMS\Extbase\Object\ObjectManager
34 35 36 37
     */
    protected $objectManager;

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

42
    public function __construct(array $options = [])
Markus Sommer's avatar
Markus Sommer committed
43
    {
44 45
        parent::__construct($options);

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

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

    /**
53 54 55 56 57
     * 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
58
     * @return \Apache_Solr_Document The Solr document converted from the record
59
     */
60 61 62 63 64 65
    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
66 67 68 69
            $itemIndexingConfiguration = $this->getItemTypeConfiguration(
                $item,
                $language
            );
70 71 72 73 74

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

76 77
        return $document;
    }
78

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

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

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

98 99
            // is last version insecure
            $document->setField('insecure_boolS', $extension->getLastVersion()->getReviewState() === -1);
100
            $document->setField('outdated_boolS', $extension->getLastVersion()->getReviewState() === -2);
101

Thomas Löffler's avatar
Thomas Löffler committed
102 103 104
            // composer support
            $document->setField('supportsComposer_boolS', false);
            $document->setField('composerName_stringS', '');
105
            if ($extension->getComposerName()) {
Thomas Löffler's avatar
Thomas Löffler committed
106
                $document->setField('supportsComposer_boolS', true);
107
                $document->setField('composerName_stringS', $extension->getComposerName());
Thomas Löffler's avatar
Thomas Löffler committed
108 109
            }

Thomas Löffler's avatar
Thomas Löffler committed
110 111
            // does this extension supports different versions?
            // @todo: use JSON with all versions to get them
112 113
            $document->setField('supports7_boolS', false);
            $document->setField('supports8_boolS', false);
114
            $document->setField('supports9_boolS', false);
Thomas Löffler's avatar
Thomas Löffler committed
115
            $typo3Support = [];
116
            if (VersionUtility::doesExtensionSupportTypo3Version($extension, 7006000)) {
Thomas Löffler's avatar
Thomas Löffler committed
117
                $typo3Support[] = '7 LTS';
118
                $document->setField('supports7_boolS', true);
Thomas Löffler's avatar
Thomas Löffler committed
119
            }
120
            if (VersionUtility::doesExtensionSupportTypo3Version($extension, 8007000)) {
Thomas Löffler's avatar
Thomas Löffler committed
121
                $typo3Support[] = '8 LTS';
122
                $document->setField('supports8_boolS', true);
Thomas Löffler's avatar
Thomas Löffler committed
123
            }
124 125 126 127
            if (VersionUtility::doesExtensionSupportTypo3Version($extension, 9005000)) {
                $typo3Support[] = '9 LTS';
                $document->setField('supports9_boolS', true);
            }
Thomas Löffler's avatar
Thomas Löffler committed
128 129
            $document->setField('typo3support_stringM', $typo3Support);

130 131 132
            $extensionIcon = $this->getExtensionIcon($itemRecord['ext_key'], $extension->getLastVersion()->getVersionString());
            $document->setField('extensionIcon_stringS', $extensionIcon);

133
            // add documentation link
134 135
            /** @var \T3o\TerFe2\Service\DocumentationService $documentationService */
            $documentationService = GeneralUtility::makeInstance(\T3o\TerFe2\Service\DocumentationService::class);
136
            $documentationLink = $documentationService->getDocumentationLink($extension->getExtKey(), $extension->getLastVersion()->getVersionString(), true);
137
            $document->setField('extensionDocumentationLink_stringS', $documentationLink);
138

139 140 141 142 143
            // use external manual if given
            if ($extension->getExternalManual()) {
                $document->setField('extensionDocumentationLink_stringS', $extension->getExternalManual());
            }

144 145 146 147 148 149
            // has manual
            $document->setField('hasManual_boolS', false);
            if ($documentationLink || $extension->getExternalManual()) {
                $document->setField('hasManual_boolS', true);
            }

150
            // get multiple authors
Thomas Löffler's avatar
Thomas Löffler committed
151 152 153
            $authors = [];
            if ($extension->getLastVersion() && $extension->getLastVersion()->getAuthor()) {
                $authors = GeneralUtility::trimExplode(',', $extension->getLastVersion()->getAuthor()->getName());
154 155 156 157
                if ($extension->getLastVersion()->getAuthor()->getCompany()) {
                    // Add company name to author
                    $authors[] = $extension->getLastVersion()->getAuthor()->getCompany();
                }
Thomas Löffler's avatar
Thomas Löffler committed
158
            }
159
            $document->setField('author_textWstM', $authors);
160 161
        }

162
        return $document;
163 164 165 166 167
    }

    /**
     * get the minimum dependency of an extension for a given $relationName (extension, php version, TYPO3 version...)
     *
168
     * @param \T3o\TerFe2\Domain\Model\Extension $extension
169
     * @param string $relationName The dependency to get the version from (e.g. "typo3" to get the minimum typo3 version)
170
     * @return array
171
     */
Markus Sommer's avatar
Markus Sommer committed
172 173
    protected function getDependencyVersionForPackage(\T3o\TerFe2\Domain\Model\Extension $extension, $relationName)
    {
174
        $versions = [
175 176
            'minimum' => 0,
            'maximum' => 0
177
        ];
178 179 180

        foreach ($extension->getLastVersion()->getSoftwareRelations() as $relation) {
            if ($relation->getRelationType() === 'depends' && $relation->getRelationKey() === $relationName) {
181
                $versions = [
182 183
                    'minimum' => $relation->getMinimumVersion(),
                    'maximum' => $relation->getMaximumVersion()
184
                ];
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
                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
200 201
    protected function getExtensionIcon($extensionKey, $extensionVersion)
    {
202 203 204
        $fileTypesToCheck = [
            'svg',
            'png',
205
            'gif'
206
        ];
207 208 209 210

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

211 212 213 214 215 216 217
        foreach ($fileTypesToCheck as $fileType) {
            $iconFile = $this->generateIconFileName(
                $extensionKey,
                $extensionVersion,
                $fileType
            );
            if (file_exists(PATH_site . $iconPath . $iconFile)) {
218
                $icon = \T3o\TerFe2\Utility\FileUtility::getRelativeUrlFromAbsolutePath($iconPath . $iconFile);
219 220
                break;
            }
221 222 223 224 225 226 227 228 229 230 231 232 233
        }

        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
234 235
    protected function generateIconFileName($extension, $version, $fileType)
    {
236 237 238 239 240 241 242
        if (empty($extension) || empty($version) || empty($fileType)) {
            return '';
        }
        $extension = strtolower($extension);
        $fileType = strtolower(trim($fileType, '. '));
        return $extension[0] . '/' . $extension[1] . '/' . $extension . '_' . $version . '.' . $fileType;
    }
243
}