%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps/circles/lib/Model/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps/circles/lib/Model/FederatedUser.php |
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Circles\Model;
use JsonSerializable;
use OCA\Circles\Exceptions\FederatedUserNotFoundException;
use OCA\Circles\Exceptions\MembershipNotFoundException;
use OCA\Circles\Exceptions\OwnerNotFoundException;
use OCA\Circles\Exceptions\RequestBuilderException;
use OCA\Circles\Exceptions\UnknownInterfaceException;
use OCA\Circles\IEntity;
use OCA\Circles\IFederatedUser;
use OCA\Circles\Tools\Db\IQueryRow;
use OCA\Circles\Tools\Exceptions\InvalidItemException;
use OCA\Circles\Tools\IDeserializable;
use OCA\Circles\Tools\Traits\TArrayTools;
use OCA\Circles\Tools\Traits\TDeserialize;
/**
* Class FederatedUser
*
* @package OCA\Circles\Model
*/
class FederatedUser extends ManagedModel implements
IFederatedUser,
IEntity,
IDeserializable,
IQueryRow,
JsonSerializable {
use TArrayTools;
use TDeserialize;
/** @var string */
private $singleId = '';
/** @var string */
private $userId;
/** @var int */
private $userType;
/** @var string */
private $displayName = '';
/** @var Circle */
private $basedOn;
/** @var int */
private $config = 0;
/** @var string */
private $instance;
/** @var Membership */
private $inheritance;
/** @var Membership[] */
private $memberships = null;
/**
* FederatedUser constructor.
*/
public function __construct() {
}
/**
* @param string $userId
* @param string $instance
* @param int $type
* @param string $displayName
* @param Circle|null $basedOn
*
* @return $this
*/
public function set(
string $userId,
string $instance = '',
int $type = Member::TYPE_USER,
string $displayName = '',
?Circle $basedOn = null
): self {
$this->userId = $userId;
$this->setInstance($instance);
$this->userType = $type;
$this->displayName = ($displayName === '') ? $userId : $displayName;
$this->basedOn = $basedOn;
return $this;
}
/**
* @param string $singleId
*
* @return self
*/
public function setSingleId(string $singleId): self {
$this->singleId = $singleId;
return $this;
}
/**
* @return string
*/
public function getSingleId(): string {
return $this->singleId;
}
/**
* @param string $userId
*
* @return self
*/
public function setUserId(string $userId): self {
$this->userId = $userId;
return $this;
}
/**
* @return string
*/
public function getUserId(): string {
return $this->userId;
}
/**
* @param int $userType
*
* @return self
*/
public function setUserType(int $userType): self {
$this->userType = $userType;
return $this;
}
/**
* @return int
*/
public function getUserType(): int {
return $this->userType;
}
/**
* @param string $displayName
*
* @return FederatedUser
*/
public function setDisplayName(string $displayName): self {
$this->displayName = $displayName;
return $this;
}
/**
* @return string
*/
public function getDisplayName(): string {
return $this->displayName;
}
/**
* @return bool
*/
public function hasBasedOn(): bool {
return !is_null($this->basedOn);
}
/**
* @param Circle|null $basedOn
*
* @return $this
*/
public function setBasedOn(Circle $basedOn): self {
$this->basedOn = $basedOn;
return $this;
}
/**
* @return Circle
*/
public function getBasedOn(): Circle {
return $this->basedOn;
}
/**
* @param int $config
*
* @return self
*/
public function setConfig(int $config): self {
$this->config = $config;
return $this;
}
/**
* @return int
*/
public function getConfig(): int {
return $this->config;
}
/**
* @param string $instance
*
* @return self
*/
public function setInstance(string $instance): self {
if ($instance === '') {
// TODO: is it needed ?
$instance = $this->getManager()->getLocalInstance();
}
$this->instance = $instance;
return $this;
}
/**
* @return string
*/
public function getInstance(): string {
return $this->instance;
}
/**
* @return bool
*/
public function isLocal(): bool {
return $this->getManager()->isLocalInstance($this->getInstance());
}
/**
* @return bool
*/
public function hasInheritance(): bool {
return !is_null($this->inheritance);
}
/**
* @param Membership $inheritance
*
* @return $this
*/
public function setInheritance(Membership $inheritance): self {
$this->inheritance = $inheritance;
return $this;
}
/**
* @return Membership
*/
public function getInheritance(): Membership {
return $this->inheritance;
}
/**
* @return bool
*/
public function hasMemberships(): bool {
return !is_null($this->memberships);
}
/**
* @param array $memberships
*
* @return self
*/
public function setMemberships(array $memberships): IEntity {
$this->memberships = $memberships;
return $this;
}
/**
* @return Membership[]
*/
public function getMemberships(): array {
if (!$this->hasMemberships()) {
$this->getManager()->getMemberships($this);
}
return $this->memberships;
}
/**
* @param string $singleId
* @param bool $detailed
*
* @return Membership
* @throws MembershipNotFoundException
* @throws RequestBuilderException
*/
public function getLink(string $singleId, bool $detailed = false): Membership {
return $this->getManager()->getLink($this, $singleId, $detailed);
}
/**
* @param array $data
*
* @return $this
* @throws InvalidItemException
*/
public function import(array $data): IDeserializable {
if ($this->get('userId', $data) === '') {
throw new InvalidItemException();
}
$this->setSingleId($this->get('id', $data));
$this->setUserId($this->get('userId', $data));
$this->setUserType($this->getInt('userType', $data));
$this->setDisplayName($this->get('displayName', $data));
$this->setInstance($this->get('instance', $data));
//$this->setMemberships($this->getArray('memberships'));
try {
/** @var Circle $circle */
$circle = $this->deserialize($this->getArray('basedOn', $data), Circle::class);
$this->setBasedOn($circle);
} catch (InvalidItemException $e) {
}
try {
/** @var Membership $membership */
$membership = $this->deserialize($this->getArray('membership', $data), Membership::class);
$this->setInheritance($membership);
} catch (InvalidItemException $e) {
}
return $this;
}
/**
* @param Circle $circle
*
* @return FederatedUser
* @throws OwnerNotFoundException
*/
public function importFromCircle(Circle $circle): self {
if (!$circle->hasOwner()) {
throw new OwnerNotFoundException();
}
$this->setSingleId($circle->getSingleId());
if ($circle->isConfig(Circle::CFG_SINGLE)) {
$owner = $circle->getOwner();
$this->set(
$owner->getUserId(),
$owner->getInstance(),
$owner->getUserType(),
$owner->getDisplayName(),
$circle
);
} else {
$this->set(
$circle->getDisplayName(),
$circle->getInstance(),
Member::TYPE_CIRCLE,
$circle->getDisplayName(),
$circle
);
}
return $this;
}
/**
* @param array $data
* @param string $prefix
*
* @return IQueryRow
* @throws FederatedUserNotFoundException
*/
public function importFromDatabase(array $data, string $prefix = ''): IQueryRow {
if ($this->get($prefix . 'single_id', $data) === '') {
throw new FederatedUserNotFoundException();
}
$this->setSingleId($this->get($prefix . 'single_id', $data));
$this->setUserId($this->get($prefix . 'user_id', $data));
$this->setUserType($this->getInt($prefix . 'user_type', $data));
$this->setDisplayName($this->get($prefix . 'cached_name', $data));
$this->setInstance($this->get($prefix . 'instance', $data));
$this->getManager()->manageImportFromDatabase($this, $data, $prefix);
return $this;
}
/**
* @return string[]
* @throws UnknownInterfaceException
*/
public function jsonSerialize(): array {
$arr = [
'id' => $this->getSingleId(),
'userId' => $this->getUserId(),
'userType' => $this->getUserType(),
'displayName' => $this->getDisplayName(),
'instance' => $this->getManager()->fixInstance($this->getInstance())
];
if ($this->hasBasedOn()) {
$arr['basedOn'] = $this->getBasedOn();
}
if ($this->hasInheritance()) {
$arr['inheritance'] = $this->getInheritance();
}
if (!is_null($this->memberships)) {
$arr['memberships'] = $this->getMemberships();
}
return $arr;
}
/**
* @param IFederatedUser $member
*
* @return bool
*/
public function compareWith(IFederatedUser $member): bool {
$local = ($this->getManager()->isLocalInstance($this->getInstance())
&& $this->getManager()->isLocalInstance($member->getInstance()));
return !($this->getSingleId() !== $member->getSingleId()
|| $this->getUserId() !== $member->getUserId()
|| $this->getUserType() <> $member->getUserType()
|| (!$local && $this->getInstance() !== $member->getInstance()));
}
}