Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
8 / 8
CRAP
100.00% covered (success)
100.00%
39 / 39
Preview
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
8 / 8
17
100.00% covered (success)
100.00%
39 / 39
 exitController
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
2 / 2
 getThumbnail
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
5 / 5
 getData
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
8 / 8
 getFile
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
7 / 7
 getPreviewData
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
7 / 7
 getErrorData
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 getExceptionData
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 prepareEmptyThumbnail
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
7 / 7
<?php
/**
 * Gallery
 *
 * This file is licensed under the Affero General Public License version 3 or
 * later. See the COPYING file.
 *
 * @author Olivier Paroz <galleryapps@oparoz.com>
 * @author Robin Appelman <robin@icewind.nl>
 *
 * @copyright Olivier Paroz 2014-2016
 * @copyright Robin Appelman 2012-2014
 */
namespace OCA\Gallery\Controller;
use OCP\IURLGenerator;
use OCP\ILogger;
use OCP\Files\File;
use OCP\AppFramework\Http;
use OCA\Gallery\Service\ServiceException;
use OCA\Gallery\Service\NotFoundServiceException;
use OCA\Gallery\Service\ConfigService;
use OCA\Gallery\Service\ThumbnailService;
use OCA\Gallery\Service\PreviewService;
use OCA\Gallery\Service\DownloadService;
/**
 * Class Preview
 *
 * @package OCA\Gallery\Controller
 */
trait Preview {
    use HttpError;
    /** @var IURLGenerator */
    private $urlGenerator;
    /** @var ConfigService */
    private $configService;
    /**  @var ThumbnailService */
    private $thumbnailService;
    /**  @var PreviewService */
    private $previewService;
    /** @var DownloadService */
    private $downloadService;
    /** @var ILogger */
    private $logger;
    /** @type bool */
    private $download = false;
    /**
     * Exits the controller in a live environment and throws an exception when testing
     */
    protected function exitController() {
        if (defined('PHPUNIT_RUN')) {
            throw new \Exception();
            // @codeCoverageIgnoreStart
        } else {
            exit();
        }
        // @codeCoverageIgnoreEnd
    }
    /**
     * Retrieves the thumbnail to send back to the browser
     *
     * The thumbnail is either a resized preview of the file or the original file
     * Thumbnails are base64encoded before getting sent back
     *
     *
     * @param int $fileId the ID of the file of which we need a thumbnail preview of
     * @param bool $square whether the thumbnail should be square
     * @param double $scale whether we're allowed to scale the preview up
     *
     * @return array<string,array|string>
     */
    private function getThumbnail($fileId, $square, $scale) {
        list($width, $height, $aspect, $animatedPreview, $base64Encode) =
            $this->thumbnailService->getThumbnailSpecs($square, $scale);
        /** @type File $file */
        list($file, $preview, $status) =
            $this->getData(
                $fileId, $width, $height, $aspect, $animatedPreview, $base64Encode
            );
        if ($preview === null) {
            $preview = $this->prepareEmptyThumbnail($file, $status);
        }
        return [$preview, $status];
    }
    /**
     * Returns either a generated preview, the file as-is or an empty object
     *
     * @param int $fileId
     * @param int $width
     * @param int $height
     * @param bool $keepAspect
     * @param bool $animatedPreview
     * @param bool $base64Encode
     *
     * @return array<string,\OC_Image|string>
     *
     * @throws NotFoundServiceException
     */
    private function getData(
        $fileId, $width, $height, $keepAspect = true, $animatedPreview = true, $base64Encode = false
    ) {
        /** @type File $file */
        list($file, $status) = $this->getFile($fileId);
        try {
            if (!is_null($file)) {
                $data = $this->getPreviewData(
                    $file, $animatedPreview, $width, $height, $keepAspect, $base64Encode
                );
            } else {
                $data = $this->getErrorData($status);
            }
        } catch (ServiceException $exception) {
            $data = $this->getExceptionData($exception);
        }
        array_unshift($data, $file);
        return $data;
    }
    /**
     * Returns the file of which a preview will be generated
     *
     * @param int $fileId
     *
     * @return array<File|int|null>
     */
    private function getFile($fileId) {
        $status = Http::STATUS_OK;
        try {
            /** @type File $file */
            $file = $this->previewService->getFile($fileId);
            $this->configService->validateMimeType($file->getMimeType());
        } catch (ServiceException $exception) {
            $file = null;
            $status = $this->getHttpStatusCode($exception);
        }
        return [$file, $status];
    }
    /**
     * @param File $file
     * @param bool $animatedPreview
     * @param int $width
     * @param int $height
     * @param bool $keepAspect
     * @param bool $base64Encode
     *
     * @return array
     */
    private function getPreviewData(
        $file, $animatedPreview, $width, $height, $keepAspect, $base64Encode
    ) {
        $status = Http::STATUS_OK;
        if ($this->previewService->isPreviewRequired($file, $animatedPreview)) {
            $preview = $this->previewService->createPreview(
                $file, $width, $height, $keepAspect, $base64Encode
            );
        } else {
            $preview = $this->downloadService->downloadFile($file, $base64Encode);
        }
        if (!$preview) {
            list($preview, $status) = $this->getErrorData();
        }
        return [$preview, $status];
    }
    /**
     * Returns an error array
     *
     * @param $status
     *
     * @return array<null|int>
     */
    private function getErrorData($status = Http::STATUS_INTERNAL_SERVER_ERROR) {
        return [null, $status];
    }
    /**
     * Returns an error array
     *
     * @param ServiceException $exception
     *
     * @return array<null|int|string>
     */
    private function getExceptionData($exception) {
        $code = $this->getHttpStatusCode($exception);
        return $this->getErrorData($code);
    }
    /**
     * Prepares an empty Thumbnail array to send back
     *
     * When we can't even get the file information, we send an empty mimeType
     *
     * @param File $file
     * @param int $status
     *
     * @return array<string,null|string>
     */
    private function prepareEmptyThumbnail($file, $status) {
        $thumbnail = [];
        if ($status !== Http::STATUS_NOT_FOUND) {
            $mimeType = '';
            if ($file) {
                $mimeType = $file->getMimeType();
            }
            $thumbnail = ['preview' => null, 'mimetype' => $mimeType];
        }
        return $thumbnail;
    }
}