Skip to content
Snippets Groups Projects
Select Git revision
  • 333b1181662f26afe13256b26c6c87605d627d10
  • main default protected
  • studip-rector
  • ci-opt
  • course-members-export-as-word
  • data-vue-app
  • pipeline-improvements
  • webpack-optimizations
  • rector
  • icon-renewal
  • http-client-and-factories
  • jsonapi-atomic-operations
  • vueify-messages
  • tic-2341
  • 135-translatable-study-areas
  • extensible-sorm-action-parameters
  • sorm-configuration-trait
  • jsonapi-mvv-routes
  • docblocks-for-magic-methods
19 results

TasksIndex.php

Blame
  • Forked from Stud.IP / Stud.IP
    4087 commits behind the upstream repository.
    Ron Lucke's avatar
    Ron Lucke authored
    333b1181
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    TasksIndex.php 3.43 KiB
    <?php
    
    namespace JsonApi\Routes\Courseware;
    
    use Courseware\Task;
    use Courseware\TaskGroup;
    use JsonApi\Errors\AuthorizationFailedException;
    use JsonApi\Errors\BadRequestException;
    use JsonApi\JsonApiController;
    use JsonApi\Schemas\Courseware\Task as TaskSchema;
    use JsonApi\Schemas\Courseware\TaskGroup as TaskGroupSchema;
    use Psr\Http\Message\ResponseInterface as Response;
    use Psr\Http\Message\ServerRequestInterface as Request;
    
    /**
     * Displays all Tasks.
     */
    class TasksIndex extends JsonApiController
    {
        protected $allowedFilteringParameters = ['cid'];
    
        protected $allowedIncludePaths = [
            TaskSchema::REL_FEEDBACK,
            TaskSchema::REL_SOLVER,
            TaskSchema::REL_STRUCTURAL_ELEMENT,
            TaskSchema::REL_TASK_GROUP,
            TaskSchema::REL_TASK_GROUP . '.' . TaskGroupSchema::REL_LECTURER,
        ];
    
        /**
         * @SuppressWarnings(PHPMD.UnusedFormalParameter)
         *
         * @param array $args
         *
         * @return Response
         */
        public function __invoke(Request $request, Response $response, $args)
        {
            if ($error = $this->validateFilters()) {
                throw new BadRequestException($error);
            }
    
            $filtering = $this->getQueryParameters()->getFilteringParameters() ?: [];
            $resources = [];
    
            if (empty($filtering)) {
                if (!Authority::canIndexTasks($this->getUser($request))) {
                    throw new AuthorizationFailedException('Only root users may index all tasks without a `filter[cid]`.');
                }
    
                $resources = Task::findBySQL('1 ORDER BY mkdate', []);
            } else {
                $user = $this->getUser($request);
                /** @var ?\Course $course */
                $course = \Course::find($filtering['cid']);
    
                if ($GLOBALS['perm']->have_studip_perm('tutor', $course->getId(), $user->getId())) {
                    $resources = $this->findTasksByCourse($course);
                } else {
                    $resources = $this->findTasksByCourseMember($user, $course);
                }
            }
    
            return $this->getContentResponse($resources);
        }
    
        private function validateFilters()
        {
            $filtering = $this->getQueryParameters()->getFilteringParameters() ?: [];
    
            // course
            if (isset($filtering['cid'])) {
                $course = \Course::find($filtering['cid']);
                if (!$course) {
                    return 'Could not find a course matching this `filter[cid]`.';
                }
            }
        }
    
        private function findTasksByCourse(\Course $course): \SimpleCollection
        {
            $taskGroups = TaskGroup::findBySQL('seminar_id = ?', [$course->getId()]);
    
            $tasks = [];
            foreach ($taskGroups as $taskGroup) {
                $tasks[] = $taskGroup->tasks->getArrayCopy();
            }
            $tasks = \SimpleORMapCollection::createFromArray(array_flatten($tasks), false)->orderBy('id asc');
    
            return $tasks;
        }
    
        private function findTasksByCourseMember(\User $user, \Course $course): \SimpleCollection
        {
            $groupIds = $course['statusgruppen']
                ->filter(function (\Statusgruppen $group) use ($user) {
                    return $group->isMember($user->getId());
                })
                ->pluck('id');
    
            return $this->findTasksByCourse($course)->filter(function ($task) use ($user, $groupIds) {
                return ('autor' === $task['solver_type'] && $task['solver_id'] === $user->getId()) ||
                    ('group' === $task['solver_type'] && in_array($task['solver_id'], $groupIds));
            });
        }
    }