+ if (isset($update->downloads->downloadurl))
+ {
+ $downloadUrl = (string) $update->downloads->downloadurl;
+ }
+ }
+
+ if ($bestVersion === '0.0.0')
+ {
+ return [];
+ }
+
+ return [
+ 'version' => $bestVersion,
+ 'download_url' => $downloadUrl,
+ ];
+ }
+
+ /**
+ * Get installed versions of catalog extensions.
+ *
+ * @param array $catalog The parsed catalog entries
*
* @return array element => version
*/
- private function getInstalledVersions(): array
+ private function getInstalledVersions(array $catalog): array
{
+ if (empty($catalog))
+ {
+ return [];
+ }
+
$db = $this->getDatabase();
$elements = [];
- foreach (self::CATALOG as $meta)
+ foreach ($catalog as $entry)
{
- $elements[] = $db->quote($meta['element']);
+ $elements[] = $db->quote($entry['element']);
}
$query = $db->getQuery(true)
@@ -244,61 +299,12 @@ class ExtensionsModel extends BaseDatabaseModel
return $versions;
}
- /**
- * Fetch the latest release from Gitea for a repo.
- *
- * @param string $repo Repository name.
- *
- * @return array [version, download_url] or empty.
- */
- private function fetchLatestRelease(string $repo): array
- {
- $url = self::GITEA_URL . '/api/v1/repos/' . self::GITEA_ORG . '/' . $repo . '/releases?limit=1';
-
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_TIMEOUT, 10);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: application/json']);
- $response = curl_exec($ch);
- $code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
- curl_close($ch);
-
- if ($code !== 200 || empty($response))
- {
- return [];
- }
-
- $releases = json_decode($response, true);
-
- if (empty($releases[0]))
- {
- return [];
- }
-
- $release = $releases[0];
- $version = $release['tag_name'] ?? '';
-
- // Find the first .zip asset
- $downloadUrl = '';
-
- foreach ($release['assets'] ?? [] as $asset)
- {
- if (str_ends_with(strtolower($asset['name'] ?? ''), '.zip'))
- {
- $downloadUrl = $asset['browser_download_url'] ?? '';
- break;
- }
- }
-
- return [
- 'version' => $version,
- 'download_url' => $downloadUrl,
- ];
- }
-
/**
* Get the extension_id for an element (for uninstall links).
+ *
+ * @param string $element Extension element name
+ *
+ * @return int
*/
private function getExtensionId(string $element): int
{
diff --git a/src/packages/com_mokowaas/admin/tmpl/extensions/default.php b/src/packages/com_mokowaas/admin/tmpl/extensions/default.php
index e5a14684..4ffca746 100644
--- a/src/packages/com_mokowaas/admin/tmpl/extensions/default.php
+++ b/src/packages/com_mokowaas/admin/tmpl/extensions/default.php
@@ -25,8 +25,9 @@ foreach ($packages as $pkg)
}
$statusBadge = [
- 'installed' => ['bg-success', 'Installed'],
- 'not_installed' => ['bg-secondary', 'Not Installed'],
+ 'installed' => ['bg-success', 'Installed'],
+ 'update_available' => ['bg-warning text-dark', 'Update Available'],
+ 'not_installed' => ['bg-secondary', 'Not Installed'],
];
?>
@@ -63,6 +64,9 @@ $statusBadge = [
local_version): ?>
vlocal_version); ?>
+ remote_version && $pkg->status === 'update_available'): ?>
+ → remote_version); ?>
+
remote_version): ?>
Latest: remote_version); ?>
@@ -73,7 +77,16 @@ $statusBadge = [
- download_url && $pkg->status === 'not_installed'): ?>
+ download_url && $pkg->status === 'update_available'): ?>
+
+ download_url && $pkg->status === 'not_installed'): ?>