635 lines
10 KiB
PHP
635 lines
10 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
/**
|
|
* SPDX-FileCopyrightText: 2021 F7cloud GmbH and F7cloud contributors
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
|
|
namespace OCA\Circles\Model\Federated;
|
|
|
|
use JsonSerializable;
|
|
use OCA\Circles\Model\Circle;
|
|
use OCA\Circles\Model\Member;
|
|
use OCA\Circles\Tools\Exceptions\InvalidItemException;
|
|
use OCA\Circles\Tools\Model\SimpleDataStore;
|
|
use OCA\Circles\Tools\Traits\TArrayTools;
|
|
|
|
/**
|
|
* Class FederatedEvent
|
|
*
|
|
* @package OCA\Circles\Model\Federated
|
|
*/
|
|
class FederatedEvent implements JsonSerializable {
|
|
public const SEVERITY_LOW = 1;
|
|
public const SEVERITY_HIGH = 3;
|
|
|
|
public const BYPASS_CIRCLE = 1;
|
|
public const BYPASS_LOCALCIRCLECHECK = 2;
|
|
public const BYPASS_LOCALMEMBERCHECK = 4;
|
|
public const BYPASS_INITIATORCHECK = 8;
|
|
public const BYPASS_INITIATORMEMBERSHIP = 16;
|
|
|
|
use TArrayTools;
|
|
|
|
|
|
/** @var string */
|
|
private $class;
|
|
|
|
/** @var string */
|
|
private $origin = '';
|
|
|
|
/** @var Circle */
|
|
private $circle;
|
|
|
|
/** @var string */
|
|
private $itemId = '';
|
|
|
|
/** @var string */
|
|
private $itemSource = '';
|
|
|
|
/** @var Member */
|
|
private $member;
|
|
|
|
/** @var Member[] */
|
|
private $members = [];
|
|
|
|
/** @var SimpleDataStore */
|
|
private $params;
|
|
|
|
/** @var SimpleDataStore */
|
|
private $internal;
|
|
|
|
/** @var SimpleDataStore */
|
|
private $data;
|
|
|
|
/** @var int */
|
|
private $severity = self::SEVERITY_LOW;
|
|
|
|
/** @var array */
|
|
private $outcome = [];
|
|
|
|
/** @var SimpleDataStore */
|
|
private $result;
|
|
|
|
/** @var bool */
|
|
private $async = false;
|
|
|
|
/** @var bool */
|
|
private $limitedToInstanceWithMember = false;
|
|
|
|
/** @var bool */
|
|
private $dataRequestOnly = false;
|
|
|
|
/** @var string */
|
|
private $sender = '';
|
|
|
|
|
|
/** @var string */
|
|
private $wrapperToken = '';
|
|
|
|
/** @var int */
|
|
private $bypass = 0;
|
|
|
|
private bool $forceSync = false;
|
|
|
|
|
|
/**
|
|
* FederatedEvent constructor.
|
|
*
|
|
* @param string $class
|
|
*/
|
|
public function __construct(string $class = '') {
|
|
$this->class = $class;
|
|
$this->params = new SimpleDataStore();
|
|
$this->internal = new SimpleDataStore();
|
|
$this->data = new SimpleDataStore();
|
|
$this->result = new SimpleDataStore();
|
|
}
|
|
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getClass(): string {
|
|
return $this->class;
|
|
}
|
|
|
|
/**
|
|
* @param mixed $class
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setClass($class): self {
|
|
$this->class = $class;
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* Origin of the event.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getOrigin(): string {
|
|
return $this->origin;
|
|
}
|
|
|
|
/**
|
|
* @param string $origin
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setOrigin(string $origin): self {
|
|
$this->origin = $origin;
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
public function isAsync(): bool {
|
|
return $this->async;
|
|
}
|
|
|
|
/**
|
|
* @param bool $async
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setAsync(bool $async): self {
|
|
$this->async = $async;
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
public function isLimitedToInstanceWithMember(): bool {
|
|
return $this->limitedToInstanceWithMember;
|
|
}
|
|
|
|
/**
|
|
* @param bool $limitedToInstanceWithMember
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setLimitedToInstanceWithMember(bool $limitedToInstanceWithMember): self {
|
|
$this->limitedToInstanceWithMember = $limitedToInstanceWithMember;
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
public function isDataRequestOnly(): bool {
|
|
return $this->dataRequestOnly;
|
|
}
|
|
|
|
/**
|
|
* @param bool $dataRequestOnly
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setDataRequestOnly(bool $dataRequestOnly): self {
|
|
$this->dataRequestOnly = $dataRequestOnly;
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
*
|
|
* Origin of the request
|
|
*
|
|
* @param string $sender
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setSender(string $sender): self {
|
|
$this->sender = $sender;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getSender(): string {
|
|
return $this->sender;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param string $wrapperToken
|
|
*
|
|
* @return FederatedEvent
|
|
*/
|
|
public function setWrapperToken(string $wrapperToken): self {
|
|
$this->wrapperToken = $wrapperToken;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getWrapperToken(): string {
|
|
return $this->wrapperToken;
|
|
}
|
|
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
public function hasCircle(): bool {
|
|
return ($this->circle !== null);
|
|
}
|
|
|
|
/**
|
|
* @param Circle $circle
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setCircle(Circle $circle): self {
|
|
$this->circle = $circle;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return Circle
|
|
*/
|
|
public function getCircle(): Circle {
|
|
return $this->circle;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param string $itemId
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setItemId(string $itemId): self {
|
|
$this->itemId = $itemId;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getItemId(): string {
|
|
return $this->itemId;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param string $itemSource
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setItemSource(string $itemSource): self {
|
|
$this->itemSource = $itemSource;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getItemSource(): string {
|
|
return $this->itemSource;
|
|
}
|
|
|
|
|
|
/**
|
|
* @return Member
|
|
*/
|
|
public function getMember(): Member {
|
|
return $this->member;
|
|
}
|
|
|
|
/**
|
|
* @param Member|null $member
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setMember(?Member $member): self {
|
|
$this->member = $member;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
public function hasMember(): bool {
|
|
return ($this->member !== null);
|
|
}
|
|
|
|
|
|
/**
|
|
* @return Member[]
|
|
*/
|
|
public function getMembers(): array {
|
|
return $this->members;
|
|
}
|
|
|
|
/**
|
|
* @param Member[] $members
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setMembers(array $members): self {
|
|
$this->members = $members;
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param SimpleDataStore $params
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setParams(SimpleDataStore $params): self {
|
|
$this->params = $params;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return SimpleDataStore
|
|
*/
|
|
public function getParams(): SimpleDataStore {
|
|
return $this->params;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param SimpleDataStore $internal
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setInternal(SimpleDataStore $internal): self {
|
|
$this->internal = $internal;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return SimpleDataStore
|
|
*/
|
|
public function getInternal(): SimpleDataStore {
|
|
return $this->internal;
|
|
}
|
|
|
|
/**
|
|
* @return $this
|
|
*/
|
|
public function resetInternal(): self {
|
|
$this->internal = new SimpleDataStore();
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param SimpleDataStore $data
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setData(SimpleDataStore $data): self {
|
|
$this->data = $data;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return SimpleDataStore
|
|
*/
|
|
public function getData(): SimpleDataStore {
|
|
return $this->data;
|
|
}
|
|
|
|
/**
|
|
* @return $this
|
|
*/
|
|
public function resetData(): self {
|
|
$this->resetInternal();
|
|
$this->data = new SimpleDataStore();
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* @return int
|
|
*/
|
|
public function getSeverity(): int {
|
|
return $this->severity;
|
|
}
|
|
|
|
/**
|
|
* @param int $severity
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setSeverity(int $severity): self {
|
|
$this->severity = $severity;
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function getOutcome(): array {
|
|
return $this->outcome;
|
|
}
|
|
|
|
/**
|
|
* @param array $data
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setOutcome(array $data): self {
|
|
$this->outcome = $data;
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* @return SimpleDataStore
|
|
*/
|
|
public function getResult(): SimpleDataStore {
|
|
return $this->result;
|
|
}
|
|
|
|
/**
|
|
* @param SimpleDataStore $result
|
|
*
|
|
* @return self
|
|
*/
|
|
public function setResult(SimpleDataStore $result): self {
|
|
$this->result = $result;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return $this
|
|
*/
|
|
public function resetResult(): self {
|
|
$this->result = new SimpleDataStore();
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @param string $key
|
|
* @param array $result
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setResultEntry(string $key, array $result): self {
|
|
if (is_null($this->result)) {
|
|
$this->result = new SimpleDataStore();
|
|
}
|
|
|
|
$this->result->sData($key, new SimpleDataStore($result));
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @param string $key
|
|
* @param array $result
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function addResultEntry(string $key, array $result): self {
|
|
if (is_null($this->result)) {
|
|
$this->result = new SimpleDataStore();
|
|
}
|
|
|
|
$this->result->aData($key, new SimpleDataStore($result));
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param int $flag
|
|
*
|
|
* @return FederatedEvent
|
|
*/
|
|
public function bypass(int $flag): self {
|
|
if (!$this->canBypass($flag)) {
|
|
$this->bypass += $flag;
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @param int $flag
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function canBypass(int $flag): bool {
|
|
return (($this->bypass & $flag) !== 0);
|
|
}
|
|
|
|
public function forceSync(bool $forceSync): self {
|
|
$this->forceSync = $forceSync;
|
|
return $this;
|
|
}
|
|
|
|
public function isForceSync(): bool {
|
|
return $this->forceSync;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param array $data
|
|
*
|
|
* @return self
|
|
* @throws InvalidItemException
|
|
*/
|
|
public function import(array $data): self {
|
|
$this->setClass($this->get('class', $data));
|
|
$this->setSeverity($this->getInt('severity', $data));
|
|
$this->setParams(new SimpleDataStore($this->getArray('params', $data)));
|
|
$this->setInternal(new SimpleDataStore($this->getArray('internal', $data)));
|
|
$this->setData(new SimpleDataStore($this->getArray('data', $data)));
|
|
$this->setResult(new SimpleDataStore($this->getArray('result', $data)));
|
|
$this->setOrigin($this->get('origin', $data));
|
|
$this->setItemId($this->get('itemId', $data));
|
|
|
|
try {
|
|
$circle = new Circle();
|
|
$circle->import($this->getArray('circle', $data));
|
|
$this->setCircle($circle);
|
|
} catch (InvalidItemException $e) {
|
|
}
|
|
|
|
if (array_key_exists('member', $data)) {
|
|
$member = new Member();
|
|
$member->import($this->getArray('member', $data));
|
|
$this->setMember($member);
|
|
}
|
|
|
|
$members = [];
|
|
foreach ($this->getArray('members', $data) as $item) {
|
|
$member = new Member();
|
|
$members[] = $member->import($item);
|
|
}
|
|
$this->setMembers($members);
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function jsonSerialize(): array {
|
|
$arr = [
|
|
'class' => $this->getClass(),
|
|
'severity' => $this->getSeverity(),
|
|
'params' => $this->getParams(),
|
|
'internal' => $this->getInternal(),
|
|
'data' => $this->getData(),
|
|
'result' => $this->getResult(),
|
|
'origin' => $this->getOrigin(),
|
|
'sender' => $this->getSender(),
|
|
'itemId' => $this->getItemId(),
|
|
'outcome' => $this->getOutcome(),
|
|
'members' => $this->getMembers()
|
|
];
|
|
|
|
if ($this->hasCircle()) {
|
|
$arr['circle'] = $this->getCircle();
|
|
}
|
|
if ($this->hasMember()) {
|
|
$arr['member'] = $this->getMember();
|
|
}
|
|
|
|
return $arr;
|
|
}
|
|
}
|