mirror of
https://github.com/nextcloud/server.git
synced 2026-06-13 10:40:40 -04:00
Merge pull request #2307 from nextcloud/better-filter-on-appstore
Loop for newest version in appstore response
This commit is contained in:
commit
cb69accdc5
5 changed files with 1952 additions and 12 deletions
|
|
@ -21,12 +21,16 @@
|
|||
|
||||
namespace OC\App\AppStore\Fetcher;
|
||||
|
||||
use OC\App\AppStore\Version\VersionParser;
|
||||
use OCP\AppFramework\Utility\ITimeFactory;
|
||||
use OCP\Files\IAppData;
|
||||
use OCP\Http\Client\IClientService;
|
||||
use OCP\IConfig;
|
||||
|
||||
class AppFetcher extends Fetcher {
|
||||
/** @var IConfig */
|
||||
private $config;
|
||||
|
||||
/**
|
||||
* @param IAppData $appData
|
||||
* @param IClientService $clientService
|
||||
|
|
@ -44,6 +48,7 @@ class AppFetcher extends Fetcher {
|
|||
);
|
||||
|
||||
$this->fileName = 'apps.json';
|
||||
$this->config = $config;
|
||||
|
||||
$versionArray = \OC_Util::getVersion();
|
||||
$this->endpointUrl = sprintf(
|
||||
|
|
@ -53,4 +58,66 @@ class AppFetcher extends Fetcher {
|
|||
$versionArray[2]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Only returns the latest compatible app release in the releases array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function fetch() {
|
||||
$client = $this->clientService->newClient();
|
||||
$response = $client->get($this->endpointUrl);
|
||||
$responseJson = [];
|
||||
$responseJson['data'] = json_decode($response->getBody(), true);
|
||||
$responseJson['timestamp'] = $this->timeFactory->getTime();
|
||||
$response = $responseJson;
|
||||
|
||||
$ncVersion = $this->config->getSystemValue('version');
|
||||
$ncMajorVersion = explode('.', $ncVersion)[0];
|
||||
foreach($response['data'] as $dataKey => $app) {
|
||||
$releases = [];
|
||||
|
||||
// Filter all compatible releases
|
||||
foreach($app['releases'] as $release) {
|
||||
// Exclude all nightly releases
|
||||
if($release['isNightly'] === false) {
|
||||
// Exclude all versions not compatible with the current version
|
||||
$versionParser = new VersionParser();
|
||||
$version = $versionParser->getVersion($release['rawPlatformVersionSpec']);
|
||||
|
||||
if(
|
||||
// Major version is bigger or equals to the minimum version of the app
|
||||
version_compare($ncMajorVersion, $version->getMinimumVersion(), '>=')
|
||||
// Major version is smaller or equals to the maximum version of the app
|
||||
&& version_compare($ncMajorVersion, $version->getMaximumVersion(), '<=')) {
|
||||
$releases[] = $release;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get the highest version
|
||||
$versions = [];
|
||||
foreach($releases as $release) {
|
||||
$versions[] = $release['version'];
|
||||
}
|
||||
usort($versions, 'version_compare');
|
||||
$versions = array_reverse($versions);
|
||||
$compatible = false;
|
||||
if(isset($versions[0])) {
|
||||
$highestVersion = $versions[0];
|
||||
foreach ($releases as $release) {
|
||||
if ((string)$release['version'] === (string)$highestVersion) {
|
||||
$compatible = true;
|
||||
$response['data'][$dataKey]['releases'] = [$release];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!$compatible) {
|
||||
unset($response['data'][$dataKey]);
|
||||
}
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,11 +30,11 @@ abstract class Fetcher {
|
|||
const INVALIDATE_AFTER_SECONDS = 300;
|
||||
|
||||
/** @var IAppData */
|
||||
private $appData;
|
||||
protected $appData;
|
||||
/** @var IClientService */
|
||||
private $clientService;
|
||||
protected $clientService;
|
||||
/** @var ITimeFactory */
|
||||
private $timeFactory;
|
||||
protected $timeFactory;
|
||||
/** @var string */
|
||||
protected $fileName;
|
||||
/** @var string */
|
||||
|
|
@ -53,6 +53,20 @@ abstract class Fetcher {
|
|||
$this->timeFactory = $timeFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the response from the server
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function fetch() {
|
||||
$client = $this->clientService->newClient();
|
||||
$response = $client->get($this->endpointUrl);
|
||||
$responseJson = [];
|
||||
$responseJson['data'] = json_decode($response->getBody(), true);
|
||||
$responseJson['timestamp'] = $this->timeFactory->getTime();
|
||||
return $responseJson;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the array with the categories on the appstore server
|
||||
*
|
||||
|
|
@ -77,12 +91,8 @@ abstract class Fetcher {
|
|||
}
|
||||
|
||||
// Refresh the file content
|
||||
$client = $this->clientService->newClient();
|
||||
try {
|
||||
$response = $client->get($this->endpointUrl);
|
||||
$responseJson = [];
|
||||
$responseJson['data'] = json_decode($response->getBody(), true);
|
||||
$responseJson['timestamp'] = $this->timeFactory->getTime();
|
||||
$responseJson = $this->fetch();
|
||||
$file->putContent(json_encode($responseJson));
|
||||
return json_decode($file->getContent(), true)['data'];
|
||||
} catch (\Exception $e) {
|
||||
|
|
|
|||
|
|
@ -273,6 +273,12 @@ class AppSettingsController extends Controller {
|
|||
$apps = array_filter($apps, function ($app) {
|
||||
return $app['active'];
|
||||
});
|
||||
|
||||
foreach($apps as $key => $app) {
|
||||
$newVersion = \OC\Installer::isUpdateAvailable($app['id'], $this->appFetcher);
|
||||
$apps[$key]['update'] = $newVersion;
|
||||
}
|
||||
|
||||
usort($apps, function ($a, $b) {
|
||||
$a = (string)$a['name'];
|
||||
$b = (string)$b['name'];
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -21,7 +21,6 @@
|
|||
|
||||
namespace Test\App\AppStore\Fetcher;
|
||||
|
||||
use OC\App\AppStore\Fetcher\AppFetcher;
|
||||
use OC\App\AppStore\Fetcher\Fetcher;
|
||||
use OCP\AppFramework\Utility\ITimeFactory;
|
||||
use OCP\Files\IAppData;
|
||||
|
|
|
|||
Loading…
Reference in a new issue