Completed
Push — master ( ded746...b3a0d8 )
by Roeland
38:29
created

ApiController::toggleShowFolder()   A

Complexity

Conditions 6
Paths 3

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
nc 3
nop 2
dl 0
loc 14
rs 9.2222
c 0
b 0
f 0
1
<?php
2
/**
3
 * @copyright Copyright (c) 2016, ownCloud, Inc.
4
 *
5
 * @author Bjoern Schiessle <[email protected]>
6
 * @author Christoph Wurst <[email protected]>
7
 * @author Joas Schilling <[email protected]>
8
 * @author Lukas Reschke <[email protected]>
9
 * @author Morris Jobke <[email protected]>
10
 * @author Robin Appelman <[email protected]>
11
 * @author Roeland Jago Douma <[email protected]>
12
 * @author Tobias Kaminsky <[email protected]>
13
 * @author Vincent Petry <[email protected]>
14
 * @author Felix Nüsse <[email protected]>
15
 * @license AGPL-3.0
16
 *
17
 * This code is free software: you can redistribute it and/or modify
18
 * it under the terms of the GNU Affero General Public License, version 3,
19
 * as published by the Free Software Foundation.
20
 *
21
 * This program is distributed in the hope that it will be useful,
22
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24
 * GNU Affero General Public License for more details.
25
 *
26
 * You should have received a copy of the GNU Affero General Public License, version 3,
27
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
28
 *
29
 */
30
31
namespace OCA\Files\Controller;
32
33
use OCP\AppFramework\Http;
34
use OCP\AppFramework\Controller;
35
use OCP\Files\File;
36
use OCP\Files\Folder;
37
use OCP\Files\NotFoundException;
38
use OCP\IConfig;
39
use OCP\IRequest;
40
use OCP\AppFramework\Http\DataResponse;
41
use OCP\AppFramework\Http\FileDisplayResponse;
42
use OCP\AppFramework\Http\Response;
43
use OCA\Files\Service\TagService;
44
use OCP\IPreview;
45
use OCP\Share\IManager;
46
use OC\Files\Node\Node;
47
use OCP\IUserSession;
48
use Sabre\VObject\Property\Boolean;
49
50
/**
51
 * Class ApiController
52
 *
53
 * @package OCA\Files\Controller
54
 */
55
class ApiController extends Controller {
56
	/** @var TagService */
57
	private $tagService;
58
	/** @var IManager * */
59
	private $shareManager;
60
	/** @var IPreview */
61
	private $previewManager;
62
	/** IUserSession */
63
	private $userSession;
64
	/** IConfig */
65
	private $config;
66
	/** @var Folder */
67
	private $userFolder;
68
69
	/**
70
	 * @param string $appName
71
	 * @param IRequest $request
72
	 * @param IUserSession $userSession
73
	 * @param TagService $tagService
74
	 * @param IPreview $previewManager
75
	 * @param IManager $shareManager
76
	 * @param IConfig $config
77
	 * @param Folder $userFolder
78
	 */
79 View Code Duplication
	public function __construct($appName,
80
								IRequest $request,
81
								IUserSession $userSession,
82
								TagService $tagService,
83
								IPreview $previewManager,
84
								IManager $shareManager,
85
								IConfig $config,
86
								Folder $userFolder) {
87
		parent::__construct($appName, $request);
88
		$this->userSession = $userSession;
89
		$this->tagService = $tagService;
90
		$this->previewManager = $previewManager;
91
		$this->shareManager = $shareManager;
92
		$this->config = $config;
93
		$this->userFolder = $userFolder;
94
	}
95
96
	/**
97
	 * Gets a thumbnail of the specified file
98
	 *
99
	 * @since API version 1.0
100
	 *
101
	 * @NoAdminRequired
102
	 * @NoCSRFRequired
103
	 * @StrictCookieRequired
104
	 *
105
	 * @param int $x
106
	 * @param int $y
107
	 * @param string $file URL-encoded filename
108
	 * @return DataResponse|FileDisplayResponse
109
	 */
110
	public function getThumbnail($x, $y, $file) {
111
		if ($x < 1 || $y < 1) {
112
			return new DataResponse(['message' => 'Requested size must be numeric and a positive value.'], Http::STATUS_BAD_REQUEST);
113
		}
114
115
		try {
116
			$file = $this->userFolder->get($file);
117
			if ($file instanceof Folder) {
118
				throw new NotFoundException();
119
			}
120
121
			/** @var File $file */
122
			$preview = $this->previewManager->getPreview($file, $x, $y, true);
123
124
			return new FileDisplayResponse($preview, Http::STATUS_OK, ['Content-Type' => $preview->getMimeType()]);
125
		} catch (NotFoundException $e) {
126
			return new DataResponse(['message' => 'File not found.'], Http::STATUS_NOT_FOUND);
127
		} catch (\Exception $e) {
128
			return new DataResponse([], Http::STATUS_BAD_REQUEST);
129
		}
130
	}
131
132
	/**
133
	 * Updates the info of the specified file path
134
	 * The passed tags are absolute, which means they will
135
	 * replace the actual tag selection.
136
	 *
137
	 * @NoAdminRequired
138
	 *
139
	 * @param string $path path
140
	 * @param array|string $tags array of tags
141
	 * @return DataResponse
142
	 */
143
	public function updateFileTags($path, $tags = null) {
144
		$result = [];
145
		// if tags specified or empty array, update tags
146
		if (!is_null($tags)) {
147
			try {
148
				$this->tagService->updateFileTags($path, $tags);
0 ignored issues
show
Bug introduced by
It seems like $tags defined by parameter $tags on line 143 can also be of type string; however, OCA\Files\Service\TagService::updateFileTags() does only seem to accept array, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
149
			} catch (\OCP\Files\NotFoundException $e) {
150
				return new DataResponse([
151
					'message' => $e->getMessage()
152
				], Http::STATUS_NOT_FOUND);
153
			} catch (\OCP\Files\StorageNotAvailableException $e) {
154
				return new DataResponse([
155
					'message' => $e->getMessage()
156
				], Http::STATUS_SERVICE_UNAVAILABLE);
157
			} catch (\Exception $e) {
158
				return new DataResponse([
159
					'message' => $e->getMessage()
160
				], Http::STATUS_NOT_FOUND);
161
			}
162
			$result['tags'] = $tags;
163
		}
164
		return new DataResponse($result);
165
	}
166
167
	/**
168
	 * @param \OCP\Files\Node[] $nodes
169
	 * @return array
170
	 */
171
	private function formatNodes(array $nodes) {
172
		return array_values(array_map(function (Node $node) {
173
			/** @var \OC\Files\Node\Node $shareTypes */
174
			$shareTypes = $this->getShareTypes($node);
175
			$file = \OCA\Files\Helper::formatFileInfo($node->getFileInfo());
176
			$parts = explode('/', dirname($node->getPath()), 4);
177
			if (isset($parts[3])) {
178
				$file['path'] = '/' . $parts[3];
179
			} else {
180
				$file['path'] = '/';
181
			}
182
			if (!empty($shareTypes)) {
183
				$file['shareTypes'] = $shareTypes;
184
			}
185
			return $file;
186
		}, $nodes));
187
	}
188
189
	/**
190
	 * Returns a list of recently modifed files.
191
	 *
192
	 * @NoAdminRequired
193
	 *
194
	 * @return DataResponse
195
	 */
196
	public function getRecentFiles() {
197
		$nodes = $this->userFolder->getRecent(100);
198
		$files = $this->formatNodes($nodes);
199
		return new DataResponse(['files' => $files]);
200
	}
201
202
	/**
203
	 * Return a list of share types for outgoing shares
204
	 *
205
	 * @param Node $node file node
206
	 *
207
	 * @return int[] array of share types
208
	 */
209 View Code Duplication
	private function getShareTypes(Node $node) {
210
		$userId = $this->userSession->getUser()->getUID();
211
		$shareTypes = [];
212
		$requestedShareTypes = [
213
			\OCP\Share::SHARE_TYPE_USER,
214
			\OCP\Share::SHARE_TYPE_GROUP,
215
			\OCP\Share::SHARE_TYPE_LINK,
216
			\OCP\Share::SHARE_TYPE_REMOTE,
217
			\OCP\Share::SHARE_TYPE_EMAIL,
218
			\OCP\Share::SHARE_TYPE_ROOM
219
		];
220
		foreach ($requestedShareTypes as $requestedShareType) {
221
			// one of each type is enough to find out about the types
222
			$shares = $this->shareManager->getSharesBy(
223
				$userId,
224
				$requestedShareType,
225
				$node,
226
				false,
227
				1
228
			);
229
			if (!empty($shares)) {
230
				$shareTypes[] = $requestedShareType;
231
			}
232
		}
233
		return $shareTypes;
234
	}
235
236
	/**
237
	 * Change the default sort mode
238
	 *
239
	 * @NoAdminRequired
240
	 *
241
	 * @param string $mode
242
	 * @param string $direction
243
	 * @return Response
244
	 */
245
	public function updateFileSorting($mode, $direction) {
246
		$allowedMode = ['name', 'size', 'mtime'];
247
		$allowedDirection = ['asc', 'desc'];
248
		if (!in_array($mode, $allowedMode) || !in_array($direction, $allowedDirection)) {
249
			$response = new Response();
250
			$response->setStatus(Http::STATUS_UNPROCESSABLE_ENTITY);
251
			return $response;
252
		}
253
		$this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'file_sorting', $mode);
254
		$this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'file_sorting_direction', $direction);
255
		return new Response();
256
	}
257
258
	/**
259
	 * Toggle default for showing/hiding hidden files
260
	 *
261
	 * @NoAdminRequired
262
	 *
263
	 * @param bool $show
264
	 */
265
	public function showHiddenFiles($show) {
266
		$this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_hidden', (int)$show);
267
		return new Response();
268
	}
269
270
	/**
271
	 * Toggle default for showing/hiding xxx folder
272
	 *
273
	 * @NoAdminRequired
274
	 *
275
	 * @param bool $show 
276
	 * @param bool $key the key of the folder
277
	 *
278
	 * @return Response
279
	 */
280
	public function toggleShowFolder(int $show, string $key) {
281
		// ensure the edited key exists
282
		$navItems = \OCA\Files\App::getNavigationManager()->getAll();
283
		foreach ($navItems as $item) {
284
			// check if data is valid
285
			if (($show === 0 || $show === 1) && isset($item['expandedState']) && $key === $item['expandedState']) {
286
				$this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', $key, (int)$show);
287
				return new Response();
288
			}
289
		}
290
		$response = new Response();
291
		$response->setStatus(Http::STATUS_FORBIDDEN);
292
		return $response;
293
	}
294
295
	/**
296
	 * Get sorting-order for custom sorting
297
	 *
298
	 * @NoAdminRequired
299
	 *
300
	 * @param String
301
	 * @return String
302
	 */
303
	public function getNodeType($folderpath) {
304
		$node = $this->userFolder->get($folderpath);
305
		return $node->getType();
306
	}
307
308
}
309