%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Db/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Db/RemoteRequest.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\Db;
use OCA\Circles\Exceptions\RemoteNotFoundException;
use OCA\Circles\Exceptions\RemoteUidException;
use OCA\Circles\Exceptions\RequestBuilderException;
use OCA\Circles\Model\Circle;
use OCA\Circles\Model\Federated\RemoteInstance;
use OCA\Circles\Model\Member;
use OCP\DB\QueryBuilder\IQueryBuilder;
/**
* Class RemoteRequest
*
* @package OCA\Circles\Db
*/
class RemoteRequest extends RemoteRequestBuilder {
/**
* @param RemoteInstance $remote
*
* @throws RemoteUidException
*/
public function save(RemoteInstance $remote): void {
$remote->mustBeIdentityAuthed();
$qb = $this->getRemoteInsertSql();
$qb->setValue('uid', $qb->createNamedParameter($remote->getUid(true)))
->setValue('instance', $qb->createNamedParameter($remote->getInstance()))
->setValue('href', $qb->createNamedParameter($remote->getId()))
->setValue('type', $qb->createNamedParameter($remote->getType()))
->setValue('interface', $qb->createNamedParameter($remote->getInterface()))
->setValue('item', $qb->createNamedParameter(json_encode($remote->getOrigData())));
$qb->execute();
}
/**
* @param RemoteInstance $remote
*
* @throws RemoteUidException
*/
public function update(RemoteInstance $remote) {
$remote->mustBeIdentityAuthed();
$qb = $this->getRemoteUpdateSql();
$qb->set('uid', $qb->createNamedParameter($remote->getUid(true)))
->set('href', $qb->createNamedParameter($remote->getId()))
->set('type', $qb->createNamedParameter($remote->getType()))
->set('item', $qb->createNamedParameter(json_encode($remote->getOrigData())));
$qb->limitToInstance($remote->getInstance());
$qb->execute();
}
/**
* @param RemoteInstance $remote
*
* @throws RemoteUidException
*/
public function updateItem(RemoteInstance $remote) {
$remote->mustBeIdentityAuthed();
$qb = $this->getRemoteUpdateSql();
$qb->set('item', $qb->createNamedParameter(json_encode($remote->getOrigData())));
$qb->limit('uid', $remote->getUid(true), '', false);
$qb->execute();
}
/**
* @param RemoteInstance $remote
*
* @throws RemoteUidException
*/
public function updateInstance(RemoteInstance $remote) {
$remote->mustBeIdentityAuthed();
$qb = $this->getRemoteUpdateSql();
$qb->set('instance', $qb->createNamedParameter($remote->getInstance()));
$qb->limit('uid', $remote->getUid(true), '', false);
$qb->execute();
}
/**
* @param RemoteInstance $remote
*
* @throws RemoteUidException
*/
public function updateType(RemoteInstance $remote) {
$remote->mustBeIdentityAuthed();
$qb = $this->getRemoteUpdateSql();
$qb->set('type', $qb->createNamedParameter($remote->getType()));
$qb->limit('uid', $remote->getUid(true), '', false);
$qb->execute();
}
/**
* @param RemoteInstance $remote
*
* @throws RemoteUidException
*/
public function updateHref(RemoteInstance $remote) {
$remote->mustBeIdentityAuthed();
$qb = $this->getRemoteUpdateSql();
$qb->set('href', $qb->createNamedParameter($remote->getId()));
$qb->limit('uid', $remote->getUid(true), '', false);
$qb->execute();
}
/**
* @return RemoteInstance[]
*/
public function getAllInstances(): array {
$qb = $this->getRemoteSelectSql();
return $this->getItemsFromRequest($qb);
}
/**
* @return RemoteInstance[]
*/
public function getKnownInstances(): array {
$qb = $this->getRemoteSelectSql();
$qb->filter('type', RemoteInstance::TYPE_UNKNOWN, '', false);
return $this->getItemsFromRequest($qb);
}
/**
* - returns:
* - all GLOBAL_SCALE
* - TRUSTED if Circle is Federated
* - EXTERNAL if Circle is Federated and a contains a member from instance
*
* @param Circle $circle
* @param bool $broadcastAsFederated
*
* @return RemoteInstance[]
* @throws RequestBuilderException
*/
public function getOutgoingRecipient(Circle $circle, bool $broadcastAsFederated = false): array {
$qb = $this->getRemoteSelectSql();
$expr = $qb->expr();
$orX = $expr->orX();
$orX->add($qb->exprLimit('type', RemoteInstance::TYPE_GLOBALSCALE, '', false));
if ($circle->isConfig(Circle::CFG_FEDERATED) || $broadcastAsFederated) {
// get all TRUSTED
$orX->add($qb->exprLimit('type', RemoteInstance::TYPE_TRUSTED, '', false));
// get EXTERNAL with Members
$aliasMember = $qb->generateAlias(CoreQueryBuilder::REMOTE, CoreQueryBuilder::MEMBER);
$qb->leftJoin(
CoreQueryBuilder::REMOTE, self::TABLE_MEMBER, $aliasMember,
$expr->andX(
$expr->eq($aliasMember . '.circle_id', $qb->createNamedParameter($circle->getSingleId())),
$expr->eq($aliasMember . '.instance', CoreQueryBuilder::REMOTE . '.instance'),
$expr->gte(
$aliasMember . '.level',
$qb->createNamedParameter(Member::LEVEL_MEMBER, IQueryBuilder::PARAM_INT)
)
)
);
$external = $expr->andX();
$external->add($qb->exprLimit('type', RemoteInstance::TYPE_EXTERNAL, '', false));
$external->add($expr->isNotNull($aliasMember . '.instance'));
$orX->add($external);
}
$qb->andWhere($orX);
return $this->getItemsFromRequest($qb);
}
/**
* @param string $host
*
* @return RemoteInstance
* @throws RemoteNotFoundException
*/
public function getFromInstance(string $host): RemoteInstance {
$qb = $this->getRemoteSelectSql();
$qb->limitToInstance($host);
return $this->getItemFromRequest($qb);
}
/**
* @param string $href
*
* @return RemoteInstance
* @throws RemoteNotFoundException
*/
public function getFromHref(string $href): RemoteInstance {
$qb = $this->getRemoteSelectSql();
$qb->limit('href', $href, '', false);
return $this->getItemFromRequest($qb);
}
/**
* @param string $status
*
* @return RemoteInstance[]
*/
public function getFromType(string $status): array {
$qb = $this->getRemoteSelectSql();
$qb->limitToTypeString($status);
return $this->getItemsFromRequest($qb);
}
/**
* @param RemoteInstance $remoteInstance
*
* @return RemoteInstance
* @throws RemoteNotFoundException
*/
public function searchDuplicate(RemoteInstance $remoteInstance): RemoteInstance {
$qb = $this->getRemoteSelectSql();
$orX = $qb->expr()->orX();
$orX->add($qb->exprLimit('href', $remoteInstance->getId(), '', false));
$orX->add($qb->exprLimit('uid', $remoteInstance->getUid(true), '', false));
$orX->add($qb->exprLimit('instance', $remoteInstance->getInstance(), '', false));
$qb->andWhere($orX);
return $this->getItemFromRequest($qb);
}
/**
* @param RemoteInstance $remoteInstance
*/
public function deleteById(RemoteInstance $remoteInstance) {
$qb = $this->getRemoteDeleteSql();
$qb->limitToId($remoteInstance->getDbId());
$qb->execute();
}
}