Skip to content

Commit 16657ef

Browse files
PLUG-129: check installed version of plugin (#38)
* check for new version on admin page load * Update view/adminhtml/templates/system/config/button/version.phtml Co-authored-by: Stefan Danaita <[email protected]> * add more detail to error messages --------- Co-authored-by: Stefan Danaita <[email protected]>
1 parent 6a2ea8e commit 16657ef

File tree

3 files changed

+107
-10
lines changed

3 files changed

+107
-10
lines changed

Block/Adminhtml/System/Config/Button/VersionCheck.php

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77

88
namespace TrueLayer\Connect\Block\Adminhtml\System\Config\Button;
99

10-
use TrueLayer\Connect\Api\Config\RepositoryInterface as ConfigRepository;
1110
use Magento\Backend\Block\Template\Context;
1211
use Magento\Config\Block\System\Config\Form\Field;
1312
use Magento\Framework\Data\Form\Element\AbstractElement;
13+
use Magento\Framework\HTTP\Client\Curl;
14+
use TrueLayer\Connect\Api\Config\RepositoryInterface as ConfigRepository;
15+
use TrueLayer\Connect\Api\Log\LogServiceInterface;
1416

1517
/**
1618
* Version check class
@@ -22,10 +24,6 @@ class VersionCheck extends Field
2224
* @var string
2325
*/
2426
protected $_template = 'TrueLayer_Connect::system/config/button/version.phtml';
25-
/**
26-
* @var ConfigRepository
27-
*/
28-
private $configRepository;
2927

3028
/**
3129
* VersionCheck constructor.
@@ -35,10 +33,11 @@ class VersionCheck extends Field
3533
*/
3634
public function __construct(
3735
Context $context,
38-
ConfigRepository $configRepository,
36+
private ConfigRepository $configRepository,
37+
private Curl $curl,
38+
private LogServiceInterface $logger,
3939
array $data = []
4040
) {
41-
$this->configRepository = $configRepository;
4241
parent::__construct($context, $data);
4342
}
4443

@@ -66,6 +65,56 @@ public function _getElementHtml(AbstractElement $element): string
6665
*/
6766
public function getVersion(): string
6867
{
69-
return 'v' . $this->configRepository->getExtensionVersion();
68+
return $this->configRepository->getExtensionVersion();
69+
}
70+
71+
public function getLatestVersion()
72+
{
73+
$curlVersion = $this->getCurlVersion();
74+
$this->curl->addHeader('Accept', 'application/vnd.github+json');
75+
$this->curl->addHeader('User-Agent', 'curl/'.$curlVersion);
76+
$this->curl->setOption(CURLOPT_RETURNTRANSFER, true);
77+
$this->curl->get('https://api.github.com/repos/TrueLayer/magento2/releases');
78+
$responseStatus = $this->curl->getStatus();
79+
if ($responseStatus !== 200) {
80+
$this->logger->error('Plugin version check failed, could not retrieve releases from github api', [
81+
'response_status' => $responseStatus,
82+
'response_body' => $this->curl->getBody()
83+
]);
84+
return false;
85+
}
86+
$response = $this->curl->getBody();
87+
try {
88+
$releases = json_decode($response, true, JSON_THROW_ON_ERROR);
89+
} catch (\Exception $e) {
90+
$this->logger->error('Plugin version check failed, json_decode error', [
91+
'response_body' => $response,
92+
'json_exception' => $e->getMessage()
93+
]);
94+
return false;
95+
}
96+
foreach ($releases as $release) {
97+
if (!$release['draft'] && !$release['prerelease']) {
98+
$latestRelease = $release;
99+
break;
100+
}
101+
}
102+
if (!isset($latestRelease)) {
103+
$this->logger->error('Plugin version check failed, no valid release in github api response');
104+
return false;
105+
}
106+
$latestVersion = ltrim($latestRelease['name'], 'v');
107+
return $latestVersion;
108+
}
109+
110+
private function getCurlVersion()
111+
{
112+
$curlVersion = curl_version();
113+
if (is_array($curlVersion) && array_key_exists('version', $curlVersion)) {
114+
$curlVersion = $curlVersion['version'];
115+
} else {
116+
$curlVersion = 'unknown';
117+
}
118+
return $curlVersion;
70119
}
71120
}

view/adminhtml/templates/system/config/button/version.phtml

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,29 @@ use TrueLayer\Connect\Block\Adminhtml\System\Config\Button\VersionCheck;
1010
* @see \TrueLayer\Connect\Block\Adminhtml\System\Config\Button\VersionCheck
1111
* @var VersionCheck $block
1212
*/
13+
$currentVersion = $block->getVersion();
14+
$latestVersion = $block->getLatestVersion();
15+
$upToDate = !$latestVersion || version_compare($currentVersion, $latestVersion, '>=');
1316
?>
14-
<div class="mm-ui-result_version-wrapper">
15-
<span><?= $block->escapeHtml($block->getVersion()); ?></span>
17+
18+
<div class="mm-ui-result_version-wrapper" data-bind="scope:'truelayer-plugin-version'">
19+
<span id="truelayer-installed-version" data-bind="text: `v${getCurrentVersion()}`"></span>
20+
<span id="truelayer-latest-version" data-bind="visible: !isUpToDate(), text: ` - A new version is available: v${getLatestVersion()}`"></span>
1621
</div>
22+
23+
<script type="text/x-magento-init">
24+
{
25+
".mm-ui-result_version-wrapper": {
26+
"Magento_Ui/js/core/app": {
27+
"components": {
28+
"truelayer-plugin-version": {
29+
"component": "TrueLayer_Connect/js/version",
30+
"currentVersion": "<?= $currentVersion ?>",
31+
"latestVersion": "<?= $latestVersion ?>",
32+
"upToDate": "<?= $upToDate ?>"
33+
}
34+
}
35+
}
36+
}
37+
}
38+
</script>

view/adminhtml/web/js/version.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Copyright © TrueLayer Ltd, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
define([
7+
'uiComponent',
8+
], function (Component) {
9+
'use strict';
10+
11+
return Component.extend({
12+
initialize() {
13+
this._super();
14+
},
15+
16+
getCurrentVersion() {
17+
return this.currentVersion;
18+
},
19+
getLatestVersion() {
20+
return this.latestVersion;
21+
},
22+
isUpToDate() {
23+
return this.upToDate;
24+
}
25+
});
26+
});

0 commit comments

Comments
 (0)