aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/JsonApi/Routes/Files/AbstractRangeIndex.php
blob: 15a98c3b414ce72e648ecd9e595a05a7b26ac6b2 (plain)
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;
    }
}