1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
<?php
namespace JsonApi\Routes\Files;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\BadRequestException;
use JsonApi\Errors\RecordNotFoundException;
use JsonApi\JsonApiController;
abstract class AbstractRangeIndex extends JsonApiController
{
use RangeHelperTrait;
protected $allowedPagingParameters = ['offset', 'limit'];
abstract protected function getRangeResources(\User $user, \SimpleORMap $resource);
/**
* @SuppressWarnings(PHPMD.UnusedFormalParameters)
*/
public function __invoke(Request $request, Response $response, $args)
{
if (!$this->validateResourceType($args['type'])) {
throw new BadRequestException('Bad resource type.');
}
if (!$resource = $this->findResource($args['type'], $args['id'])) {
throw new RecordNotFoundException();
}
if (!$this->authorizeUser($user = $this->getUser($request), $resource)) {
throw new AuthorizationFailedException();
}
$files = $this->getRangeResources($user, $resource);
list($offset, $limit) = $this->getOffsetAndLimit();
return $this->getPaginatedContentResponse(
array_slice($files, $offset, $limit),
count($files)
);
}
private function authorizeUser(\User $user, \SimpleORMap $resource)
{
if (!Authority::canShowFileArea($user, $resource)) {
return false;
}
switch (get_class($resource)) {
case 'Course':
return Authority::canIndexCourse($user, $resource);
case 'Institute':
return Authority::canIndexInstitute($user, $resource);
case 'User':
return Authority::canIndexUser($user, $resource);
}
return false;
}
public static function getFolderRecursive(
\FolderType $topFolder,
\User $user
) {
$userId = $user->id;
$folders = [];
$arrayWalker = function ($topFolder) use (&$arrayWalker, &$folders, $userId) {
if ($topFolder->isVisible($userId)) {
$folders[$topFolder->getId()] = $topFolder;
if ($topFolder->isReadable($userId)) {
$subfolders = $topFolder->getSubFolders();
array_walk($subfolders, $arrayWalker);
}
}
};
$topFolders = [$topFolder];
array_walk($topFolders, $arrayWalker);
return $folders;
}
}
|