From f5af460014141006e0d8ca281f19eac81e4cf9ee Mon Sep 17 00:00:00 2001 From: Anichur Rahaman <38912435+anisAronno@users.noreply.github.com> Date: Thu, 26 Sep 2024 16:15:16 +0600 Subject: [PATCH] Add update check and initiate artisan command --- app/Console/Commands/CheckUpdateCommand.php | 59 +++++++++++++++++ .../Commands/UpdateInitiateCommand.php | 65 +++++++++++++++++++ composer.json | 2 +- 3 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 app/Console/Commands/CheckUpdateCommand.php create mode 100644 app/Console/Commands/UpdateInitiateCommand.php diff --git a/app/Console/Commands/CheckUpdateCommand.php b/app/Console/Commands/CheckUpdateCommand.php new file mode 100644 index 0000000..29acc24 --- /dev/null +++ b/app/Console/Commands/CheckUpdateCommand.php @@ -0,0 +1,59 @@ +getCurrentVersion(); + $latestRelease = $this->fetchReleaseData(); + + if (is_null($latestRelease)) { + $this->error('Could not fetch data from GitHub'); + return Command::FAILURE; + } + + $latestVersion = ltrim($latestRelease['tag_name'], 'v'); + $changelog = $latestRelease['body'] ?? 'No changelog available'; + + // Output information + $this->info('Current Version: ' . $currentVersion); + $this->info('Latest Version: ' . $latestVersion); + $this->info('Changelog: ' . $changelog); + + if (version_compare($latestVersion, $currentVersion, '>')) { + $this->alert('Update Available!'); + } else { + $this->alert('Your project is already up to date.'); + } + + return Command::SUCCESS; + } + + private function fetchReleaseData() + { + $repoUrl = 'https://api.github.com/repos/anisAronno/laravel-starter/releases/latest'; + $context = stream_context_create([ + 'http' => ['header' => ['User-Agent: PHP']] + ]); + $response = @file_get_contents($repoUrl, false, $context); + return $response ? json_decode($response, true) : null; + } + + private function getCurrentVersion(): string + { + $composerFile = base_path('composer.json'); + if (File::exists($composerFile)) { + $composerContent = json_decode(File::get($composerFile), true); + return $composerContent['version'] ?? '0.0.0'; + } + return '0.0.0'; + } +} diff --git a/app/Console/Commands/UpdateInitiateCommand.php b/app/Console/Commands/UpdateInitiateCommand.php new file mode 100644 index 0000000..3fa17e4 --- /dev/null +++ b/app/Console/Commands/UpdateInitiateCommand.php @@ -0,0 +1,65 @@ +argument('version'); + + if ($version) { + $this->info("Initiating update for version: $version"); + } else { + $this->info('Initiating update for the latest version.'); + } + + // Check for updates using the UpdaterController's logic + $releaseData = $this->fetchReleaseData($version); + + if (is_null($releaseData) || empty($releaseData['zipball_url'])) { + $this->error('No update available.'); + + return Command::FAILURE; + } + + // Dispatch the update job + UpdateProjectJob::dispatch($releaseData); + + $this->info('Update process has been started.'); + + return Command::SUCCESS; + } + + private function fetchReleaseData(?string $version) + { + // Base URL for GitHub releases + $baseRepoUrl = 'https://api.github.com/repos/anisAronno/laravel-starter/releases'; + + // Determine the URL based on whether a specific version is provided + $repoUrl = $version + ? "{$baseRepoUrl}/tags/v{$version}" // Fetch specific version if provided + : "{$baseRepoUrl}/latest"; // Otherwise, fetch the latest release + + // Make the API request with User-Agent + $context = stream_context_create([ + 'http' => [ + 'header' => [ + 'User-Agent: PHP', + ], + ], + ]); + + $response = @file_get_contents($repoUrl, false, $context); + + return $response !== false ? json_decode($response, true) : null; + } +} diff --git a/composer.json b/composer.json index 288418a..59285ed 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "anisaronno/laravel-starter", "type": "project", - "version": "0.3.2", + "version": "0.3.3", "description": "A perfect laravel starter project for any kind of project.", "keywords": [ "laravel",