%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Services/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Services/FaviconService.php |
<?php
/*
* @copyright 2023 Passwords App
*
* @author Marius David Wieschollek
* @license AGPL-3.0
*
* This file is part of the Passwords App
* created by Marius David Wieschollek.
*/
namespace OCA\Passwords\Services;
use OCA\Passwords\Exception\ApiException;
use OCA\Passwords\Helper\Favicon\ResizeFaviconHelper;
use OCA\Passwords\Provider\Favicon\FaviconProviderInterface;
use OCA\Passwords\Services\Traits\ValidatesDomainTrait;
use OCP\AppFramework\Http;
use OCP\Files\SimpleFS\ISimpleFile;
use Throwable;
/**
* Class FaviconService
*
* @package OCA\Passwords\Services
*/
class FaviconService {
use ValidatesDomainTrait;
/**
* FaviconService constructor.
*
* @param ValidationService $validationService
* @param FaviconProviderInterface $faviconProvider
* @param LoggingService $logger
* @param ResizeFaviconHelper $resizeHelper
*/
public function __construct(
protected ValidationService $validationService,
protected FaviconProviderInterface $faviconProvider,
protected LoggingService $logger,
protected ResizeFaviconHelper $resizeHelper
) {
}
/**
* @param string $domain
* @param int $size
*
* @return ISimpleFile
* @throws ApiException
* @throws Throwable
*/
public function getFavicon(string $domain, int $size = 32): ISimpleFile {
[$domain, $size] = $this->validateInput($domain, $size);
if(!$this->validationService->isValidDomain($domain)) {
return $this->handleInvalidDomain($domain, $size);
}
try {
$favicon = $this->faviconProvider->getFavicon($domain);
if($favicon) {
$file = $this->resizeHelper->resizeFavicon($favicon, $size);
if($file) return $file;
}
} catch(Throwable $e) {
return $this->handleFaviconFetchFailure($domain, $size, $e);
}
return $this->getDefaultFavicon($domain, $size);
}
/**
* @param string $domain
* @param int $size
*
* @return ISimpleFile
* @throws ApiException
*/
protected function
handleInvalidDomain(
string $domain,
int $size
): ISimpleFile {
if($domain !== 'default') {
$domain = mb_substr($domain, 0, 1);
} else {
$domain = ' ';
}
return $this->getDefaultFavicon($domain, $size);
}
/**
* @param string $domain
* @param int $size
* @param Throwable $e
*
* @return ISimpleFile
* @throws ApiException
*/
protected function handleFaviconFetchFailure(string $domain, int $size, Throwable $e): ISimpleFile {
$this->logger->logException($e);
return $this->getDefaultFavicon($domain, $size);
}
/**
* @param string $domain
* @param int $size
*
* @return array
*/
protected function validateInput(string $domain, int $size): array {
$domain = $this->validateDomain($domain);
$size = round($size / 8) * 8;
if($size > 256) {
$size = 256;
} else if($size < 16) {
$size = 16;
}
return [$domain, $size];
}
/**
* @param string $domain
* @param int $size
*
* @return ISimpleFile|null
* @throws ApiException
*/
protected function getDefaultFavicon(string $domain, int $size): ?ISimpleFile {
try {
return $this->faviconProvider->getDefaultFavicon($domain, $size);
} catch(Throwable $ex) {
$this->logger->logException($ex);
throw new ApiException('Internal Favicon API Error', Http::STATUS_BAD_GATEWAY, $ex);
}
}
}