. */ namespace Xibo\XTR; use Carbon\Carbon; use Exception; use Xibo\Entity\Display; use Xibo\Entity\Schedule; use Xibo\Factory\CampaignFactory; use Xibo\Factory\CommandFactory; use Xibo\Factory\DataSetColumnFactory; use Xibo\Factory\DataSetFactory; use Xibo\Factory\DisplayFactory; use Xibo\Factory\DisplayGroupFactory; use Xibo\Factory\FolderFactory; use Xibo\Factory\FontFactory; use Xibo\Factory\LayoutFactory; use Xibo\Factory\MediaFactory; use Xibo\Factory\ModuleFactory; use Xibo\Factory\ScheduleFactory; use Xibo\Factory\SyncGroupFactory; use Xibo\Factory\TaskFactory; use Xibo\Factory\UserFactory; use Xibo\Factory\UserGroupFactory; use Xibo\Factory\WidgetFactory; use Xibo\Helper\Random; use Xibo\Service\MediaServiceInterface; use Xibo\Support\Exception\DuplicateEntityException; use Xibo\Support\Exception\GeneralException; use Xibo\Support\Exception\InvalidArgumentException; use Xibo\Support\Exception\NotFoundException; /** * Class SeedDatabaseTask * Run only once, by default disabled * @package Xibo\XTR */ class SeedDatabaseTask implements TaskInterface { use TaskTrait; private ModuleFactory $moduleFactory; private WidgetFactory $widgetFactory; private LayoutFactory $layoutFactory; private CampaignFactory $campaignFactory; private TaskFactory $taskFactory; private DisplayFactory $displayFactory; private DataSetFactory $dataSetFactory; private DataSetColumnFactory $dataSetColumnFactory; private SyncGroupFactory $syncGroupFactory; private ScheduleFactory $scheduleFactory; private UserFactory $userFactory; private UserGroupFactory $userGroupFactory; private FontFactory $fontFactory; private MediaServiceInterface $mediaService; /** @var array The cache for layout */ private array $layoutCache = []; private FolderFactory $folderFactory; private CommandFactory $commandFactory; private DisplayGroupFactory $displayGroupFactory; private MediaFactory $mediaFactory; private array $displayGroups; private array $displays; private array $layouts; private array $parentCampaigns = []; private array $syncGroups; /** @inheritdoc */ public function setFactories($container) { $this->moduleFactory = $container->get('moduleFactory'); $this->widgetFactory = $container->get('widgetFactory'); $this->layoutFactory = $container->get('layoutFactory'); $this->campaignFactory = $container->get('campaignFactory'); $this->taskFactory = $container->get('taskFactory'); $this->displayFactory = $container->get('displayFactory'); $this->displayGroupFactory = $container->get('displayGroupFactory'); $this->mediaService = $container->get('mediaService'); $this->userFactory = $container->get('userFactory'); $this->userGroupFactory = $container->get('userGroupFactory'); $this->fontFactory = $container->get('fontFactory'); $this->dataSetFactory = $container->get('dataSetFactory'); $this->dataSetColumnFactory = $container->get('dataSetColumnFactory'); $this->syncGroupFactory = $container->get('syncGroupFactory'); $this->scheduleFactory = $container->get('scheduleFactory'); $this->folderFactory = $container->get('folderFactory'); $this->commandFactory = $container->get('commandFactory'); $this->mediaFactory = $container->get('mediaFactory'); return $this; } /** @inheritdoc * @throws Exception */ public function run() { // This task should only be run once $this->runMessage = '# ' . __('Seeding Database') . PHP_EOL . PHP_EOL; // Create display groups $this->createDisplayGroups(); // Create displays $this->createDisplays(); // Assign displays to display groups $this->assignDisplaysToDisplayGroups(); // Import layouts $this->importLayouts(); // Create campaign $this->createAdCampaigns(); $this->createListCampaigns(); // Create stats $this->createStats(); // Create Schedules $this->createSchedules(); // Create Sync Groups $this->createSyncGroups(); $this->createSynchronizedSchedules(); // Create User $this->createUsers(); // Create Folders $this->createFolders(); $this->createCommands(); // Create bandwidth data display 1 $this->createBandwidthReportData(); // Create disconnected display event for yesterday for 10 minutes for display 1 $this->createDisconnectedDisplayEvent(); $this->runMessage .= ' - ' . __('Done.') . PHP_EOL . PHP_EOL; $this->log->info('Task completed'); $this->appendRunMessage('Task completed'); } /** */ private function createDisplayGroups(): void { $displayGroups = [ 'POP Display Group', 'Display Group 1', 'Display Group 2', // Display groups for displaygroups.cy.js test 'disp5_dispgrp', ]; foreach ($displayGroups as $displayGroupName) { try { // Don't create if the display group exists $groups = $this->displayGroupFactory->query(null, ['displayGroup' => $displayGroupName]); if (count($groups) > 0) { foreach ($groups as $displayGroup) { $this->displayGroups[$displayGroup->displayGroup] = $displayGroup->getId(); } } else { $displayGroup = $this->displayGroupFactory->createEmpty(); $displayGroup->displayGroup = $displayGroupName; $displayGroup->userId = $this->userFactory->getSystemUser()->getId(); $displayGroup->save(); $this->store->commitIfNecessary(); // Cache $this->displayGroups[$displayGroup->displayGroup] = $displayGroup->getId(); } } catch (GeneralException $e) { $this->log->error('Error creating display group: '. $e->getMessage()); } } } /** * @throws Exception */ private function createDisplays(): void { // Create Displays $displays = [ 'POP Display 1' => ['license' => Random::generateString(12, 'seed'), 'licensed' => false, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'POP Display 2' => ['license' => Random::generateString(12, 'seed'), 'licensed' => false, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'List Campaign Display 1' => ['license' => Random::generateString(12, 'seed'), 'licensed' => true, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'List Campaign Display 2' => ['license' => Random::generateString(12, 'seed'), 'licensed' => true, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], // Displays for displays.cy.js test 'dis_disp1' => ['license' => 'dis_disp1', 'licensed' => true, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'dis_disp2' => ['license' => 'dis_disp2', 'licensed' => true, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'dis_disp3' => ['license' => 'dis_disp3', 'licensed' => false, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'dis_disp4' => ['license' => 'dis_disp4', 'licensed' => true, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'dis_disp5' => ['license' => 'dis_disp5', 'licensed' => true, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], // Displays for displaygroups.cy.js test 'dispgrp_disp1' => ['license' => 'dispgrp_disp1', 'licensed' => true, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'dispgrp_disp2' => ['license' => 'dispgrp_disp2', 'licensed' => true, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'dispgrp_disp_dynamic1' => ['license' => 'dispgrp_disp_dynamic1', 'licensed' => true, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'dispgrp_disp_dynamic2' => ['license' => 'dispgrp_disp_dynamic2', 'licensed' => true, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], // 6 displays for xmds 'phpunitv7' => ['license' => 'PHPUnit7', 'licensed' => true, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'phpunitwaiting' => ['license' => 'PHPUnitWaiting', 'licensed' => false, 'clientType' => 'android', 'clientCode' => 400, 'clientVersion' => 4], 'phpunitv6' => ['license' => 'PHPUnit6', 'licensed' => true, 'clientType' => 'windows', 'clientCode' => 304, 'clientVersion' => 3], 'phpunitv5' => ['license' => 'PHPUnit5', 'licensed' => true, 'clientType' => 'windows', 'clientCode' => 304, 'clientVersion' => 3], 'phpunitv4' => ['license' => 'PHPUnit4', 'licensed' => true, 'clientType' => 'android', 'clientCode' => 217, 'clientVersion' => 2], 'phpunitv3' => ['license' => 'PHPUnit3', 'licensed' => true, 'clientType' => 'android', 'clientCode' => 217, 'clientVersion' => 2], ]; foreach ($displays as $displayName => $displayData) { try { // Don't create if the display exists $disps = $this->displayFactory->query(null, ['display' => $displayName]); if (count($disps) > 0) { foreach ($disps as $display) { // Cache $this->displays[$display->display] = $display->displayId; } } else { $display = $this->displayFactory->createEmpty(); $display->display = $displayName; $display->auditingUntil = 0; $display->defaultLayoutId = $this->getConfig()->getSetting('DEFAULT_LAYOUT'); $display->license = $displayData['license']; $display->licensed = $displayData['licensed'] ? 1 : 0; // Authorised? $display->clientType = $displayData['clientType']; $display->clientCode = $displayData['clientCode']; $display->clientVersion = $displayData['clientVersion']; $display->incSchedule = 0; $display->clientAddress = ''; if (!$display->isDisplaySlotAvailable()) { $display->licensed = 0; } $display->lastAccessed = Carbon::now()->format('U'); $display->loggedIn = 1; $display->save(Display::$saveOptionsMinimum); $this->store->commitIfNecessary(); // Cache $this->displays[$display->display] = $display->displayId; } } catch (GeneralException $e) { $this->log->error('Error creating display: ' . $e->getMessage()); } } } /** * @throws NotFoundException */ private function assignDisplaysToDisplayGroups(): void { $displayGroup = $this->displayGroupFactory->getById($this->displayGroups['POP Display Group']); $displayGroup->load(); $display = $this->displayFactory->getById($this->displays['POP Display 1']); try { $displayGroup->assignDisplay($display); $displayGroup->save(); } catch (GeneralException $e) { $this->log->error('Error assign display to display group: '. $e->getMessage()); } $this->store->commitIfNecessary(); } /** * Import Layouts * @throws GeneralException */ private function importLayouts(): void { $this->runMessage .= '## ' . __('Import Layout To Seed Database') . PHP_EOL; // Make sure the library exists $this->mediaService->initLibrary(); // all layouts name and file name $layoutNames = [ 'dataset test ' => 'export-dataset-test.zip', 'layout_with_8_items_dataset' => 'export-layout-with-8-items-dataset.zip', 'Image test' => 'export-image-test.zip', 'Layout for Schedule 1' => 'export-layout-for-schedule-1.zip', 'List Campaign Layout 1' => 'export-list-campaign-layout-1.zip', 'List Campaign Layout 2' => 'export-list-campaign-layout-2.zip', 'POP Layout 1' => 'export-pop-layout-1.zip', // Layout for displaygroups.cy.js test 'disp4_default_layout' => 'export-disp4-default-layout.zip', // Layout editor tests 'Audio-Video-PDF' => 'export-audio-video-pdf.zip' ]; // Get all layouts $importedLayouts = []; foreach ($this->layoutFactory->query() as $layout) { // cache if (array_key_exists($layout->layout, $layoutNames)) { $importedLayouts[] = $layoutNames[$layout->layout]; } // Cache $this->layouts[trim($layout->layout)] = $layout->layoutId; } // Import a layout $folder = PROJECT_ROOT . '/tests/resources/seeds/layouts/'; foreach (array_diff(scandir($folder), array('..', '.')) as $file) { // Check if the layout file has already been imported if (!in_array($file, $importedLayouts)) { if (stripos($file, '.zip')) { try { $layout = $this->layoutFactory->createFromZip( $folder . '/' . $file, null, $this->userFactory->getSystemUser()->getId(), false, false, true, false, true, $this->dataSetFactory, null, $this->mediaService, 1 ); $layout->save([ 'audit' => false, 'import' => true ]); if (!empty($layout->getUnmatchedProperty('thumbnail'))) { rename($layout->getUnmatchedProperty('thumbnail'), $layout->getThumbnailUri()); } $this->store->commitIfNecessary(); // Update Cache $this->layouts[trim($layout->layout)] = $layout->layoutId; } catch (Exception $exception) { $this->log->error('Seed Database: Unable to import layout: ' . $file . '. E = ' . $exception->getMessage()); $this->log->debug($exception->getTraceAsString()); } } } } } /** * @throws InvalidArgumentException * @throws NotFoundException * @throws DuplicateEntityException */ private function createAdCampaigns(): void { $layoutId = $this->layouts['POP Layout 1']; // Get All Ad Campaigns $campaigns = $this->campaignFactory->query(null, ['type' => 'ad']); foreach ($campaigns as $campaign) { $this->parentCampaigns[$campaign->campaign] = $campaign->getId(); } if (!array_key_exists('POP Ad Campaign 1', $this->parentCampaigns)) { $campaign = $this->campaignFactory->create( 'ad', 'POP Ad Campaign 1', $this->userFactory->getSystemUser()->getId(), 1 ); $campaign->targetType = 'plays'; $campaign->target = 100; $campaign->listPlayOrder = 'round'; try { // Assign the layout $campaign->assignLayout($layoutId); $campaign->save(['validate' => false, 'saveTags' => false]); $this->store->commitIfNecessary(); // Cache $this->parentCampaigns[$campaign->campaign] = $campaign->getId(); } catch (GeneralException $e) { $this->getLogger()->error('Save: ' . $e->getMessage()); } } } /** * @throws InvalidArgumentException * @throws NotFoundException * @throws DuplicateEntityException */ private function createListCampaigns(): void { $campaignName = 'Campaign for Schedule 1'; // Get All List Campaigns $campaigns = $this->campaignFactory->query(null, ['type' => 'list']); foreach ($campaigns as $campaign) { $this->parentCampaigns[$campaign->campaign] = $campaign->getId(); } if (!array_key_exists($campaignName, $this->parentCampaigns)) { $campaign = $this->campaignFactory->create( 'list', $campaignName, $this->userFactory->getSystemUser()->getId(), 1 ); $campaign->listPlayOrder = 'round'; try { // Assign the layout $campaign->save(['validate' => false, 'saveTags' => false]); $this->store->commitIfNecessary(); // Cache $this->parentCampaigns[$campaign->campaign] = $campaign->getId(); } catch (GeneralException $e) { $this->getLogger()->error('Save: ' . $e->getMessage()); } } } /** * @throws NotFoundException */ private function createStats(): void { // Delete Stats $this->store->update('DELETE FROM stat WHERE displayId = :displayId', [ 'displayId' => $this->displays['POP Display 1'] ]); // Get layout campaign Id $campaignId = $this->layoutFactory->getById($this->layouts['POP Layout 1'])->campaignId; $columns = 'type, statDate, scheduleId, displayId, campaignId, parentCampaignId, layoutId, mediaId, widgetId, `start`, `end`, tag, duration, `count`'; $values = ':type, :statDate, :scheduleId, :displayId, :campaignId, :parentCampaignId, :layoutId, :mediaId, :widgetId, :start, :end, :tag, :duration, :count'; // a layout stat for today try { $params = [ 'type' => 'layout', 'statDate' => Carbon::now()->hour(12)->format('U'), 'scheduleId' => 0, 'displayId' => $this->displays['POP Display 1'], 'campaignId' => $campaignId, 'parentCampaignId' => $this->parentCampaigns['POP Ad Campaign 1'], 'layoutId' => $this->layouts['POP Layout 1'], 'mediaId' => null, 'widgetId' => 0, 'start' => Carbon::now()->hour(12)->format('U'), 'end' => Carbon::now()->hour(12)->addSeconds(60)->format('U'), 'tag' => null, 'duration' => 60, 'count' => 1, ]; $this->store->insert('INSERT INTO `stat` (' . $columns . ') VALUES (' . $values . ')', $params); // a layout stat for lastweek $params = [ 'type' => 'layout', 'statDate' => Carbon::now()->subWeek()->hour(12)->format('U'), 'scheduleId' => 0, 'displayId' => $this->displays['POP Display 1'], 'campaignId' => $campaignId, 'parentCampaignId' => $this->parentCampaigns['POP Ad Campaign 1'], 'layoutId' => $this->layouts['POP Layout 1'], 'mediaId' => null, 'widgetId' => 0, 'start' => Carbon::now()->subWeek()->hour(12)->format('U'), 'end' => Carbon::now()->subWeek()->hour(12)->addSeconds(60)->format('U'), 'tag' => null, 'duration' => 60, 'count' => 1, ]; $this->store->insert('INSERT INTO `stat` (' . $columns . ') VALUES (' . $values . ')', $params); // Media stats $columns = 'type, statDate, scheduleId, displayId, campaignId, layoutId, mediaId, widgetId, `start`, `end`, tag, duration, `count`'; $values = ':type, :statDate, :scheduleId, :displayId, :campaignId, :layoutId, :mediaId, :widgetId, :start, :end, :tag, :duration, :count'; // Get Layout $layout = $this->layoutFactory->getById($this->layouts['POP Layout 1']); $layout->load(); // Take a mediaId and widgetId of the layout foreach ($layout->getAllWidgets() as $widget) { $widgetId = $widget->widgetId; $mediaId = $widget->mediaIds[0]; break; } // Get Media $media = $this->mediaFactory->getById($mediaId); // a media stat for today $params = [ 'type' => 'media', 'statDate' => Carbon::now()->hour(12)->format('U'), 'scheduleId' => 0, 'displayId' => $this->displays['POP Display 1'], 'campaignId' => $campaignId, 'layoutId' => $this->layouts['POP Layout 1'], 'mediaId' => $media->mediaId, 'widgetId' => $widgetId, 'start' => Carbon::now()->hour(12)->format('U'), 'end' => Carbon::now()->hour(12)->addSeconds(60)->format('U'), 'tag' => null, 'duration' => 60, 'count' => 1, ]; $this->store->insert('INSERT INTO `stat` (' . $columns . ') VALUES (' . $values . ')', $params); // another media stat for today $params = [ 'type' => 'media', 'statDate' => Carbon::now()->hour(12)->addSeconds(60)->format('U'), 'scheduleId' => 0, 'displayId' => $this->displays['POP Display 1'], 'campaignId' => $campaignId, 'layoutId' => $this->layouts['POP Layout 1'], 'mediaId' => $media->mediaId, 'widgetId' => $widgetId, 'start' => Carbon::now()->hour(12)->addSeconds(60)->format('U'), 'end' => Carbon::now()->hour(12)->addSeconds(120)->format('U'), 'tag' => null, 'duration' => 60, 'count' => 1, ]; $this->store->insert('INSERT INTO `stat` (' . $columns . ') VALUES (' . $values . ')', $params); // a media stat for lastweek // Last week stats - $params = [ 'type' => 'media', 'statDate' => Carbon::now()->subWeek()->addDays(2)->hour(12)->format('U'), 'scheduleId' => 0, 'displayId' => $this->displays['POP Display 1'], 'campaignId' => $campaignId, 'layoutId' => $this->layouts['POP Layout 1'], 'mediaId' => $media->mediaId, 'widgetId' => $widgetId, 'start' => Carbon::now()->subWeek()->hour(12)->format('U'), 'end' => Carbon::now()->subWeek()->hour(12)->addSeconds(60)->format('U'), 'tag' => null, 'duration' => 60, 'count' => 1, ]; $this->store->insert('INSERT INTO `stat` (' . $columns . ') VALUES (' . $values . ')', $params); // another media stat for lastweek $params = [ 'type' => 'media', 'statDate' => Carbon::now()->subWeek()->addDays(2)->hour(12)->addSeconds(60)->format('U'), 'scheduleId' => 0, 'displayId' => $this->displays['POP Display 1'], 'campaignId' => $campaignId, 'layoutId' => $this->layouts['POP Layout 1'], 'mediaId' => $media->mediaId, 'widgetId' => $widgetId, 'start' => Carbon::now()->subWeek()->hour(12)->addSeconds(60)->format('U'), 'end' => Carbon::now()->subWeek()->hour(12)->addSeconds(120)->format('U'), 'tag' => null, 'duration' => 60, 'count' => 1, ]; $this->store->insert('INSERT INTO `stat` (' . $columns . ') VALUES (' . $values . ')', $params); // an widget stat for today $params = [ 'type' => 'widget', 'statDate' => Carbon::now()->hour(12)->format('U'), 'scheduleId' => 0, 'displayId' => $this->displays['POP Display 1'], 'campaignId' => $campaignId, 'layoutId' => $this->layouts['POP Layout 1'], 'mediaId' => $media->mediaId, 'widgetId' => $widgetId, 'start' => Carbon::now()->hour(12)->format('U'), 'end' => Carbon::now()->hour(12)->addSeconds(60)->format('U'), 'tag' => null, 'duration' => 60, 'count' => 1, ]; $this->store->insert('INSERT INTO `stat` (' . $columns . ') VALUES (' . $values . ')', $params); // a event stat for today $params = [ 'type' => 'event', 'statDate' => Carbon::now()->hour(12)->format('U'), 'scheduleId' => 0, 'displayId' => $this->displays['POP Display 1'], 'campaignId' => 0, 'layoutId' => 0, 'mediaId' => null, 'widgetId' => 0, 'start' => Carbon::now()->hour(12)->format('U'), 'end' => Carbon::now()->hour(12)->addSeconds(60)->format('U'), 'tag' => 'Event123', 'duration' => 60, 'count' => 1, ]; $this->store->insert('INSERT INTO `stat` (' . $columns . ') VALUES (' . $values . ')', $params); } catch (GeneralException $e) { $this->getLogger()->error('Error inserting stats: '. $e->getMessage()); } $this->store->commitIfNecessary(); } private function createSchedules(): void { // Don't create if the schedule exists $schedules = $this->scheduleFactory->query(null, [ 'eventTypeId' => Schedule::$LAYOUT_EVENT, 'campaignId' => $this->layouts['dataset test'] ]); if (count($schedules) <= 0) { try { $schedule = $this->scheduleFactory->createEmpty(); $schedule->userId = $this->userFactory->getSystemUser()->getId(); $schedule->eventTypeId = Schedule::$LAYOUT_EVENT; $schedule->dayPartId = 2; $schedule->displayOrder = 0; $schedule->isPriority = 0; // Campaign Id $schedule->campaignId = $this->layouts['dataset test']; $schedule->syncTimezone = 0; $schedule->syncEvent = 0; $schedule->isGeoAware = 0; $schedule->maxPlaysPerHour = 0; $displays = $this->displayFactory->query(null, ['display' => 'phpunitv']); foreach ($displays as $display) { $displayGroupId = $display->displayGroupId; $schedule->assignDisplayGroup($this->displayGroupFactory->getById($displayGroupId)); } $schedule->save(['notify' => false]); $this->store->commitIfNecessary(); } catch (GeneralException $e) { $this->log->error('Error creating schedule : '. $e->getMessage()); } } } private function createSyncGroups(): void { // Don't create if the sync group exists $syncGroups = $this->syncGroupFactory->query(null, [ 'eventTypeId' => Schedule::$LAYOUT_EVENT, 'campaignId' => $this->layouts['dataset test'] ]); if (count($syncGroups) > 0) { foreach ($syncGroups as $syncGroup) { // Cache $this->syncGroups[$syncGroup->name] = $syncGroup->getId(); } } else { // Create a SyncGroup - SyncGroup name `Simple Sync Group` try { $syncGroup = $this->syncGroupFactory->createEmpty(); $syncGroup->name = 'Simple Sync Group'; $syncGroup->ownerId = $this->userFactory->getSystemUser()->getId(); $syncGroup->syncPublisherPort = 9590; $syncGroup->folderId = 1; $syncGroup->permissionsFolderId = 1; $syncGroup->save(); $this->store->update('UPDATE `display` SET `display`.syncGroupId = :syncGroupId WHERE `display`.displayId = :displayId', [ 'syncGroupId' => $syncGroup->syncGroupId, 'displayId' => $this->displays['phpunitv6'] ]); $this->store->update('UPDATE `display` SET `display`.syncGroupId = :syncGroupId WHERE `display`.displayId = :displayId', [ 'syncGroupId' => $syncGroup->syncGroupId, 'displayId' => $this->displays['phpunitv7'] ]); $syncGroup->leadDisplayId = $this->displays['phpunitv7']; $syncGroup->save(); $this->store->commitIfNecessary(); // Cache $this->syncGroups[$syncGroup->name] = $syncGroup->getId(); } catch (GeneralException $e) { $this->log->error('Error creating sync group: '. $e->getMessage()); } } } private function createSynchronizedSchedules(): void { // Don't create if the schedule exists $schedules = $this->scheduleFactory->query(null, [ 'eventTypeId' => Schedule::$SYNC_EVENT, 'syncGroupId' => $this->syncGroups['Simple Sync Group'] ]); if (count($schedules) <= 0) { try { $schedule = $this->scheduleFactory->createEmpty(); $schedule->userId = $this->userFactory->getSystemUser()->getId(); $schedule->eventTypeId = Schedule::$SYNC_EVENT; $schedule->dayPartId = 2; $schedule->displayOrder = 0; $schedule->isPriority = 0; // Campaign Id $schedule->campaignId = null; $schedule->syncTimezone = 0; $schedule->syncEvent = 1; $schedule->isGeoAware = 0; $schedule->maxPlaysPerHour = 0; $schedule->syncGroupId = $this->syncGroups['Simple Sync Group']; $displayV7 = $this->displayFactory->getById($this->displays['phpunitv7']); $schedule->assignDisplayGroup($this->displayGroupFactory->getById($displayV7->displayGroupId)); $displayV6 = $this->displayFactory->getById($this->displays['phpunitv6']); $schedule->assignDisplayGroup($this->displayGroupFactory->getById($displayV6->displayGroupId)); $schedule->save(['notify' => false]); $this->store->commitIfNecessary(); // Update Sync Links $this->store->insert('INSERT INTO `schedule_sync` (`eventId`, `displayId`, `layoutId`) VALUES(:eventId, :displayId, :layoutId) ON DUPLICATE KEY UPDATE layoutId = :layoutId', [ 'eventId' => $schedule->eventId, 'displayId' => $this->displays['phpunitv7'], 'layoutId' => $this->layouts['Image test'] ]); $this->store->insert('INSERT INTO `schedule_sync` (`eventId`, `displayId`, `layoutId`) VALUES(:eventId, :displayId, :layoutId) ON DUPLICATE KEY UPDATE layoutId = :layoutId', [ 'eventId' => $schedule->eventId, 'displayId' => $this->displays['phpunitv6'], 'layoutId' => $this->layouts['Image test'] ]); $this->store->commitIfNecessary(); } catch (GeneralException $e) { $this->log->error('Error creating sync schedule: '. $e->getMessage()); } } } private function createUsers(): void { // Don't create if exists $users = $this->userFactory->query(null, [ 'exactUserName' => 'folder_user' ]); if (count($users) <= 0) { // Create a user - user name `Simple User` try { $user = $this->userFactory->create(); $user->setChildAclDependencies($this->userGroupFactory); $user->userName = 'folder_user'; $user->email = ''; $user->homePageId = 'icondashboard.view'; $user->libraryQuota = 20; $user->setNewPassword('password'); $user->homeFolderId = 1; $user->userTypeId = 3; $user->isSystemNotification = 0; $user->isDisplayNotification = 0; $user->isPasswordChangeRequired = 0; $user->firstName = 'test'; $user->lastName = 'user'; $user->save(); $this->store->commitIfNecessary(); } catch (GeneralException $e) { $this->log->error('Error creating user: '. $e->getMessage()); } } } private function createFolders(): void { $folders = [ 'ChildFolder', 'FolderHome', 'EmptyFolder', 'ShareFolder', 'FolderWithContent', 'FolderWithImage', 'MoveToFolder', 'MoveFromFolder' ]; foreach ($folders as $folderName) { try { // Don't create if the folder exists $folds = $this->folderFactory->query(null, ['folderName' => $folderName]); if (count($folds) <= 0) { $folder = $this->folderFactory->createEmpty(); $folder->text = $folderName; $folder->parentId = 1; $folder->children = ''; $folder->save(); $this->store->commitIfNecessary(); } } catch (GeneralException $e) { $this->log->error('Error creating folder: '. $e->getMessage()); } } // Place the media in folders $folderWithImages = [ 'MoveToFolder' => 'test12', 'MoveFromFolder' => 'test34', 'FolderWithContent' => 'media_for_not_empty_folder', 'FolderWithImage' => 'media_for_search_in_folder' ]; foreach ($folderWithImages as $folderName => $mediaName) { try { $folders = $this->folderFactory->query(null, ['folderName' => $folderName]); if (count($folders) == 1) { $test12 = $this->mediaFactory->getByName($mediaName); $test12->folderId = $folders[0]->getId(); // Get the folder id of FolderHome $test12->save(); $this->store->commitIfNecessary(); } } catch (GeneralException $e) { $this->log->error('Error moving media ' . $mediaName . ' to the folder: ' . $folderName . ' ' . $e->getMessage()); } } } private function createBandwidthReportData(): void { // Check if the record exists $monthU = Carbon::now()->startOfDay()->hour(12)->format('U'); $record = $this->store->select('SELECT * FROM bandwidth WHERE type = 8 AND displayId = :displayId AND month = :month', [ 'displayId' => $this->displays['POP Display 1'], 'month' => $monthU ]); if (count($record) <= 0) { $this->store->insert('INSERT INTO `bandwidth` (Month, Type, DisplayID, Size) VALUES (:month, :type, :displayId, :size)', [ 'month' => $monthU, 'type' => 8, 'displayId' => $this->displays['POP Display 1'], 'size' => 200 ]); $this->store->commitIfNecessary(); } } private function createDisconnectedDisplayEvent(): void { // Delete if the record exists $date = Carbon::now()->subDay()->format('U'); $this->store->update('DELETE FROM displayevent WHERE displayId = :displayId', [ 'displayId' => $this->displays['POP Display 1'] ]); $this->store->insert('INSERT INTO `displayevent` (eventDate, start, end, displayID) VALUES (:eventDate, :start, :end, :displayId)', [ 'eventDate' => $date, 'start' => $date, 'end' => Carbon::now()->subDay()->addSeconds(600)->format('U'), 'displayId' => $this->displays['POP Display 1'] ]); $this->store->commitIfNecessary(); } private function createCommands() { $commandName = 'Set Timezone'; // Don't create if exists $commands = $this->commandFactory->query(null, [ 'command' => $commandName ]); if (count($commands) <= 0) { // Create a user - user name `Simple User` try { $command = $this->commandFactory->create(); $command->command = $commandName; $command->description = 'a command to test schedule'; $command->code = 'TIMEZONE'; $command->userId = $this->userFactory->getSystemUser()->getId(); $command->createAlertOn = 'never'; $command->save(); $this->store->commitIfNecessary(); } catch (GeneralException $e) { $this->log->error('Error creating command: '. $e->getMessage()); } } } }