%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/related_resources/lib/Model/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/related_resources/lib/Model/RelatedResource.php |
<?php declare(strict_types=1); /** * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\RelatedResources\Model; use JsonSerializable; use OCA\RelatedResources\IRelatedResource; use OCA\RelatedResources\Tools\IDeserializable; use OCA\RelatedResources\Tools\Traits\TArrayTools; /** * Class RelatedResource * * @package OCA\RelatedResources\Model */ class RelatedResource implements IRelatedResource, IDeserializable, JsonSerializable { use TArrayTools; public static float $IMPROVE_LOW_LINK = 1.1; public static float $IMPROVE_MEDIUM_LINK = 1.3; public static float $IMPROVE_HIGH_LINK = 1.8; private static float $DIMINISHING_RETURN = 0.6; public const ITEM_OWNER = 'itemOwner'; public const ITEM_CREATION = 'itemCreation'; public const ITEM_LAST_UPDATE = 'itemLastUpdate'; public const ITEM_KEYWORDS = 'itemKeywords'; public const LINK_CREATOR = 'linkCreator'; public const LINK_CREATION = 'linkCreation'; public const LINK_RECIPIENT = 'linkRecipient'; private string $providerId; private string $itemId; private string $title = ''; private string $subtitle = ''; private string $tooltip = ''; private string $icon = ''; private string $preview = ''; private string $url = ''; private int $range = 0; private array $virtualGroup = []; private array $recipients = []; private bool $groupShared = false; private float $score = 1; private array $improvements = []; private array $currentQuality = []; private array $metas = []; public function __construct(string $providerId = '', string $itemId = '') { $this->providerId = $providerId; $this->itemId = $itemId; } public function getProviderId(): string { return $this->providerId; } public function setProviderId(string $providerId): self { $this->providerId = $providerId; return $this; } public function getItemId(): string { return $this->itemId; } public function setItemId(string $itemId): self { $this->itemId = $itemId; return $this; } public function setTitle(string $title): IRelatedResource { $this->title = $title; return $this; } public function getTitle(): string { return $this->title; } public function setSubtitle(string $subtitle): IRelatedResource { $this->subtitle = $subtitle; return $this; } public function getSubtitle(): string { return $this->subtitle; } public function setTooltip(string $tooltip): self { $this->tooltip = $tooltip; return $this; } public function getTooltip(): string { return $this->tooltip; } public function setIcon(string $icon): self { $this->icon = $icon; return $this; } public function getIcon(): string { return $this->icon; } public function setPreview(string $preview): self { $this->preview = $preview; return $this; } public function getPreview(): string { return $this->preview; } public function setUrl(string $url): IRelatedResource { $this->url = $url; return $this; } public function getUrl(): string { return $this->url; } public function improve( float $quality, string $type, bool $diminishingReturn = true ): IRelatedResource { $quality = ($this->currentQuality[$type] ?? $quality); $this->score = $this->score * $quality; $this->improvements[] = [ 'type' => $type, 'quality' => $quality ]; if ($diminishingReturn) { $quality = 1 + (($quality - 1) * self::$DIMINISHING_RETURN); } $this->currentQuality[$type] = $quality; return $this; } public function getScore(): float { return $this->score; } public function setScore(int $score): self { $this->score = $score; return $this; } public function setVirtualGroup(array $virtualGroup): self { $this->virtualGroup = $virtualGroup; return $this; } public function getVirtualGroup(): array { return $this->virtualGroup; } public function addToVirtualGroup(string $singleId): self { if (!in_array($singleId, $this->virtualGroup)) { $this->virtualGroup[] = $singleId; } return $this; } public function mergeVirtualGroup(array $virtualGroup): self { $this->virtualGroup = array_values(array_unique(array_merge($this->virtualGroup, $virtualGroup))); return $this; } public function setRecipients(array $recipients): self { $this->recipients = $recipients; return $this; } public function getRecipients(): array { return $this->recipients; } public function addRecipient(string $singleId): self { if (!in_array($singleId, $this->recipients)) { $this->recipients[] = $singleId; } return $this; } public function mergeRecipients(array $recipients): self { $this->recipients = array_values(array_unique(array_merge($this->recipients, $recipients))); return $this; } public function setAsGroupShared(bool $groupShared = true): self { $this->groupShared = $groupShared; return $this; } public function isGroupShared(): bool { return $this->groupShared; } public function getImprovements(): array { return $this->improvements; } public function setImprovements(array $improvements): self { $this->improvements = $improvements; return $this; } public function setCurrentQuality(array $currentQuality): self { $this->currentQuality = $currentQuality; return $this; } public function getCurrentQuality(): array { return $this->currentQuality; } public function import(array $data): IDeserializable { $this->setProviderId($this->get('providerId', $data)); $this->setItemId($this->get('itemId', $data)); $this->setTitle($this->get('title', $data)); $this->setSubtitle($this->get('subtitle', $data)); $this->setTooltip($this->get('tooltip', $data)); $this->setIcon($this->get('icon', $data)); $this->setPreview($this->get('preview', $data)); $this->setUrl($this->get('url', $data)); $this->setScore($this->getInt('score', $data)); $this->setAsGroupShared($this->getBool('groupShared', $data)); $this->setRecipients($this->getArray('recipients', $data)); $this->setVirtualGroup($this->getArray('virtualGroup', $data)); $this->setImprovements($this->getArray('improvements', $data)); $this->setCurrentQuality($this->getArray('currentQuality', $data)); $this->setMetas($this->getArray('meta', $data)); return $this; } public function jsonSerialize(): array { return [ 'providerId' => $this->getProviderId(), 'itemId' => $this->getItemId(), 'title' => $this->getTitle(), 'subtitle' => $this->getSubtitle(), 'tooltip' => $this->getTooltip(), 'icon' => $this->getIcon(), 'preview' => $this->getPreview(), 'url' => $this->getUrl(), 'score' => $this->getScore(), 'groupShared' => $this->isGroupShared(), 'virtualGroup' => $this->getVirtualGroup(), 'recipients' => $this->getRecipients(), 'improvements' => $this->getImprovements(), 'currentQuality' => $this->getCurrentQuality(), 'meta' => $this->getMetas() ]; } public static function cleanData(array $arr): array { static $acceptedKeys = [ 'providerId', 'itemId', 'title', 'subtitle', 'tooltip', 'url', 'icon', 'preview', 'score', 'improvements' ]; $new = []; foreach (array_keys($arr) as $k) { if (in_array($k, $acceptedKeys)) { $new[$k] = $arr[$k]; } } return $new; } public function setMeta(string $k, string $v): IRelatedResource { $this->metas[$k] = $v; return $this; } public function setMetaInt(string $k, int $v): IRelatedResource { $this->metas[$k] = $v; return $this; } public function setMetaArray(string $k, array $v): IRelatedResource { $this->metas[$k] = $v; return $this; } public function setMetas(array $metas): IRelatedResource { $this->metas = array_merge($this->metas, $metas); return $this; } public function hasMeta(string $k): bool { return $this->validKey($k, $this->metas); } public function getMeta(string $k): string { return $this->get($k, $this->metas); } public function getMetaInt(string $k): int { return $this->getInt($k, $this->metas); } public function getMetaArray(string $k): array { return $this->getArray($k, $this->metas); } public function getMetas(): array { return $this->metas; } }