Initial Upload

This commit is contained in:
Matt Batchelder
2025-12-02 10:32:59 -05:00
commit 05ce0da296
2240 changed files with 467811 additions and 0 deletions

300
lib/Entity/Action.php Normal file
View File

@@ -0,0 +1,300 @@
<?php
/*
* Copyright (C) 2022 Xibo Signage Ltd
*
* Xibo - Digital Signage - http://www.xibo.org.uk
*
* This file is part of Xibo.
*
* Xibo is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* Xibo 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Xibo. If not, see <http://www.gnu.org/licenses/>.
*/
namespace Xibo\Entity;
use Carbon\Carbon;
use Xibo\Helper\DateFormatHelper;
use Xibo\Service\LogServiceInterface;
use Xibo\Storage\StorageServiceInterface;
use Xibo\Support\Exception\InvalidArgumentException;
/**
* Class Action
* @package Xibo\Entity
*
* @SWG\Definition()
*/
class Action implements \JsonSerializable
{
use EntityTrait;
/**
* @SWG\Property(description="The Action Id")
* @var int
*/
public $actionId;
/**
* @SWG\Property(description="The Owner Id")
* @var int
*/
public $ownerId;
/**
* @SWG\Property(description="The Action trigger type")
* @var string
*/
public $triggerType;
/**
* @SWG\Property(description="The Action trigger code")
* @var string
*/
public $triggerCode;
/**
* @SWG\Property(description="The Action type")
* @var string
*/
public $actionType;
/**
* @SWG\Property(description="The Action source (layout, region or widget)")
* @var string
*/
public $source;
/**
* @SWG\Property(description="The Action source Id (layoutId, regionId or widgetId)")
* @var int
*/
public $sourceId;
/**
* @SWG\Property(description="The Action target (region)")
* @var string
*/
public $target;
/**
* @SWG\Property(description="The Action target Id (regionId)")
* @var int
*/
public $targetId;
/**
* @SWG\Property(description="Widget ID that will be loaded as a result of navigate to Widget Action type")
* @var int
*/
public $widgetId;
/**
* @SWG\Property(description="Layout Code identifier")
* @var string
*/
public $layoutCode;
/**
* @SWG\Property(description="Layout Id associated with this Action")
* @var int
*/
public $layoutId;
/** @var \Xibo\Factory\PermissionFactory */
private $permissionFactory;
/**
* Entity constructor.
* @param StorageServiceInterface $store
* @param LogServiceInterface $log
*/
public function __construct($store, $log, $dispatcher)
{
$this->setCommonDependencies($store, $log, $dispatcher);
}
public function __clone()
{
$this->hash = null;
$this->actionId = null;
}
/**
* Get the Id
* @return int
*/
public function getId()
{
return $this->actionId;
}
/**
* Get the OwnerId
* @return int
*/
public function getOwnerId()
{
return $this->ownerId;
}
/**
* Sets the Owner
* @param int $ownerId
*/
public function setOwner($ownerId)
{
$this->ownerId = $ownerId;
}
/**
* @return string
*/
public function __toString()
{
return sprintf('ActionId %d, Trigger Type %s, Trigger Code %s, Action Type %s, Source %s, SourceId %s, Target %s, TargetId %d', $this->actionId, $this->triggerType, $this->triggerCode, $this->actionType, $this->source, $this->sourceId, $this->target, $this->targetId);
}
/**
* @throws InvalidArgumentException
*/
public function validate()
{
// on add we expect only layoutId, actionType, target and targetId
if ($this->layoutId == null) {
throw new InvalidArgumentException(__('No layoutId specified'), 'layoutId');
}
if (!in_array($this->actionType, ['next', 'previous', 'navLayout', 'navWidget'])) {
throw new InvalidArgumentException(__('Invalid action type'), 'actionType');
}
if (!in_array(strtolower($this->source), ['layout', 'region', 'widget'])) {
throw new InvalidArgumentException(__('Invalid source'), 'source');
}
if (!in_array(strtolower($this->target), ['region', 'screen'])) {
throw new InvalidArgumentException(__('Invalid target'), 'target');
}
if ($this->target == 'region' && $this->targetId == null) {
throw new InvalidArgumentException(__('Please select a Region'), 'targetId');
}
if ($this->triggerType === 'webhook' && $this->triggerCode === null) {
throw new InvalidArgumentException(__('Please provide trigger code'), 'triggerCode');
}
if ($this->triggerType === 'keyPress' && $this->triggerCode === null) {
throw new InvalidArgumentException(__('Please provide trigger key'), 'triggerKey');
}
if (!in_array($this->triggerType, ['touch', 'webhook', 'keyPress'])) {
throw new InvalidArgumentException(__('Invalid trigger type'), 'triggerType');
}
if ($this->actionType === 'navLayout' && $this->layoutCode == '') {
throw new InvalidArgumentException(__('Please enter Layout code'), 'layoutCode');
}
if ($this->actionType === 'navWidget' && $this->widgetId == null) {
throw new InvalidArgumentException(__('Please create a Widget to be loaded'), 'widgetId');
}
}
/**
* @param array $options
* @throws InvalidArgumentException
*/
public function save($options = [])
{
$options = array_merge([
'validate' => true,
'notifyLayout' => false
], $options);
$this->getLog()->debug('Saving ' . $this);
if ($options['validate']) {
$this->validate();
}
if ($this->actionId == null || $this->actionId == 0) {
$this->add();
$this->loaded = true;
} else {
$this->update();
}
if ($options['notifyLayout'] && $this->layoutId != null) {
$this->notifyLayout($this->layoutId);
}
}
public function add()
{
$this->actionId = $this->getStore()->insert('INSERT INTO `action` (ownerId, triggerType, triggerCode, actionType, source, sourceId, target, targetId, widgetId, layoutCode, layoutId) VALUES (:ownerId, :triggerType, :triggerCode, :actionType, :source, :sourceId, :target, :targetId, :widgetId, :layoutCode, :layoutId)', [
'ownerId' => $this->ownerId,
'triggerType' => $this->triggerType,
'triggerCode' => $this->triggerCode,
'actionType' => $this->actionType,
'source' => $this->source,
'sourceId' => $this->sourceId,
'target' => $this->target,
'targetId' => $this->targetId,
'widgetId' => $this->widgetId,
'layoutCode' => $this->layoutCode,
'layoutId' => $this->layoutId
]);
}
public function update()
{
$this->getStore()->update('UPDATE `action` SET ownerId = :ownerId, triggerType = :triggerType, triggerCode = :triggerCode, actionType = :actionType, source = :source, sourceId = :sourceId, target = :target, targetId = :targetId, widgetId = :widgetId, layoutCode = :layoutCode, layoutId = :layoutId WHERE actionId = :actionId', [
'ownerId' => $this->ownerId,
'triggerType' => $this->triggerType,
'triggerCode' => $this->triggerCode,
'actionType' => $this->actionType,
'source' => $this->source,
'sourceId' => $this->sourceId,
'target' => $this->target,
'targetId' => $this->targetId,
'actionId' => $this->actionId,
'widgetId' => $this->widgetId,
'layoutCode' => $this->layoutCode,
'layoutId' => $this->layoutId
]);
}
public function delete()
{
$this->getStore()->update('DELETE FROM `action` WHERE actionId = :actionId', ['actionId' => $this->actionId]);
}
/**
* Notify the Layout (set to building)
* @param $layoutId
*/
public function notifyLayout($layoutId)
{
$this->getLog()->debug(sprintf('Saving Interactive Action ID %d triggered layout ID %d build', $this->actionId, $layoutId));
$this->getStore()->update('
UPDATE `layout` SET `status` = 3, `modifiedDT` = :modifiedDt WHERE layoutId = :layoutId
', [
'layoutId' => $layoutId,
'modifiedDt' => Carbon::now()->format(DateFormatHelper::getSystemFormat())
]);
}
}