Skip to content
Snippets Groups Projects
Select Git revision
  • 5f78b312c8ad82f91148d6bfe79c614651736161
  • 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

PublicStructuralElementsIndex.php

Blame
  • Forked from Stud.IP / Stud.IP
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    TasksIndex.php 3.58 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, bool $showNotYetActive = true): \SimpleCollection
        {
            $whereClause = $showNotYetActive ? 'seminar_id = ?' : 'start_date <= UNIX_TIMESTAMP() AND seminar_id = ?';
            $taskGroups = TaskGroup::findBySQL($whereClause, [$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, false)->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));
            });
        }
    }