TYPO3 CMS  TYPO3_8-7
ExtensionRepository.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
20 
25 {
29  const TABLE_NAME = 'tx_extensionmanager_domain_model_extension';
30 
34  protected $dataMapper;
35 
39  public function injectDataMapper(\TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper $dataMapper)
40  {
41  $this->dataMapper = $dataMapper;
42  }
43 
47  public function initializeObject()
48  {
50  $defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface::class);
51  $defaultQuerySettings->setRespectStoragePage(false);
53  }
54 
60  public function countAll()
61  {
62  $query = $this->createQuery();
63  $query = $this->addDefaultConstraints($query);
64  return $query->execute()->count();
65  }
66 
72  public function findAll()
73  {
74  $query = $this->createQuery();
75  $query = $this->addDefaultConstraints($query);
76  $query->setOrderings(
77  [
78  'lastUpdated' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
79  ]
80  );
81  return $query->execute();
82  }
83 
90  public function findByExtensionKeyOrderedByVersion($extensionKey)
91  {
92  $query = $this->createQuery();
93  $query->matching($query->logicalAnd($query->equals('extensionKey', $extensionKey), $query->greaterThanOrEqual('reviewState', 0)));
94  $query->setOrderings(['integerVersion' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING]);
95  return $query->execute();
96  }
97 
104  public function findOneByCurrentVersionByExtensionKey($extensionKey)
105  {
106  $query = $this->createQuery();
107  $query->matching(
108  $query->logicalAnd(
109  $query->equals('extensionKey', $extensionKey),
110  $query->greaterThanOrEqual('reviewState', 0),
111  $query->equals('currentVersion', 1)
112  )
113  );
114  $query->setLimit(1);
115  return $query->execute()->getFirst();
116  }
117 
125  public function findOneByExtensionKeyAndVersion($extensionKey, $version)
126  {
127  $query = $this->createQuery();
128  // Hint: This method must not filter out insecure extensions, if needed,
129  // it should be done on a different level, or with a helper method.
130  $query->matching($query->logicalAnd(
131  $query->equals('extensionKey', $extensionKey),
132  $query->equals('version', $version)
133  ));
134  return $query->setLimit(1)->execute()->getFirst();
135  }
136 
146  public function findByTitleOrAuthorNameOrExtensionKey($searchString)
147  {
148  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
149  ->getQueryBuilderForTable(self::TABLE_NAME);
150 
151  $searchPlaceholderForLike = '%' . $queryBuilder->escapeLikeWildcards($searchString) . '%';
152 
153  $searchConstraints = [
154  'extension_key' => $queryBuilder->expr()->eq(
155  'extension_key',
156  $queryBuilder->createNamedParameter($searchString, \PDO::PARAM_STR)
157  ),
158  'extension_key_like' => $queryBuilder->expr()->like(
159  'extension_key',
160  $queryBuilder->createNamedParameter($searchPlaceholderForLike, \PDO::PARAM_STR)
161  ),
162  'title' => $queryBuilder->expr()->like(
163  'title',
164  $queryBuilder->createNamedParameter($searchPlaceholderForLike, \PDO::PARAM_STR)
165  ),
166  'description' => $queryBuilder->expr()->like(
167  'description',
168  $queryBuilder->createNamedParameter($searchPlaceholderForLike, \PDO::PARAM_STR)
169  ),
170  'author_name' => $queryBuilder->expr()->like(
171  'author_name',
172  $queryBuilder->createNamedParameter($searchPlaceholderForLike, \PDO::PARAM_STR)
173  ),
174  ];
175 
176  $caseStatement = 'CASE ' .
177  'WHEN ' . $searchConstraints['extension_key'] . ' THEN 16 ' .
178  'WHEN ' . $searchConstraints['extension_key_like'] . ' THEN 8 ' .
179  'WHEN ' . $searchConstraints['title'] . ' THEN 4 ' .
180  'WHEN ' . $searchConstraints['description'] . ' THEN 2 ' .
181  'WHEN ' . $searchConstraints['author_name'] . ' THEN 1 ' .
182  'END AS ' . $queryBuilder->quoteIdentifier('position');
183 
184  $result = $queryBuilder
185  ->select('*')
186  ->addSelectLiteral($caseStatement)
187  ->from(self::TABLE_NAME)
188  ->where(
189  $queryBuilder->expr()->orX(...array_values($searchConstraints)),
190  $queryBuilder->expr()->eq('current_version', $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT)),
191  $queryBuilder->expr()->gte('review_state', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT))
192  )
193  ->orderBy('position', 'DESC')
194  ->execute()
195  ->fetchAll();
196 
197  return $this->dataMapper->map(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension::class, $result);
198  }
199 
209  public function findByVersionRangeAndExtensionKeyOrderedByVersion($extensionKey, $lowestVersion = 0, $highestVersion = 0, $includeCurrentVersion = true)
210  {
211  $query = $this->createQuery();
212  $constraint = null;
213  if ($lowestVersion !== 0 && $highestVersion !== 0) {
214  if ($includeCurrentVersion) {
215  $constraint = $query->logicalAnd($query->lessThanOrEqual('integerVersion', $highestVersion), $query->greaterThanOrEqual('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
216  } else {
217  $constraint = $query->logicalAnd($query->lessThanOrEqual('integerVersion', $highestVersion), $query->greaterThan('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
218  }
219  } elseif ($lowestVersion === 0 && $highestVersion !== 0) {
220  if ($includeCurrentVersion) {
221  $constraint = $query->logicalAnd($query->lessThanOrEqual('integerVersion', $highestVersion), $query->equals('extensionKey', $extensionKey));
222  } else {
223  $constraint = $query->logicalAnd($query->lessThan('integerVersion', $highestVersion), $query->equals('extensionKey', $extensionKey));
224  }
225  } elseif ($lowestVersion !== 0 && $highestVersion === 0) {
226  if ($includeCurrentVersion) {
227  $constraint = $query->logicalAnd($query->greaterThanOrEqual('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
228  } else {
229  $constraint = $query->logicalAnd($query->greaterThan('integerVersion', $lowestVersion), $query->equals('extensionKey', $extensionKey));
230  }
231  } elseif ($lowestVersion === 0 && $highestVersion === 0) {
232  $constraint = $query->equals('extensionKey', $extensionKey);
233  }
234  if ($constraint) {
235  $query->matching($query->logicalAnd($constraint, $query->greaterThanOrEqual('reviewState', 0)));
236  }
237  $query->setOrderings([
238  'integerVersion' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
239  ]);
240  return $query->execute();
241  }
242 
249  {
250  $query = $this->createQuery();
251  $query->matching(
252  $query->logicalAnd(
253  $query->equals('category', \TYPO3\CMS\Extensionmanager\Domain\Model\Extension::DISTRIBUTION_CATEGORY),
254  $query->logicalNot($query->equals('ownerusername', 'typo3v4'))
255  )
256  );
257 
258  $query->setOrderings([
259  'alldownloadcounter' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
260  ]);
261 
262  return $query->execute();
263  }
264 
271  {
272  $query = $this->createQuery();
273  $query->matching(
274  $query->logicalAnd(
275  $query->equals('category', \TYPO3\CMS\Extensionmanager\Domain\Model\Extension::DISTRIBUTION_CATEGORY),
276  $query->equals('ownerusername', 'typo3v4')
277  )
278  );
279 
280  $query->setOrderings([
281  'alldownloadcounter' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
282  ]);
283 
284  return $query->execute();
285  }
286 
295  public function countByVersionRangeAndExtensionKey($extensionKey, $lowestVersion = 0, $highestVersion = 0)
296  {
297  return $this->findByVersionRangeAndExtensionKeyOrderedByVersion($extensionKey, $lowestVersion, $highestVersion)->count();
298  }
299 
306  public function findHighestAvailableVersion($extensionKey)
307  {
308  $query = $this->createQuery();
309  $query->matching($query->logicalAnd($query->equals('extensionKey', $extensionKey), $query->greaterThanOrEqual('reviewState', 0)));
310  $query->setOrderings([
311  'integerVersion' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING
312  ]);
313  return $query->setLimit(1)->execute()->getFirst();
314  }
315 
322  public function insertLastVersion($repositoryUid = 1)
323  {
324  $this->markExtensionWithMaximumVersionAsCurrent($repositoryUid);
325 
326  return $this->getNumberOfCurrentExtensions();
327  }
328 
336  protected function markExtensionWithMaximumVersionAsCurrent($repositoryUid)
337  {
338  $uidsOfCurrentVersion = $this->fetchMaximalVersionsForAllExtensions($repositoryUid);
339  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
340  ->getQueryBuilderForTable(self::TABLE_NAME);
341 
342  $queryBuilder
343  ->update(self::TABLE_NAME)
344  ->where(
345  $queryBuilder->expr()->in(
346  'uid',
347  $queryBuilder->createNamedParameter($uidsOfCurrentVersion, Connection::PARAM_INT_ARRAY)
348  )
349  )
350  ->set('current_version', 1)
351  ->execute();
352  }
353 
362  protected function fetchMaximalVersionsForAllExtensions($repositoryUid)
363  {
364  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
365  ->getQueryBuilderForTable(self::TABLE_NAME);
366 
367  $queryResult = $queryBuilder
368  ->select('a.uid AS uid')
369  ->from(self::TABLE_NAME, 'a')
370  ->leftJoin(
371  'a',
372  self::TABLE_NAME,
373  'b',
374  $queryBuilder->expr()->andX(
375  $queryBuilder->expr()->eq('a.repository', $queryBuilder->quoteIdentifier('b.repository')),
376  $queryBuilder->expr()->eq('a.extension_key', $queryBuilder->quoteIdentifier('b.extension_key')),
377  $queryBuilder->expr()->lt('a.integer_version', $queryBuilder->quoteIdentifier('b.integer_version'))
378  )
379  )
380  ->where(
381  $queryBuilder->expr()->eq(
382  'a.repository',
383  $queryBuilder->createNamedParameter($repositoryUid, \PDO::PARAM_INT)
384  ),
385  $queryBuilder->expr()->isNull('b.extension_key')
386  )
387  ->orderBy('a.uid')
388  ->execute();
389 
390  $extensionUids = [];
391  while ($row = $queryResult->fetch()) {
392  $extensionUids[] = $row['uid'];
393  }
394 
395  return $extensionUids;
396  }
397 
403  protected function getNumberOfCurrentExtensions()
404  {
405  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
406  ->getQueryBuilderForTable(self::TABLE_NAME);
407 
408  return (int)$queryBuilder
409  ->count('*')
410  ->from(self::TABLE_NAME)
411  ->where($queryBuilder->expr()->eq(
412  'current_version',
413  $queryBuilder->createNamedParameter(1, \PDO::PARAM_INT)
414  ))
415  ->execute()
416  ->fetchColumn(0);
417  }
418 
426  protected function addDefaultConstraints(\TYPO3\CMS\Extbase\Persistence\Generic\Query $query)
427  {
428  if ($query->getConstraint()) {
429  $query->matching($query->logicalAnd(
430  $query->getConstraint(),
431  $query->equals('current_version', true),
432  $query->greaterThanOrEqual('reviewState', 0)
433  ));
434  } else {
435  $query->matching($query->logicalAnd(
436  $query->equals('current_version', true),
437  $query->greaterThanOrEqual('reviewState', 0)
438  ));
439  }
440  return $query;
441  }
442 }
injectDataMapper(\TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper $dataMapper)
addDefaultConstraints(\TYPO3\CMS\Extbase\Persistence\Generic\Query $query)
findByVersionRangeAndExtensionKeyOrderedByVersion($extensionKey, $lowestVersion=0, $highestVersion=0, $includeCurrentVersion=true)
static makeInstance($className,... $constructorArguments)
countByVersionRangeAndExtensionKey($extensionKey, $lowestVersion=0, $highestVersion=0)
setDefaultQuerySettings(\TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface $defaultQuerySettings)
Definition: Repository.php:197