Issues (263)

lib/Controller/Files.php (4 issues)

Labels
Severity
1
<?php
2
/**
3
 * Nextcloud - Gallery
4
 *
5
 * This file is licensed under the Affero General Public License version 3 or
6
 * later. See the COPYING file.
7
 *
8
 * @author Olivier Paroz <[email protected]>
9
 * @author Robin Appelman <[email protected]>
10
 *
11
 * @copyright Olivier Paroz 2017
12
 * @copyright Robin Appelman 2017
13
 */
14
15
namespace OCA\Gallery\Controller;
16
17
use OCP\Files\File;
0 ignored issues
show
The type OCP\Files\File was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
18
use OCP\Files\Folder;
0 ignored issues
show
The type OCP\Files\Folder was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
19
use OCP\ILogger;
0 ignored issues
show
The type OCP\ILogger was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
20
21
use OCP\AppFramework\Http;
0 ignored issues
show
The type OCP\AppFramework\Http was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
22
23
use OCA\Gallery\Service\SearchFolderService;
24
use OCA\Gallery\Service\ConfigService;
25
use OCA\Gallery\Service\SearchMediaService;
26
use OCA\Gallery\Service\DownloadService;
27
28
/**
29
 * Trait Files
30
 *
31
 * @package OCA\Gallery\Controller
32
 */
33
trait Files {
34
35
	use PathManipulation;
36
37
	/** @var SearchFolderService */
38
	private $searchFolderService;
39
	/** @var ConfigService */
40
	private $configService;
41
	/** @var SearchMediaService */
42
	private $searchMediaService;
43
	/** @var DownloadService */
44
	private $downloadService;
45
	/** @var ILogger */
46
	private $logger;
47
48
	/**
49
	 * @NoAdminRequired
50
	 *
51
	 * Returns a list of all media files and albums available to the authenticated user
52
	 *
53
	 *    * Authentication can be via a login/password or a token/(password)
54
	 *    * For private galleries, it returns all media files, with the full path from the root
55
	 *     folder For public galleries, the path starts from the folder the link gives access to
56
	 *     (virtual root)
57
	 *    * An exception is only caught in case something really wrong happens. As we don't test
58
	 *     files before including them in the list, we may return some bad apples
59
	 *
60
	 * @param string $location a path representing the current album in the app
61
	 * @param array $features the list of supported features
62
	 * @param string $etag the last known etag in the client
63
	 * @param array $mediatypes the list of supported media types
64
	 *
65
	 * @return array <string,array<string,string|int>>|Http\JSONResponse
66
	 */
67
	private function getFilesAndAlbums($location, $features, $etag, $mediatypes) {
68
		$files = [];
69
		$albums = [];
70
		$updated = true;
71
		/** @var Folder $folderNode */
72
		list($folderPathFromRoot, $folderNode) =
73
			$this->searchFolderService->getCurrentFolder(rawurldecode($location), $features);
74
		$albumConfig = $this->configService->getConfig($folderNode, $features);
75
		if ($folderNode->getEtag() !== $etag) {
76
			list($files, $albums) = $this->searchMediaService->getMediaFiles(
77
				$folderNode, $mediatypes, $features
78
			);
79
		} else {
80
			$updated = false;
81
		}
82
		$files = $this->fixPaths($files, $folderPathFromRoot);
83
84
		return $this->formatResults($files, $albums, $albumConfig, $folderPathFromRoot, $updated);
85
	}
86
87
	/**
88
	 * Generates shortened paths to the media files
89
	 *
90
	 * We only want to keep one folder between the current folder and the found media file
91
	 * /root/folder/sub1/sub2/file.ext
92
	 * becomes
93
	 * /root/folder/file.ext
94
	 *
95
	 * @param array $files
96
	 * @param string $folderPathFromRoot
97
	 *
98
	 * @return array
99
	 */
100
	private function fixPaths($files, $folderPathFromRoot) {
101
		if (!empty($files)) {
102
			foreach ($files as &$file) {
103
				$file['path'] = $this->getReducedPath($file['path'], $folderPathFromRoot);
104
			}
105
		}
106
107
		return $files;
108
	}
109
110
	/**
111
	 * Simply builds and returns an array containing the list of files, the album information and
112
	 * whether the location has changed or not
113
	 *
114
	 * @param array $files
115
	 * @param array $albums
116
	 * @param array $albumConfig
117
	 * @param string $folderPathFromRoot
118
	 * @param bool $updated
119
	 *
120
	 * @return array
121
	 * @internal param $array <string,string|int> $files
122
	 */
123
	private function formatResults($files, $albums, $albumConfig, $folderPathFromRoot, $updated) {
124
		return [
125
			'files'       => $files,
126
			'albums'      => $albums,
127
			'albumconfig' => $albumConfig,
128
			'albumpath'   => $folderPathFromRoot,
129
			'updated'     => $updated
130
		];
131
	}
132
133
	/**
134
	 * Generates the download data
135
	 *
136
	 * @param int $fileId the ID of the file of which we need a large preview of
137
	 * @param string|null $filename
138
	 *
139
	 * @return array|false
140
	 */
141
	private function getDownload($fileId, $filename) {
142
		/** @type File $file */
143
		$file = $this->downloadService->getFile($fileId);
144
		$this->configService->validateMimeType($file->getMimeType());
145
		$download = $this->downloadService->downloadFile($file);
146
		if (is_null($filename)) {
147
			$filename = $file->getName();
148
		}
149
		$download['name'] = $filename;
150
151
		return $download;
152
	}
153
154
}
155