. */ namespace OCA\SideMenu\Controller; use OC; use OC\App\AppStore\Fetcher\CategoryFetcher; use OC\URLGenerator; use OCA\SideMenu\AppInfo\Application; use OCA\SideMenu\Service\AppRepository; use OCA\SideMenu\Service\ConfigProxy; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\JSONResponse; use OCP\IConfig; use OCP\IL10N; use OCP\IRequest; use OCP\IUserSession; use OCP\L10N\IFactory; class NavController extends Controller { /** * @var ConfigProxy */ protected $config; /** * @var IConfig */ protected $iConfig; /** * @var AppRepository */ protected $appRepository; /** * @var IFactory */ protected $l10nFactory; /** * @var CategoryFetcher */ protected $categoryFetcher; /** * @var URLGenerator */ protected $router; public function __construct( string $appName, IRequest $request, IConfig $iConfig, ConfigProxy $config, AppRepository $appRepository, CategoryFetcher $categoryFetcher, URLGenerator $router, IL10N $trans, IFactory $l10nFactory) { parent::__construct($appName, $request); $this->config = $config; $this->iConfig = $iConfig; $this->appRepository = $appRepository; $this->categoryFetcher = $categoryFetcher; $this->l10nFactory = $l10nFactory; $this->router = $router; } /** * @NoAdminRequired * @NoCSRFRequired * @PublicPage * * @return JSONResponse */ public function items() { $apps = $this->appRepository->getVisibleApps(); $currentLanguage = substr($this->l10nFactory->findLanguage(), 0, 2); $externalSitesInTopMenu = $this->config->getAppValueBool('external-sites-in-top-menu', '0'); $user = OC::$server[IUserSession::class]->getUser(); $appsCategories = []; $categoriesAppsCount = []; $items = []; if (!$user) { return new JSONResponse([ 'items' => $items, ]); } $categoriesLabels = $this->config->getAppValueArray('cache-categories', '[]'); if (empty($categoriesLabels)) { $categoriesLabels = $this->categoryFetcher->get(); $this->iConfig->setAppValue(Application::APP_ID, 'cache-categories', json_encode($categoriesLabels)); } $topMenuApps = $this->config->getAppValueArray('top-menu-apps', '[]'); $userTopMenuApps = $this->config->getUserValueArray($user, 'top-menu-apps', '[]'); if (!empty($userTopMenuApps)) { $topMenuApps = $userTopMenuApps; } foreach ($categoriesLabels as $k => $category) { $categoriesLabels[$category['id']] = $category['translations'][$currentLanguage]['name'] ?? $category['translations']['en']['name']; unset($categoriesLabels[$k]); } $categoriesLabels['external_links'] = $this->l10nFactory->get('external')->t('External sites'); $items['other'] = [ 'name' => '', 'apps' => [], ]; foreach ($apps as $app) { if (in_array($app['id'], $topMenuApps)) { continue; } $categories = (array) $app['category']; $appsCategories[$app['id']] = []; if (empty($categories)) { $categories = ['other']; } foreach ($categories as $category) { if (!isset($items[$category])) { $items[$category] = [ 'name' => $categoriesLabels[$category] ?? $category, 'apps' => [], ]; } if (!isset($categoriesAppsCount[$category])) { $categoriesAppsCount[$category] = 0; } ++$categoriesAppsCount[$category]; $appsCategories[$app['id']][] = $category; $items[$category]['apps'][$app['id']] = [ 'name' => $app['name'], 'href' => $app['href'], 'icon' => $app['icon'], ]; } } arsort($categoriesAppsCount); $keys = array_keys($categoriesAppsCount); foreach ($appsCategories as $app => $appCategories) { $smallerIndex = count($categoriesAppsCount) - 1; foreach ($appCategories as $appCategory) { $appKey = array_keys($keys, $appCategory)[0]; if ($appKey < $smallerIndex) { $smallerIndex = $appKey; } } $category = $keys[$smallerIndex]; foreach ($items as $itemCategory => $value) { if ($itemCategory !== $category && isset($value['apps'][$app])) { unset($items[$itemCategory]['apps'][$app]); if (empty($items[$itemCategory]['apps'])) { unset($items[$itemCategory]); } } } } foreach ($items as $category => $value) { if (empty($items[$category]['apps'])) { unset($items[$category]); } else { uasort($items[$category]['apps'], function ($a, $b) { return ($a['name'] < $b['name']) ? -1 : 1; }); } } usort($items, function ($a, $b) { return ($a['name'] < $b['name']) ? -1 : 1; }); return new JSONResponse([ 'items' => $items, ]); } }