From 1b28b082d2212f5b02829ee691b5c013004e6f96 Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Tue, 12 Nov 2019 18:44:49 +0530 Subject: [PATCH] add auto update feature --- app/Events/UpdateFinished.php | 34 ++++++++ app/Http/Controllers/UpdateController.php | 18 +++++ app/Listeners/Updates/Listener.php | 31 ++++++++ app/Listeners/Updates/V10/Version101.php | 28 +++++++ app/Providers/EventServiceProvider.php | 4 +- app/Space/SiteApi.php | 35 ++++++++ app/Space/Updater.php | 97 +++++++++++++++++++++++ routes/api.php | 9 +++ 8 files changed, 254 insertions(+), 2 deletions(-) create mode 100644 app/Events/UpdateFinished.php create mode 100644 app/Http/Controllers/UpdateController.php create mode 100644 app/Listeners/Updates/Listener.php create mode 100644 app/Listeners/Updates/V10/Version101.php create mode 100644 app/Space/SiteApi.php create mode 100644 app/Space/Updater.php diff --git a/app/Events/UpdateFinished.php b/app/Events/UpdateFinished.php new file mode 100644 index 00000000..d9700d93 --- /dev/null +++ b/app/Events/UpdateFinished.php @@ -0,0 +1,34 @@ +alias = $alias; + $this->old = $old; + $this->new = $new; + } +} diff --git a/app/Http/Controllers/UpdateController.php b/app/Http/Controllers/UpdateController.php new file mode 100644 index 00000000..db8a3a55 --- /dev/null +++ b/app/Http/Controllers/UpdateController.php @@ -0,0 +1,18 @@ +alias, $request->installed, $request->version); + + return response()->json($json); + } +} diff --git a/app/Listeners/Updates/Listener.php b/app/Listeners/Updates/Listener.php new file mode 100644 index 00000000..cc63c94b --- /dev/null +++ b/app/Listeners/Updates/Listener.php @@ -0,0 +1,31 @@ +alias != static::ALIAS) { + return false; + } + + // Do not apply to the same or newer versions + if (version_compare($event->old, static::VERSION, '>=')) { + return false; + } + + return true; + } +} diff --git a/app/Listeners/Updates/V10/Version101.php b/app/Listeners/Updates/V10/Version101.php new file mode 100644 index 00000000..6bd9c226 --- /dev/null +++ b/app/Listeners/Updates/V10/Version101.php @@ -0,0 +1,28 @@ +check($event)) { + return; + } + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 94b27038..ea9d4fea 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -13,8 +13,8 @@ class EventServiceProvider extends ServiceProvider * @var array */ protected $listen = [ - 'Laraspace\Events\SomeEvent' => [ - 'Laraspace\Listeners\EventListener', + 'Laraspace\Events\UpdateFinished' => [ + 'Laraspace\Listeners\Updates\V10\Version101', ], Registered::class => [ SendEmailVerificationNotification::class, diff --git a/app/Space/SiteApi.php b/app/Space/SiteApi.php new file mode 100644 index 00000000..6952208b --- /dev/null +++ b/app/Space/SiteApi.php @@ -0,0 +1,35 @@ + false, 'base_uri' => $base]); + + $headers['headers'] = array( + 'Accept' => 'application/json', + 'Referer' => url('/'), + 'crater' => getFullVersion() + ); + + $data['http_errors'] = false; + + $data = array_merge($data, $headers); + + try { + $result = $client->get($url, $data); + } catch (RequestException $e) { + $result = $e; + } + + return $result; + } +} diff --git a/app/Space/Updater.php b/app/Space/Updater.php new file mode 100644 index 00000000..21997506 --- /dev/null +++ b/app/Space/Updater.php @@ -0,0 +1,97 @@ + 50, 'track_redirects' => true]); + + // Exception + if ($response instanceof RequestException) { + return [ + 'success' => false, + 'errors' => 'Download Exception', + 'data' => [ + 'path' => $path + ] + ]; + } + + if ($response && ($response->getStatusCode() == 200)) { + $data = $response->getBody()->getContents(); + } + + // Create temp directory + $path = 'temp-' . md5(mt_rand()); + $path2 = 'temp2-' . md5(mt_rand()); + $temp_path = storage_path('app/temp') . '/' . $path; + $temp_path2 = storage_path('app/temp') . '/' . $path2; + + if (!File::isDirectory($temp_path)) { + File::makeDirectory($temp_path); + File::makeDirectory($temp_path2); + } + + $file = $temp_path . '/upload.zip'; + + // Add content to the Zip file + $uploaded = is_int(file_put_contents($file, $data)) ? true : false; + + if (!$uploaded) { + return false; + } + + // Unzip the file + $zip = new ZipArchive(); + + if ($zip->open($file)) { + $zip->extractTo($temp_path2); + } + + $zip->close(); + + // Delete zip file + File::delete($file); + + if (!File::copyDirectory($temp_path2, base_path())) { + return false; + } + + // Delete temp directory + File::deleteDirectory($temp_path); + File::deleteDirectory($temp_path2); + + Artisan::call('cache:clear'); + + try { + event(new UpdateFinished($alias, $installed, $version)); + + return [ + 'success' => true, + 'errors' => false, + 'data' => [] + ]; + } catch (\Exception $e) { + return [ + 'success' => false, + 'errors' => 'Update error', + 'data' => [] + ]; + } + } +} diff --git a/routes/api.php b/routes/api.php index 4fa230ff..2d1cc49b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -106,6 +106,8 @@ Route::group(['middleware' => 'redirect-if-installed'], function () { 'uses' => 'OnboardingController@companySettings' ]); }); + + // App version // ---------------------------------- @@ -120,6 +122,13 @@ Route::group(['middleware' => 'api'], function () { 'middleware' => 'admin' ], function () { + // Auto update routes + //---------------------------------- + Route::post('/update', [ + 'as' => 'auto.update', + 'uses' => 'UpdateController@update' + ]); + Route::get('/bootstrap', [ 'as' => 'bootstrap', 'uses' => 'UsersController@getBootstrap'