%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/WebsitePreviewService.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 Exception;
use OCA\Passwords\Exception\ApiException;
use OCA\Passwords\Helper\Preview\ResizePreviewHelper;
use OCA\Passwords\Provider\Preview\PreviewProviderInterface;
use OCA\Passwords\Services\Traits\ValidatesDomainTrait;
use OCP\AppFramework\Http;
use OCP\Files\SimpleFS\ISimpleFile;
use Throwable;
/**
* Class WebsitePreviewService
*
* @package OCA\Passwords\Services
*/
class WebsitePreviewService {
use ValidatesDomainTrait;
const VIEWPORT_DESKTOP = 'desktop';
const VIEWPORT_MOBILE = 'mobile';
/**
* WebsitePreviewService constructor.
*
* @param ValidationService $validationService
* @param LoggingService $logger
* @param PreviewProviderInterface $previewProvider
* @param ResizePreviewHelper $resizeHelper
*/
public function __construct(
protected ValidationService $validationService,
protected LoggingService $logger,
protected PreviewProviderInterface $previewProvider,
protected ResizePreviewHelper $resizeHelper
) {
}
/**
* @param string $domain
* @param string $view
* @param int $minWidth
* @param int $minHeight
* @param int $maxWidth
* @param int $maxHeight
*
* @return ISimpleFile
* @throws ApiException
*/
public function getPreview(
string $domain,
string $view = self::VIEWPORT_DESKTOP,
int $minWidth = 640,
int $minHeight = 0,
int $maxWidth = 640,
int $maxHeight = 0
): ISimpleFile {
[$domain, $minWidth, $minHeight, $maxWidth, $maxHeight]
= $this->validateInputData($domain, $minWidth, $minHeight, $maxWidth, $maxHeight);
try {
return $this->getWebsitePreview($domain, $view, $minWidth, $minHeight, $maxWidth, $maxHeight);
} catch(Throwable $e) {
$this->logger->logException($e);
return $this->getDefaultPreview($domain, $minWidth, $minHeight, $maxWidth, $maxHeight);
}
}
/**
* @param string $domain
* @param string $view
* @param int $minWidth
* @param int $minHeight
* @param int $maxWidth
* @param int $maxHeight
*
* @return null|ISimpleFile
* @throws Exception
*/
protected function getWebsitePreview(string $domain, string $view, int $minWidth, int $minHeight, int $maxWidth, int $maxHeight): ?ISimpleFile {
if(!$this->validationService->isValidDomain($domain)) {
$websitePreview = $this->previewProvider->getDefaultPreview('default');
} else {
$websitePreview = $this->previewProvider->getPreview($domain, $view);
}
return $this->resizeHelper->resizePreview($websitePreview, $minWidth, $minHeight, $maxWidth, $maxHeight);
}
/**
* @param string $domain
* @param int $minWidth
* @param int $minHeight
* @param int $maxWidth
* @param int $maxHeight
*
* @return null|ISimpleFile
* @throws ApiException
*/
protected function getDefaultPreview(string $domain, int $minWidth, int $minHeight, int $maxWidth, int $maxHeight): ?ISimpleFile {
try {
$websitePreview = $this->previewProvider->getDefaultPreview($domain);
return $this->resizeHelper->resizePreview($websitePreview, $minWidth, $minHeight, $maxWidth, $maxHeight);
} catch(Throwable $e) {
$this->logger->logException($e);
throw new ApiException('Internal Website Preview API Error', Http::STATUS_BAD_GATEWAY, $e);
}
}
/**
* @param string $domain
* @param int $minWidth
* @param int $minHeight
* @param int $maxWidth
* @param int $maxHeight
*
* @return array
*/
protected function validateInputData(string $domain, int $minWidth, int $minHeight, int $maxWidth, int $maxHeight): array {
$domain = $this->validateDomain($domain);
$minWidth = $this->validateMinimum($minWidth);
$maxWidth = $this->validateMaximum($minWidth, $maxWidth);
$minHeight = $this->validateMinimum($minHeight);
$maxHeight = $this->validateMaximum($minHeight, $maxHeight);
return [$domain, $minWidth, $minHeight, $maxWidth, $maxHeight];
}
/**
* @param int $minimum
*
* @return int
*/
protected function validateMinimum(int $minimum): int {
$minimum = round($minimum, -1);
if($minimum > 1280) return 1280;
if($minimum < 240) return 240;
return $minimum;
}
/**
* @param int $minimum
* @param int $maximum
*
* @return int
*/
protected function validateMaximum(int $minimum, int $maximum): int {
$maximum = round($maximum, -1);
if($maximum < $minimum && $maximum !== 0.0) return $minimum;
if($maximum > 1280) return 1280;
if($maximum < 240 && $maximum !== 0.0) return 240;
return $maximum;
}
}