Fix none working import of ticket links from destination data

The existing code didn't work with the provided data.
We added a new test case to cover the situation.
We adjusted the existing code to check on the actual rel value instead
of the keys.
This commit is contained in:
Daniel Siepmann 2022-07-07 08:22:45 +02:00
parent 84111a76ee
commit 3d98475a6c
6 changed files with 469 additions and 15 deletions

View file

@ -359,36 +359,49 @@ class DestinationDataImportService
}
}
/**
* @param array $media
*/
private function setTickets(array $media): void
{
foreach ($media as $link) {
if ($link['rel'] == "ticket") {
if (isset($link['rel']) === false) {
continue;
}
if ($link['rel'] === 'ticket') {
$this->tmpCurrentEvent->setTicket($link['url']);
break;
} elseif ($link['rel'] == "booking" && !$this->multiArrayKeyExists('ticket', $media)) {
return;
}
if (
$link['rel'] === 'booking'
&& !$this->hasRelation('ticket', $media)
) {
$this->tmpCurrentEvent->setTicket($link['url']);
break;
} elseif ($link['rel'] == "PRICE_KARTENLINK" && !$this->multiArrayKeyExists('ticket', $media) && !$this->multiArrayKeyExists('booking', $media)) {
return;
}
if (
$link['rel'] === 'PRICE_KARTENLINK'
&& !$this->hasRelation('ticket', $media)
&& !$this->hasRelation('booking', $media)
) {
$this->tmpCurrentEvent->setTicket($link['url']);
return;
}
}
}
private function multiArrayKeyExists(string $needle, array $haystack): bool
private function hasRelation(string $needle, array $haystack): bool
{
foreach ($haystack as $key => $value) {
if ($needle == $key) {
if (isset($haystack['rel']) && $haystack['rel'] === $needle) {
return true;
}
if (is_array($value)) {
if ($this->multiArrayKeyExists($needle, $value) == true) {
return true;
}
if (is_array($value) && $this->hasRelation($needle, $value)) {
return true;
}
}
return false;
}

View file

@ -0,0 +1,29 @@
2.4.2
=====
Breaking
--------
Nothing
Features
--------
Nothing
Fixes
-----
* Fix broken import of "ticket" property.
The existing code didn't work if the ticket was of type "booking" or "PRICE_KARTENLINK".
This got fixed and tests were added.
Tasks
-----
Nothing
Deprecation
-----------
Nothing

View file

@ -0,0 +1,4 @@
"tx_events_domain_model_event",,,,,
,"uid","pid","title","global_id","ticket"
,"1","2","PRICE_KARTENLINK","e_100347853","https://www.ticketshop-thueringen.de/veranstaltungen/comedy/sonstiges/bodo-wartke-24230"
,"2","2","Booking","e_100354481","https://www.erfurt-tourismus.de/stadtfuehrung/individuell/altstadtfuehrung/onlinebuchung-altstadtfuehrung"
1 tx_events_domain_model_event
2 uid pid title global_id ticket
3 1 2 PRICE_KARTENLINK e_100347853 https://www.ticketshop-thueringen.de/veranstaltungen/comedy/sonstiges/bodo-wartke-24230
4 2 2 Booking e_100354481 https://www.erfurt-tourismus.de/stadtfuehrung/individuell/altstadtfuehrung/onlinebuchung-altstadtfuehrung

View file

@ -0,0 +1,347 @@
{
"status": "OK",
"count": 3,
"overallcount": 50,
"channels": [],
"facetGroups": [],
"items": [
{
"global_id": "e_100347853",
"id": "100347853",
"title": "PRICE_KARTENLINK",
"type": "Event",
"categories": [
"Weihnachten"
],
"texts": [
{
"rel": "details",
"type": "text/html",
"value": "Die Lichter sind entzündet, die Plätzchen duften, man rückt endlich wieder näher zusammen und lauscht den Geschichten. Vier Schauspieler*innen unseres Theaters überraschen mit ihren weihnachtlichen Texten, die sie für uns ausgewählt haben. Dazu plaudern sie über persönliche Anekdoten und erinnern sich an ihre schönsten und verrücktesten Weihnachtsfeste. Und da der Genuss in der Vorweihnachtszeit nicht fehlen darf, wird an jedem Adventssonntag eine andere weihnachtliche Spezialität serviert.<br>Eintritt: 10 € (inkl. Gedeck mit weihnachtlicher Schillerlocke)<br>Um Voranmeldung unter 03672-486470 oder&nbsp;<a data-cke-saved-href=\"mailto:schillerhaus@rudolstadt.de\" href=\"mailto:schillerhaus@rudolstadt.de\">schillerhaus@rudolstadt.de</a>&nbsp;wird gebeten. <br><strong>Es gilt die 2G-PLUS-Regel.</strong>&nbsp;<br>"
},
{
"rel": "details",
"type": "text/plain",
"value": "Die Lichter sind entzündet, die Plätzchen duften, man rückt endlich wieder näher zusammen und lauscht den Geschichten. Vier Schauspieler*innen unseres Theaters überraschen mit ihren weihnachtlichen Texten, die sie für uns ausgewählt haben. Dazu plaudern sie über persönliche Anekdoten und erinnern sich an ihre schönsten und verrücktesten Weihnachtsfeste. Und da der Genuss in der Vorweihnachtszeit nicht fehlen darf, wird an jedem Adventssonntag eine andere weihnachtliche Spezialität serviert.\nEintritt: 10 € (inkl. Gedeck mit weihnachtlicher Schillerlocke)\nUm Voranmeldung unter 03672-486470 oder schillerhaus@rudolstadt.de wird gebeten.\nEs gilt die 2G-PLUS-Regel."
},
{
"rel": "teaser",
"type": "text/html"
},
{
"rel": "teaser",
"type": "text/plain"
}
],
"country": "Deutschland",
"areas": [
"Rudolstadt und Umgebung"
],
"city": "Rudolstadt",
"zip": "07407",
"street": "Schillerstraße 25",
"phone": "+ 49 3672 / 486470",
"fax": "+ 49 3672 / 486475",
"web": "http://www.schillerhaus.rudolstadt.de/",
"email": "schillerhaus@rudolstadt.de",
"author": "support@hubermedia.de",
"geo": {
"main": {
"latitude": 50.720971023258805,
"longitude": 11.335229873657227
},
"entry": [],
"attributes": []
},
"ratings": [
{
"type": "eT4",
"value": 40.0
},
{
"type": "order",
"value": 99.0001
}
],
"cuisine_types": [],
"payment": [],
"media_objects": [
{
"rel": "PRICE_KARTENLINK",
"url": "https://www.ticketshop-thueringen.de/veranstaltungen/comedy/sonstiges/bodo-wartke-24230",
"latitude": null,
"longitude": null,
"value": "Link zum Kartenverkauf"
}
],
"keywords": [],
"timeIntervals": [
{
"weekdays": [],
"start": "2099-12-19T15:00:00+01:00",
"end": "2099-12-19T16:30:00+01:00",
"tz": "Europe/Berlin",
"interval": 1
}
],
"kitchenTimeIntervals": [],
"deliveryTimeIntervals": [],
"numbers": [],
"name": "Schillerhaus Rudolstadt",
"attributes": [
{
"key": "VO_Id",
"value": "100050775"
},
{
"key": "VO_CategoryName",
"value": "POI"
},
{
"key": "VA_Id",
"value": "100050775"
},
{
"key": "VA_CategoryName",
"value": "POI"
},
{
"key": "interval_first_match_start",
"value": "2099-12-19T15:00:00+01"
},
{
"key": "interval_first_match_end",
"value": "2099-12-19T16:30:00+01"
},
{
"key": "interval_match_count",
"value": "1"
}
],
"features": [],
"addresses": [
{
"name": "Städtetourismus in Thüringen e.V.",
"city": "Weimar",
"zip": "99423",
"street": "UNESCO-Platz 1",
"phone": "+49 (3643) 745 314",
"web": "http://www.thueringer-staedte.de",
"email": "verein@thueringer-staedte.de",
"rel": "author"
},
{
"name": "Städtetourismus in Thüringen\" e.V.",
"web": "http://www.thueringer-staedte.de",
"email": "verein@thueringer-staedte.de",
"rel": "organisation"
},
{
"name": "Schillerhaus Rudolstadt",
"city": "Rudolstadt",
"zip": "07407",
"street": "Schillerstraße 25",
"phone": "+ 49 3672 / 486470",
"fax": "+ 49 3672 / 486475",
"web": "http://schillerhaus.rudolstadt.de",
"email": "schillerhaus@rudolstadt.de",
"rel": "organizer"
}
],
"created": "2099-10-31T12:29:00+00:00",
"changed": "2099-12-14T08:29:00+00:00",
"source": {
"url": "http://destination.one/",
"value": "destination.one"
},
"company": "",
"district": "",
"postoffice": "",
"phone2": "",
"seasons": [],
"subitems": [],
"hyperObjects": []
},
{
"global_id": "e_100354481",
"id": "100354481",
"title": "Booking",
"type": "Event",
"categories": [
"Kinder"
],
"texts": [
{
"rel": "details",
"type": "text/html",
"value": "Die Tüftlerzeit wird dieses Mal ein weihnachtliches Angebot bereithalten. Alle kleinen Tüftler dürfen gespannt sein.<br>Voranmeldung über: kinderbibliothek@rudolstadt.de oder 03672-486420<br><br>Bitte beachten Sie die derzeit geltenden Zugangsregeln."
},
{
"rel": "details",
"type": "text/plain",
"value": "Die Tüftlerzeit wird dieses Mal ein weihnachtliches Angebot bereithalten. Alle kleinen Tüftler dürfen gespannt sein.\nVoranmeldung über: kinderbibliothek@rudolstadt.de oder 03672-486420\n\nBitte beachten Sie die derzeit geltenden Zugangsregeln."
},
{
"rel": "teaser",
"type": "text/html"
},
{
"rel": "teaser",
"type": "text/plain"
}
],
"country": "Deutschland",
"areas": [
"Rudolstadt und Umgebung"
],
"city": "Rudolstadt",
"zip": "07407",
"street": "Schulplatz 13",
"phone": "0 36 72 - 48 64 20",
"fax": "0 36 72 - 48 64 30",
"web": "http://www.stadtbibliothek-rudolstadt.de/",
"email": "stadtbibliothek@rudolstadt.de",
"author": "support@hubermedia.de",
"geo": {
"main": {
"latitude": 50.720835175055917,
"longitude": 11.342568397521973
},
"entry": [],
"attributes": []
},
"ratings": [
{
"type": "eT4",
"value": 40.0
},
{
"type": "order",
"value": 99.0001
}
],
"cuisine_types": [],
"payment": [],
"media_objects": [
{
"rel": "booking",
"url": "https://www.erfurt-tourismus.de/stadtfuehrung/individuell/altstadtfuehrung/onlinebuchung-altstadtfuehrung",
"latitude": null,
"longitude": null,
"value": "InfoNetworking"
}
],
"keywords": [],
"timeIntervals": [
{
"weekdays": [],
"start": "2099-12-16T15:00:00+01:00",
"end": "2099-12-16T16:30:00+01:00",
"tz": "Europe/Berlin",
"interval": 1
},
{
"weekdays": [],
"start": "2099-04-01T11:00:00+02:00",
"end": "2099-04-01T13:00:00+02:00",
"repeatUntil": "2099-04-03T00:00+02:00",
"tz": "Europe/Berlin",
"freq": "Daily",
"interval": 1
},
{
"weekdays": [],
"start": "2099-02-17T15:00:00+01:00",
"end": "2099-02-17T17:00:00+01:00",
"tz": "Europe/Berlin",
"interval": 1
}
],
"kitchenTimeIntervals": [],
"deliveryTimeIntervals": [],
"numbers": [],
"name": "Stadtbibliothek Rudolstadt",
"attributes": [
{
"key": "VO_Id",
"value": "100042570"
},
{
"key": "VO_CategoryName",
"value": "POI"
},
{
"key": "VA_Id",
"value": "100042570"
},
{
"key": "VA_CategoryName",
"value": "POI"
},
{
"key": "interval_first_match_start",
"value": "2099-12-16T15:00:00+01"
},
{
"key": "interval_first_match_end",
"value": "2099-12-16T16:30:00+01"
},
{
"key": "interval_match_count",
"value": "3"
},
{
"key": "interval_last_match_start",
"value": "2022-02-17T15:00:00+01"
},
{
"key": "interval_last_match_end",
"value": "2022-02-17T17:00:00+01"
}
],
"features": [],
"addresses": [
{
"name": "Städtetourismus in Thüringen e.V.",
"city": "Weimar",
"zip": "99423",
"street": "UNESCO-Platz 1",
"phone": "+49 (3643) 745 314",
"web": "http://www.thueringer-staedte.de",
"email": "verein@thueringer-staedte.de",
"rel": "author"
},
{
"name": "Städtetourismus in Thüringen\" e.V.",
"web": "http://www.thueringer-staedte.de",
"email": "verein@thueringer-staedte.de",
"rel": "organisation"
},
{
"name": "Stadtbibliothek Rudolstadt",
"city": "Rudolstadt",
"zip": "07407",
"street": "Schulplatz 13",
"phone": "0 36 72 - 48 64 20",
"fax": "0 36 72 - 48 64 30",
"web": "http://www.stadtbibliothek-rudolstadt.de ",
"email": "stadtbibliothek@rudolstadt.de",
"rel": "organizer"
}
],
"created": "2099-11-10T23:02:00+00:00",
"changed": "2099-12-14T08:28:00+00:00",
"source": {
"url": "http://destination.one/",
"value": "destination.one"
},
"company": "",
"district": "",
"postoffice": "",
"phone2": "",
"seasons": [],
"subitems": [],
"hyperObjects": []
}
]
}

View file

@ -0,0 +1,61 @@
<?php
namespace Wrm\Events\Tests\Functional\Import\DestinationDataTest;
use GuzzleHttp\Psr7\Response;
use TYPO3\CMS\Core\Utility\GeneralUtility;
/**
* @testdox DestinationData import
*/
class ImportsTicketsTest extends AbstractTest
{
/**
* @test
* @todo: Missing "ticket" example and combinations.
* Could not find any "ticket" real world example.
*/
public function importsExampleAsExpected(): void
{
$fileImportPathConfiguration = 'staedte/beispielstadt/events/';
$fileImportPath = $this->getInstancePath() . '/fileadmin/' . $fileImportPathConfiguration;
GeneralUtility::mkdir_deep($fileImportPath);
$this->importDataSet('EXT:events/Tests/Functional/Import/DestinationDataTest/Fixtures/SingleRegion.xml');
$this->importDataSet('EXT:events/Tests/Functional/Import/DestinationDataTest/Fixtures/SingleCategory.xml');
$this->setUpConfiguration([
'restUrl = https://example.com/some-path/',
'license = example-license',
'restType = Event',
'restLimit = 3',
'restMode = next_months,12',
'restTemplate = ET2014A.json',
'categoriesPid = 2',
'categoryParentUid = 2',
]);
$requests = &$this->setUpResponses([
new Response(200, [], file_get_contents(__DIR__ . '/Fixtures/ResponseWithTickets.json') ?: ''),
]);
$tester = $this->executeCommand([
'storage-pid' => '2',
'rest-experience' => 'beispielstadt',
'files-folder' => $fileImportPathConfiguration,
'region-uid' => '1',
]);
self::assertSame(0, $tester->getStatusCode());
self::assertCount(1, $requests, 'Unexpected number of requests were made.');
self::assertSame('https://example.com/some-path/?experience=beispielstadt&licensekey=example-license&type=Event&mode=next_months%2C12&limit=3&template=ET2014A.json', (string)$requests[0]['request']->getUri());
$this->assertCSVDataSet('EXT:events/Tests/Functional/Import/DestinationDataTest/Assertions/ImportsTickets.csv');
self::assertFileEquals(
__DIR__ . '/Assertions/EmptyLogFile.txt',
$this->getInstancePath() . '/typo3temp/var/log/typo3_0493d91d8e.log',
'Logfile was not empty.'
);
}
}

View file

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