Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>tags/v29.0.0beta3
@@ -39,6 +39,7 @@ return [ | |||
['name' => 'MailSettings#storeCredentials', 'url' => '/settings/admin/mailsettings/credentials', 'verb' => 'POST' , 'root' => ''], | |||
['name' => 'MailSettings#sendTestMail', 'url' => '/settings/admin/mailtest', 'verb' => 'POST' , 'root' => ''], | |||
['name' => 'AppSettings#getAppDiscoverJSON', 'url' => '/settings/api/apps/discover', 'verb' => 'GET', 'root' => ''], | |||
['name' => 'AppSettings#listCategories', 'url' => '/settings/apps/categories', 'verb' => 'GET' , 'root' => ''], | |||
['name' => 'AppSettings#viewApps', 'url' => '/settings/apps', 'verb' => 'GET' , 'root' => ''], | |||
['name' => 'AppSettings#listApps', 'url' => '/settings/apps/list', 'verb' => 'GET' , 'root' => ''], |
@@ -14,6 +14,7 @@ | |||
* @author Roeland Jago Douma <roeland@famdouma.nl> | |||
* @author Thomas Müller <thomas.mueller@tmit.eu> | |||
* @author Kate Döen <kate.doeen@nextcloud.com> | |||
* @author Ferdinand Thiessen <opensource@fthiessen.de> | |||
* | |||
* @license AGPL-3.0 | |||
* | |||
@@ -33,6 +34,7 @@ | |||
namespace OCA\Settings\Controller; | |||
use OC\App\AppStore\Bundles\BundleFetcher; | |||
use OC\App\AppStore\Fetcher\AppDiscoverFetcher; | |||
use OC\App\AppStore\Fetcher\AppFetcher; | |||
use OC\App\AppStore\Fetcher\CategoryFetcher; | |||
use OC\App\AppStore\Version\VersionParser; | |||
@@ -77,6 +79,7 @@ class AppSettingsController extends Controller { | |||
private IURLGenerator $urlGenerator, | |||
private LoggerInterface $logger, | |||
private IInitialState $initialState, | |||
private AppDiscoverFetcher $discoverFetcher, | |||
) { | |||
parent::__construct($appName, $request); | |||
} | |||
@@ -106,6 +109,16 @@ class AppSettingsController extends Controller { | |||
return $templateResponse; | |||
} | |||
/** | |||
* Get all active entries for the app discover section | |||
* | |||
* @NoCSRFRequired | |||
*/ | |||
public function getAppDiscoverJSON(): JSONResponse { | |||
$data = $this->discoverFetcher->get(); | |||
return new JSONResponse($data); | |||
} | |||
private function getAppsWithUpdates() { | |||
$appClass = new \OC_App(); | |||
$apps = $appClass->listAllApps(); | |||
@@ -190,6 +203,7 @@ class AppSettingsController extends Controller { | |||
private function getAllApps() { | |||
return $this->allApps; | |||
} | |||
/** | |||
* Get all available apps in a category | |||
* |
@@ -887,6 +887,7 @@ return array( | |||
'OC\\App\\AppStore\\Bundles\\HubBundle' => $baseDir . '/lib/private/App/AppStore/Bundles/HubBundle.php', | |||
'OC\\App\\AppStore\\Bundles\\PublicSectorBundle' => $baseDir . '/lib/private/App/AppStore/Bundles/PublicSectorBundle.php', | |||
'OC\\App\\AppStore\\Bundles\\SocialSharingBundle' => $baseDir . '/lib/private/App/AppStore/Bundles/SocialSharingBundle.php', | |||
'OC\\App\\AppStore\\Fetcher\\AppDiscoverFetcher' => $baseDir . '/lib/private/App/AppStore/Fetcher/AppDiscoverFetcher.php', | |||
'OC\\App\\AppStore\\Fetcher\\AppFetcher' => $baseDir . '/lib/private/App/AppStore/Fetcher/AppFetcher.php', | |||
'OC\\App\\AppStore\\Fetcher\\CategoryFetcher' => $baseDir . '/lib/private/App/AppStore/Fetcher/CategoryFetcher.php', | |||
'OC\\App\\AppStore\\Fetcher\\Fetcher' => $baseDir . '/lib/private/App/AppStore/Fetcher/Fetcher.php', |
@@ -920,6 +920,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 | |||
'OC\\App\\AppStore\\Bundles\\HubBundle' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Bundles/HubBundle.php', | |||
'OC\\App\\AppStore\\Bundles\\PublicSectorBundle' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Bundles/PublicSectorBundle.php', | |||
'OC\\App\\AppStore\\Bundles\\SocialSharingBundle' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Bundles/SocialSharingBundle.php', | |||
'OC\\App\\AppStore\\Fetcher\\AppDiscoverFetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Fetcher/AppDiscoverFetcher.php', | |||
'OC\\App\\AppStore\\Fetcher\\AppFetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Fetcher/AppFetcher.php', | |||
'OC\\App\\AppStore\\Fetcher\\CategoryFetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Fetcher/CategoryFetcher.php', | |||
'OC\\App\\AppStore\\Fetcher\\Fetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Fetcher/Fetcher.php', |
@@ -0,0 +1,100 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2024 Ferdinand Thiessen <opensource@fthiessen.de> | |||
* | |||
* @author Ferdinand Thiessen <opensource@fthiessen.de> | |||
* | |||
* @license AGPL-3.0-or-later | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
namespace OC\App\AppStore\Fetcher; | |||
use DateTimeImmutable; | |||
use OC\App\CompareVersion; | |||
use OC\Files\AppData\Factory; | |||
use OCP\AppFramework\Utility\ITimeFactory; | |||
use OCP\Http\Client\IClientService; | |||
use OCP\IConfig; | |||
use OCP\Support\Subscription\IRegistry; | |||
use Psr\Log\LoggerInterface; | |||
class AppDiscoverFetcher extends Fetcher { | |||
public const INVALIDATE_AFTER_SECONDS = 86400; | |||
public function __construct( | |||
Factory $appDataFactory, | |||
IClientService $clientService, | |||
ITimeFactory $timeFactory, | |||
IConfig $config, | |||
LoggerInterface $logger, | |||
IRegistry $registry, | |||
private CompareVersion $compareVersion, | |||
) { | |||
parent::__construct( | |||
$appDataFactory, | |||
$clientService, | |||
$timeFactory, | |||
$config, | |||
$logger, | |||
$registry | |||
); | |||
$this->fileName = 'discover.json'; | |||
$this->endpointName = 'discover.json'; | |||
} | |||
/** | |||
* Get the app discover section entries | |||
* | |||
* @param bool $allowUnstable Include also expired and upcoming entries | |||
*/ | |||
public function get($allowUnstable = false) { | |||
$entries = parent::get(false); | |||
if (!$allowUnstable) { | |||
$now = new DateTimeImmutable(); | |||
// Remove expired or future entries | |||
return array_filter($entries, function (array $entry) use ($now) { | |||
try { | |||
$date = new DateTimeImmutable($entry['date'] ?? ''); | |||
if ($date > $now) { | |||
return false; | |||
} | |||
} catch (\Throwable $e) { | |||
// Invalid date format | |||
return false; | |||
} | |||
try { | |||
$expiryDate = new DateTimeImmutable($entry['expiryDate'] ?? ''); | |||
if ($expiryDate < $now) { | |||
return false; | |||
} | |||
} catch (\Throwable $e) { | |||
// Invalid expiryDate format | |||
return false; | |||
} | |||
return true; | |||
}); | |||
} | |||
return $entries; | |||
} | |||
} |
@@ -133,7 +133,7 @@ abstract class Fetcher { | |||
} | |||
/** | |||
* Returns the array with the categories on the appstore server | |||
* Returns the array with the entries on the appstore server | |||
* | |||
* @param bool [$allowUnstable] Allow unstable releases | |||
* @return array |