Do not fetch dates without available event

This commit is contained in:
Daniel Siepmann 2022-09-09 08:50:24 +00:00 committed by Dirk Koritnik
parent 637c238372
commit 96a650c5aa
8 changed files with 150 additions and 21 deletions

View file

@ -44,7 +44,9 @@ class DateRepository extends Repository
protected function createDemandQuery(DateDemand $demand): QueryInterface
{
$query = $this->createQuery();
$constraints = [];
$constraints = [
$this->createEventConstraint($query),
];
$categoriesConstraint = $this->createCategoryConstraint($query, $demand);
if ($categoriesConstraint instanceof ConstraintInterface) {
@ -122,9 +124,7 @@ class DateRepository extends Repository
$query->setLimit((int) $demand->getLimit());
}
if (!empty($constraints)) {
$query->matching($query->logicalAnd($constraints));
}
$query->matching($query->logicalAnd($constraints));
$query->setOrderings([$demand->getSortBy() => $demand->getSortOrder()]);
@ -233,4 +233,13 @@ class DateRepository extends Repository
return $statement->execute()->fetchAll();
}
private function createEventConstraint(
QueryInterface $query
): ConstraintInterface {
return $query->logicalAnd(
// Use sub property to trigger join and pulling in event table constraints (hidden)
$query->logicalNot($query->equals('event.uid', null))
);
}
}

View file

@ -0,0 +1,33 @@
2.6.3
=====
Breaking
--------
Nothing
Features
--------
Nothing
Fixes
-----
* Do not fetch dates without available event
As dates don't make sense without an available event.
The event provides necessary info like the title.
Events might be hidden within system, while dates are still available.
Relates: #10075
Tasks
-----
Nothing
Deprecation
-----------
Nothing

View file

@ -0,0 +1,87 @@
<?php
declare(strict_types=1);
/*
* Copyright (C) 2022 Daniel Siepmann <coding@daniel-siepmann.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
namespace Wrm\Events\Tests\Functional\Frontend;
use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\InternalRequest;
use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
use Wrm\Events\Frontend\Daest;
/**
* @covers \Wrm\Events\Frontend\Daest
*/
class DatesTest extends FunctionalTestCase
{
protected $testExtensionsToLoad = [
'typo3conf/ext/events',
];
protected $coreExtensionsToLoad = [
'fluid_styled_content',
];
protected $pathsToProvideInTestInstance = [
'typo3conf/ext/events/Tests/Functional/Frontend/Fixtures/Sites/' => 'typo3conf/sites',
];
protected function setUp(): void
{
parent::setUp();
$this->importCSVDataSet(__DIR__ . '/Fixtures/Database/SiteStructure.csv');
$this->setUpFrontendRootPage(1, [
'constants' => [
'EXT:events/Configuration/TypoScript/constants.typoscript',
],
'setup' => [
'EXT:fluid_styled_content/Configuration/TypoScript/setup.typoscript',
'EXT:events/Configuration/TypoScript/setup.typoscript',
'EXT:events/Tests/Functional/Frontend/Fixtures/TypoScript/Rendering.typoscript'
],
]);
}
/**
* Covers issue https://redmine.werkraum-media.de/issues/10075.
* Editors can disable events. Dates will still be available.
* Dates don't make any sense without an event, as they not even have a name.
*
* They therefore should not be fetched from persistence.
*
* @test
*/
public function returnsOnlyDatesWithAvailableEventByDemand(): void
{
$this->importCSVDataSet(__DIR__ . '/DatesTestFixtures/ReturnsOnlyDatesWithAvailableEventByDemand.csv');
$request = new InternalRequest();
$request = $request->withPageId(1);
$response = $this->executeFrontendRequest($request);
self::assertSame(200, $response->getStatusCode());
$html = (string) $response->getBody();
self::assertStringNotContainsString('Event 1 hidden', $html);
self::assertStringContainsString('Event 2 visible', $html);
}
}

View file

@ -0,0 +1,11 @@
tt_content
,uid,pid,CType,list_type,header
,1,1,list,events_datelist,All Dates
tx_events_domain_model_event
,uid,pid,title,hidden
,1,2,Event 1 hidden,1
,2,2,Event 2 visible,0
tx_events_domain_model_date
,uid,pid,event,start,end
,1,2,1,1662458400,1662469200
,2,2,2,1662458400,1662469200
1 tt_content
2 ,uid,pid,CType,list_type,header
3 ,1,1,list,events_datelist,All Dates
4 tx_events_domain_model_event
5 ,uid,pid,title,hidden
6 ,1,2,Event 1 hidden,1
7 ,2,2,Event 2 visible,0
8 tx_events_domain_model_date
9 ,uid,pid,event,start,end
10 ,1,2,1,1662458400,1662469200
11 ,2,2,2,1662458400,1662469200

View file

@ -29,7 +29,7 @@ class FilterTest extends FunctionalTestCase
{
parent::setUp();
$this->importDataSet('EXT:events/Tests/Functional/Frontend/Fixtures/Database/SiteStructure.xml');
$this->importCSVDataSet(__DIR__ . '/Fixtures/Database/SiteStructure.csv');
$this->setUpFrontendRootPage(1, [
'constants' => [
'EXT:events/Configuration/TypoScript/constants.typoscript',

View file

@ -0,0 +1,4 @@
pages
,uid,pid,title,slug
,1,0,Page 1,/
,2,1,Storage,/storage
1 pages
2 ,uid,pid,title,slug
3 ,1,0,Page 1,/
4 ,2,1,Storage,/storage

View file

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<dataset>
<pages>
<pid>0</pid>
<uid>1</uid>
<title>Page 1</title>
<slug>/</slug>
</pages>
<pages>
<pid>1</pid>
<uid>2</uid>
<title>Storage</title>
<slug>/storage</slug>
</pages>
</dataset>

View file

@ -9,7 +9,7 @@ $EM_CONF['events'] = [
'state' => 'alpha',
'createDirs' => '',
'clearCacheOnLoad' => 0,
'version' => '2.6.2',
'version' => '2.6.3',
'constraints' => [
'depends' => [
'typo3' => '10.4.00-11.5.99',