Skip to content
This repository has been archived by the owner on Jul 11, 2023. It is now read-only.

Grouped Events and Refactor #41

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/Ticketmaster.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
use unionco\ticketmaster\variables\TicketmasterVariable;
use yii\base\Event;
use craft\events\DeleteElementEvent;
use unionco\ticketmaster\services\LogService;

/**
* Craft plugins are very much like little applications in and of themselves. We’ve made
Expand Down Expand Up @@ -107,6 +108,7 @@ public function init()
'elements' => ElementService::class,
'events' => EventService::class,
'venues' => VenueService::class,
'log' => LogService::class,
]);

// Add in our console commands
Expand Down
4 changes: 2 additions & 2 deletions src/controllers/EventController.php
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ public function actionStoreEvent()
]);
}

$venueModel = new VenueModel($venueRecord);
$venueModel = new VenueModel($venueRecord->getAttributes());
try {
$event = $elementService->getEventDetail((string) $eventId);
$result = $elementService->saveEvent($event, $venueModel);
Expand Down Expand Up @@ -166,7 +166,7 @@ public function actionStoreEvents()
]);
}

$venue = new VenueModel($venue);
$venue = new VenueModel($venue->getAttributes());
$events = $elementService->getEventsByVenueId($venue->tmVenueId);

foreach ($events as $key => $event) {
Expand Down
2 changes: 1 addition & 1 deletion src/elements/Event.php
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ protected static function defineSources(string $context = null): array
$venueRecords = Ticketmaster::$plugin->venues->getVenues();

$venues = array_map(function ($record) {
return new VenueModel($record);
return new VenueModel($record->getAttributes());
}, $venueRecords);

foreach ($venues as $key => $venue) {
Expand Down
6 changes: 3 additions & 3 deletions src/elements/db/EventQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,17 @@ class EventQuery extends ElementQuery
/**
* @var int
*/
public $tmVenueId;
public $tmVenueId = '';

/**
* @var string
*/
public $tmEventId;
public $tmEventId = '';

/**
* @var string
*/
public array|string|null $status;
public array|string|null $status = null;

// Public Methods
// =========================================================================
Expand Down
48 changes: 30 additions & 18 deletions src/jobs/UpdateEvents.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

/**
* Ticketmaster plugin for Craft CMS 3.x.
*
Expand Down Expand Up @@ -53,29 +54,40 @@ class UpdateEvents extends BaseJob
public function execute($queue): void
{
$venues = Ticketmaster::$plugin->venues->getVenues();

$log = Ticketmaster::$plugin->log;
$count = count($venues);
$log->info("Starting sync via UpdateEvents queue job (based on $count venues)");

$queue = Craft::$app->getQueue();

for ($step = 0; $step < $count; ++$step) {
$this->setProgress($queue, $step / $count);

$events = Ticketmaster::$plugin->elements->getEventsByVenueId($venues[$step]->tmVenueId);

$queue->push(new UpdateVenueEvents([
'description' => 'Fetching ('.count($events).") events for {$venues[$step]->title} in {$this->siteHandle}",
'events' => $events,
'venue' => [
'id' => $venues[$step]->id,
],
'siteHandle' => $this->siteHandle,
]));

sleep(2);
try {
// for ($step = 0; $step < $count; ++$step) {
foreach ($venues as $step => $venue) {
$this->setProgress($queue, $step / $count);
$venueId = $venue->tmVenueId;
$title = $venue->title;
$events = Ticketmaster::$plugin->elements->getEventsByVenueId($venueId);
$count = count($events);
$log->info("[$step] Processing venue ($title) with ID: $venueId");
if (!$count) {
$log->info("No events for current venue. Skipping.");
continue;
}
$queue->push(new UpdateVenueEvents([
'description' => "Fetching ($count) events for {$title} in {$this->siteHandle}",
'events' => $events,
'venue' => [
'id' => $venue->id,
],
'siteHandle' => $this->siteHandle,
]));
$log->info("Added queue job. Sleeping for 2 seconds.");
sleep(2);
}
} catch (\Throwable $e) {
$log->error("Error encountered in UpdateEvents job.", $e);
throw $e;
}

return true;
}

protected function defaultDescription(): ?string
Expand Down
97 changes: 81 additions & 16 deletions src/jobs/UpdateVenueEvents.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,107 @@

namespace unionco\ticketmaster\jobs;

use craft\helpers\ArrayHelper;
use DateTime;
use craft\helpers\Json;
use craft\queue\BaseJob;
use Exception;
use unionco\ticketmaster\Ticketmaster;
use unionco\ticketmaster\services\LogService;
use unionco\ticketmaster\services\ElementService;
use unionco\ticketmaster\models\Venue as VenueModel;
use unionco\ticketmaster\records\Venue as VenueRecord;
use unionco\ticketmaster\services\EventService;

class UpdateVenueEvents extends BaseJob
{
public $events;
public $venue;
public $siteHandle;
public array $events = [];
/** @var array This will be an array containing the key 'id' */
public array $venue = [];
public string $siteHandle = 'default';

public function execute($queue): void
{
$eventService = Ticketmaster::$plugin->elements;
$count = count($this->events);
$venueRecord = VenueRecord::find()->where(['id' => $this->venue])->one();
$venueModel = new VenueModel($venueRecord->getAttributes());
/** @var ElementService */
$elementService = Ticketmaster::$plugin->elements;
/** @var EventService */
$eventService = Ticketmaster::$plugin->events;
/** @var LogService */
$log = Ticketmaster::$plugin->log;

for ($step = 0; $step < $count; ++$step) {
$this->setProgress($queue, $step / $count);
try {
$venue = $this->getVenue();
$logPrefix = "[Venue {$venue->title} {$venue->tmVenueId}] ";

$eventDetails = $this->events[$step];
// Before looping, group the events based on their names
$groupedEvents = $eventService->groupEventsByName($this->events);

if ($eventDetails) {
foreach ($groupedEvents as $name => $eventInstances) {
// Each $eventInstance is the same 'Event', but with a unique performance date/time/URL
$instances = [];
foreach ($eventInstances as $i => $eventInstance) {
$loop1Index = $i + 1;
$key = "new{$loop1Index}";
$instances[$key] = $eventService->getEventSupertableInfo($eventInstance);
}
// Events have been grouped, so now proceed with the original plan
// Event Instances supertable data will be added to the entry in
// `ElementService::saveElement`
$eventDetails = ArrayHelper::firstValue($eventInstances);
$eventDetails['eventInstances'] = $instances;
// save
$eventService->saveEvent($eventDetails, $venueModel);
} else {
return false;
$description = $this->getEventDetailsDescription($eventDetails);
$log->info("{$logPrefix}Event Details are present, starting save. $description");
try {
$elementService->saveEvent($eventDetails, $venue);
} catch (\Throwable $e) {
$log->error("{$logPrefix} Error encountered during ElementService::saveEvent.", $e);
throw new Exception("error in saveEvent - {$e->getMessage()}");
}
}
} catch (\Throwable $e) {
$log->error("Error encountered in UpdateVendueEvents job.", $e);
throw $e;
}
}

return true;
public function getVenue(): VenueModel
{
$venueRecord = VenueRecord::find()->where(['id' => $this->venue])->one();
try {
$venueModel = new VenueModel($venueRecord->getAttributes());
return $venueModel;
} catch (\Throwable $e) {
/** @todo */
throw new Exception("Error at getVenue");
}
}

protected function defaultDescription(): ?string
{
return 'Updating events for venue.';
if ($venue = $this->getVenue()) {
return "Updating events for venue {$venue->title} [{$venue->tmVenueId}]";
}
return 'Updating events for venue (details not available)';
}

protected function getEventDetailsDescription(array $eventDetails): string
{
$desc = "";
if ($name = $eventDetails['name'] ?? false) {
$desc .= "[Name: $name] ";
}

if ($dateBlock = $eventDetails['dates'] ?? false) {
if ($startBlock = $dateBlock['start'] ?? false) {
$startDate = new DateTime($startBlock['dateTime']);
$formatted = $startDate->format("Y-m-d H:i:s");
$desc .= "[Date: $formatted] ";
}
}
if (!$desc) {
return "Description not available";
}
return $desc;
}
}
Loading