/** * @dataProvider queryForFilterData * * @param mixed $will * @param string $query * @param array $parameters */ public function testQueryForFilter($will, $query, $parameters) { $this->mockUserSession('test'); $this->config->expects($this->any())->method('getUserValue')->willReturnMap([['test', 'activity', 'notify_stream_' . Activity::TYPE_FAVORITES, false, true]]); if (is_array($will)) { $this->activityHelper->expects($this->any())->method('getFavoriteFilePaths')->with('test')->willReturn($will); } else { $this->activityHelper->expects($this->any())->method('getFavoriteFilePaths')->with('test')->willThrowException($will); } $result = $this->activityExtension->getQueryForFilter('all'); $this->assertEquals([$query, $parameters], $result); $this->executeQueryForFilter($result); }
/** * For a given filter the extension can specify the sql query conditions including parameters for that query. * In case the extension does not know the filter false is to be returned. * The query condition and the parameters are to be returned as array with two elements. * E.g. return array('`app` = ? and `message` like ?', array('mail', 'ownCloud%')); * * @param string $filter * @return array|false */ public function getQueryForFilter($filter) { $user = $this->activityManager->getCurrentUserId(); // Display actions from all files if ($filter === self::FILTER_FILES) { return ['`app` = ?', [self::APP_FILES]]; } if (!$user) { // Remaining filters only work with a user/token return false; } // Display actions from favorites only if ($filter === self::FILTER_FAVORITES || in_array($filter, ['all', 'by', 'self']) && $this->userSettingFavoritesOnly($user)) { try { $favorites = $this->helper->getFavoriteFilePaths($user); } catch (\RuntimeException $e) { // Too many favorites, can not put them into one query anymore... return ['`app` = ?', [self::APP_FILES]]; } /* * Display activities only, when they are not `type` create/change * or `file` is a favorite or in a favorite folder */ $parameters = $fileQueryList = []; $parameters[] = self::APP_FILES; $parameters[] = self::APP_FILES; $fileQueryList[] = '(`type` <> ? AND `type` <> ?)'; $parameters[] = self::TYPE_SHARE_CREATED; $parameters[] = self::TYPE_SHARE_CHANGED; foreach ($favorites['items'] as $favorite) { $fileQueryList[] = '`file` = ?'; $parameters[] = $favorite; } foreach ($favorites['folders'] as $favorite) { $fileQueryList[] = '`file` LIKE ?'; $parameters[] = $this->connection->escapeLikeParameter($favorite) . '/%'; } return [' CASE ' . 'WHEN `app` <> ? THEN 1 ' . 'WHEN `app` = ? AND (' . implode(' OR ', $fileQueryList) . ') THEN 1 ' . 'ELSE 0 ' . 'END = 1 ', $parameters]; } return false; }