From 993dfc8fa17c65e5e2954be364add8fcde947ff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=8Carodej?= Date: Tue, 5 Apr 2022 16:43:12 +0200 Subject: [PATCH] updates automatically handled on the background --- .env.testing | 2 +- README.md | 6 ++ public/mix-manifest.json | 2 +- resources/js/views/Admin/Dashboard.vue | 52 ------------ routes/maintenance.php | 7 -- src/App/Console/Kernel.php | 9 ++- src/App/Users/Resources/UserResource.php | 4 +- .../Dashboard/GetDashboardDataController.php | 54 +------------ ...p => DeleteLanguageTranslationsAction.php} | 5 +- .../Actions/UpdateLanguageStringsAction.php | 18 ----- .../UpdateLanguageTranslationsAction.php | 18 +++++ .../Actions/UpgradeDatabaseAction.php | 4 - .../UpgradeTranslationsController.php | 29 ------- .../StorePaymentServiceCredentialsRequest.php | 1 - ...php => DeleteAllDemoSharedLinksAction.php} | 4 +- .../Upgrading/Actions/UpdateSystemAction.php | 80 +++++++++++++++++++ .../UpgradingVersionsController.php} | 63 +++------------ tests/App/Users/UserAccountTest.php | 1 + tests/Domain/Admin/DashboardTest.php | 2 - tests/Domain/Maintenance/AppUpgradeTest.php | 14 +--- tests/Support/Demo/DemoTest.php | 9 +-- 21 files changed, 141 insertions(+), 243 deletions(-) rename src/Domain/Localization/Actions/{DeleteLanguageStringsAction.php => DeleteLanguageTranslationsAction.php} (84%) delete mode 100644 src/Domain/Localization/Actions/UpdateLanguageStringsAction.php create mode 100644 src/Domain/Localization/Actions/UpdateLanguageTranslationsAction.php delete mode 100644 src/Domain/Maintenance/Controllers/UpgradeTranslationsController.php rename src/Support/Demo/Actions/{DeleteAllSharedLinksAction.php => DeleteAllDemoSharedLinksAction.php} (90%) create mode 100644 src/Support/Upgrading/Actions/UpdateSystemAction.php rename src/{Domain/Maintenance/Controllers/UpgradeSystemController.php => Support/Upgrading/Controllers/UpgradingVersionsController.php} (69%) diff --git a/.env.testing b/.env.testing index a7ad9c25..8c705736 100644 --- a/.env.testing +++ b/.env.testing @@ -1,6 +1,6 @@ APP_NAME=Laravel APP_ENV=local -APP_KEY=base64:zJANxvpTkxQwXRdrlTxjTYyFQ0vTv0DZRE7yNtVXmIA= +APP_KEY=base64:qpZihuLxIkDkK3rsQND5Ksv10zVWQ3yih2KiuY6IfXk= APP_DEBUG=true APP_URL=http://localhost APP_DEMO=false diff --git a/README.md b/README.md index e0086d82..226316d9 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ - [Installation](#installation) - [Nginx Configuration](#nginx-configuration) - [Apache Configuration](#apache-configuration) +- [Updating Application](#updating-application) - [Developers](#developers) - [Running Environment On Your Localhost](#running-environment-on-your-localhost) - [Express Installation](#express-installation) @@ -163,6 +164,11 @@ Make sure you have enabled mod_rewrite. There is an example config for running V ``` +# Updating Application +1. Replace all files where the app is located except `/storage` folder and `.env` file. +2. Clear the application cache (Admin / Settings / Application). +3. In 5 minutes the app update stuff automatically on the background if needed. + # Developers ## Running Environment On Your Localhost diff --git a/public/mix-manifest.json b/public/mix-manifest.json index dc01a6cc..4e0eb408 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -16,7 +16,7 @@ "/chunks/not-found.js": "/chunks/not-found.js?id=9f6ce23ce5d969f1", "/chunks/temporary-unavailable.js": "/chunks/temporary-unavailable.js?id=f564565faa09d6d6", "/chunks/admin.js": "/chunks/admin.js?id=8032540fddb832c5", - "/chunks/dashboard.js": "/chunks/dashboard.js?id=fd1d266e493a79a8", + "/chunks/dashboard.js": "/chunks/dashboard.js?id=a41b0f486b1f8d36", "/chunks/invoices.js": "/chunks/invoices.js?id=1416cbf6d1a593ac", "/chunks/subscriptions.js": "/chunks/subscriptions.js?id=5bf6704f5b599f36", "/chunks/pages.js": "/chunks/pages.js?id=c8380d571e91e8be", diff --git a/resources/js/views/Admin/Dashboard.vue b/resources/js/views/Admin/Dashboard.vue index c78f4c5e..0fa8b743 100644 --- a/resources/js/views/Admin/Dashboard.vue +++ b/resources/js/views/Admin/Dashboard.vue @@ -53,16 +53,6 @@ - - - There is a new update that needs to upgrade some stuff on your backend. Please click on this box to upgrade. - - - - - We detect new language strings. You should upgrade your translations. After that, you can find new translations at the bottom page of your translations in language editor. Please click on this box. - - As you installed app with metered subscription type, you have to create your plan as soon as possible to prevent new user registration without automatically assigned subscription plan. @@ -218,52 +208,10 @@ export default { }, data() { return { - isUpgradingLanguages: false, - isUpgradingApp: false, isLoading: false, data: undefined, } }, - methods: { - upgradeTranslations() { - this.isUpgradingLanguages = true - - axios.get('/upgrade/translations') - .then(() => { - this.data.app.shouldUpgradeTranslations = false - - events.$emit('toaster', { - type: 'success', - message: this.$t('Your translations was upgraded successfully.'), - }) - }) - .catch(() => { - events.$emit('alert:open', { - title: this.$t('popup_error.title'), - message: this.$t('popup_error.message'), - }) - }) - }, - upgradeSystem() { - this.isUpgradingApp = true - - axios.get('/upgrade/system') - .then(() => { - this.data.app.shouldUpgrade = false - - events.$emit('toaster', { - type: 'success', - message: this.$t('Your app was upgraded successfully.'), - }) - }) - .catch(() => { - events.$emit('alert:open', { - title: this.$t('popup_error.title'), - message: this.$t('popup_error.message'), - }) - }) - } - }, created() { axios .get('/api/admin/dashboard') diff --git a/routes/maintenance.php b/routes/maintenance.php index 9dc4a36e..8004ab90 100644 --- a/routes/maintenance.php +++ b/routes/maintenance.php @@ -1,15 +1,8 @@ ['auth:sanctum']], function () { Route::get('/down', [MaintenanceModeController::class, 'down']); Route::get('/up', [MaintenanceModeController::class, 'up']); - - Route::group(['prefix' => 'upgrade'], function () { - Route::get('/translations', UpgradeTranslationsController::class); - Route::get('/system', UpgradeSystemController::class); - }); }); diff --git a/src/App/Console/Kernel.php b/src/App/Console/Kernel.php index f087d9d9..157c7dd4 100644 --- a/src/App/Console/Kernel.php +++ b/src/App/Console/Kernel.php @@ -5,13 +5,14 @@ use Illuminate\Console\Scheduling\Schedule; use App\Console\Commands\SetupDevEnvironment; use App\Console\Commands\SetupProdEnvironment; use Support\Scheduler\Actions\ReportUsageAction; -use Support\Demo\Actions\DeleteAllSharedLinksAction; +use Support\Demo\Actions\DeleteAllDemoSharedLinksAction; use Support\Scheduler\Actions\DeleteFailedFilesAction; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; use Support\Scheduler\Actions\DeleteUnverifiedUsersAction; use Support\Scheduler\Actions\DeleteExpiredShareLinksAction; use App\Console\Commands\GenerateDemoSubscriptionContentCommand; use Support\Scheduler\Actions\ExpireUnfilledUploadRequestAction; +use Support\Upgrading\Actions\UpdateSystemAction; class Kernel extends ConsoleKernel { @@ -42,7 +43,7 @@ class Kernel extends ConsoleKernel if (is_demo()) { $schedule->call( - fn () => resolve(DeleteAllSharedLinksAction::class)() + fn () => resolve(DeleteAllDemoSharedLinksAction::class)() )->daily()->at('00:00'); } @@ -54,6 +55,10 @@ class Kernel extends ConsoleKernel fn () => resolve(ExpireUnfilledUploadRequestAction::class)() )->hourly(); + $schedule->call( + fn () => resolve(UpdateSystemAction::class)() + )->everyMinute(); + $schedule->call( fn () => resolve(DeleteUnverifiedUsersAction::class)() )->daily()->at('00:05'); diff --git a/src/App/Users/Resources/UserResource.php b/src/App/Users/Resources/UserResource.php index 35c7be7c..408787f3 100644 --- a/src/App/Users/Resources/UserResource.php +++ b/src/App/Users/Resources/UserResource.php @@ -36,9 +36,9 @@ class UserResource extends JsonResource 'avatar' => $this->settings->avatar, 'email' => is_demo() ? obfuscate_email($this->email) : $this->email, 'role' => $this->role, - 'two_factor_authentication' => (bool)$this->two_factor_secret, + 'two_factor_authentication' => (bool) $this->two_factor_secret, 'two_factor_confirmed_at' => $this->two_factor_confirmed_at, - 'socialite_account' => !(bool)$this->password, + 'socialite_account' => ! (bool) $this->password, 'storage' => $this->storage, 'created_at' => format_date($this->created_at, 'd. M. Y'), 'updated_at' => format_date($this->updated_at, 'd. M. Y'), diff --git a/src/Domain/Admin/Controllers/Dashboard/GetDashboardDataController.php b/src/Domain/Admin/Controllers/Dashboard/GetDashboardDataController.php index 966ba64f..5e838729 100644 --- a/src/Domain/Admin/Controllers/Dashboard/GetDashboardDataController.php +++ b/src/Domain/Admin/Controllers/Dashboard/GetDashboardDataController.php @@ -1,27 +1,17 @@ getUpgradeData(); - - // Get translations data - list($originalTranslations, $activeTranslations) = $this->countTranslations(); - // Get bandwidth data list($upload, $download, $uploadTotal, $downloadTotal, $storageUsage) = $this->getDiskData(); @@ -31,7 +21,7 @@ class GetDashboardDataController extends Controller ->where('type', 'charge') ->sum('amount'); - return response([ + return response()->json([ 'users' => [ 'total' => User::count(), 'usersPremiumTotal' => Subscription::count(), @@ -48,8 +38,6 @@ class GetDashboardDataController extends Controller ], ], 'app' => [ - 'shouldUpgrade' => count($shouldUpgrade) > 0, - 'shouldUpgradeTranslations' => $activeTranslations !== $originalTranslations, 'isRunningCron' => isRunningCron(), 'license' => get_settings('license'), 'version' => config('vuefilemanager.version'), @@ -111,40 +99,4 @@ class GetDashboardDataController extends Controller return [$upload, $download, $uploadTotal, $downloadTotal, $storageUsage]; } - - private function countTranslations(): array - { - $default_translations = [ - 'extended' => collect([ - config('language-translations.extended'), - config('language-translations.regular'), - config('custom-language-translations'), - ])->collapse(), - 'regular' => collect([ - config('language-translations.regular'), - config('custom-language-translations'), - ])->collapse(), - ]; - - $originalTranslationCount = count($default_translations[get_settings('license')]); - - $activeTranslationsCount = DB::table('language_translations') - ->where('lang', 'en') - ->count(); - - return [$originalTranslationCount, $activeTranslationsCount]; - } - - private function getUpgradeData(): array - { - // Get already updated versions - $alreadyUpdated = Schema::hasTable('app_updates') - ? AppUpdate::all() - ->pluck('version') - ->toArray() - : []; - - // Get versions which has to be upgraded - return array_diff(config('vuefilemanager.updates'), $alreadyUpdated); - } } diff --git a/src/Domain/Localization/Actions/DeleteLanguageStringsAction.php b/src/Domain/Localization/Actions/DeleteLanguageTranslationsAction.php similarity index 84% rename from src/Domain/Localization/Actions/DeleteLanguageStringsAction.php rename to src/Domain/Localization/Actions/DeleteLanguageTranslationsAction.php index 6b8c9dbc..6ec08745 100644 --- a/src/Domain/Localization/Actions/DeleteLanguageStringsAction.php +++ b/src/Domain/Localization/Actions/DeleteLanguageTranslationsAction.php @@ -1,10 +1,9 @@ whereIn('key', $list) ->delete(); } -} \ No newline at end of file +} diff --git a/src/Domain/Localization/Actions/UpdateLanguageStringsAction.php b/src/Domain/Localization/Actions/UpdateLanguageStringsAction.php deleted file mode 100644 index 1f0af6c9..00000000 --- a/src/Domain/Localization/Actions/UpdateLanguageStringsAction.php +++ /dev/null @@ -1,18 +0,0 @@ -each(fn(...$item) => DB::table('language_translations') - ->where('lang', 'en') - ->where('key', $item[1]) - ->update(['value' => $item[0]]) - ); - } -} \ No newline at end of file diff --git a/src/Domain/Localization/Actions/UpdateLanguageTranslationsAction.php b/src/Domain/Localization/Actions/UpdateLanguageTranslationsAction.php new file mode 100644 index 00000000..bae3d6b0 --- /dev/null +++ b/src/Domain/Localization/Actions/UpdateLanguageTranslationsAction.php @@ -0,0 +1,18 @@ +each( + fn (...$item) => DB::table('language_translations') + ->where('lang', 'en') + ->where('key', $item[1]) + ->update(['value' => $item[0]]) + ); + } +} diff --git a/src/Domain/Maintenance/Actions/UpgradeDatabaseAction.php b/src/Domain/Maintenance/Actions/UpgradeDatabaseAction.php index 9e871d5c..523a11a8 100644 --- a/src/Domain/Maintenance/Actions/UpgradeDatabaseAction.php +++ b/src/Domain/Maintenance/Actions/UpgradeDatabaseAction.php @@ -1,16 +1,12 @@ true, ]); diff --git a/src/Domain/Maintenance/Controllers/UpgradeTranslationsController.php b/src/Domain/Maintenance/Controllers/UpgradeTranslationsController.php deleted file mode 100644 index 5f5937a4..00000000 --- a/src/Domain/Maintenance/Controllers/UpgradeTranslationsController.php +++ /dev/null @@ -1,29 +0,0 @@ -upgradeLanguageTranslations)(); - - return response('Done.', 201); - } -} diff --git a/src/Domain/Settings/Requests/StorePaymentServiceCredentialsRequest.php b/src/Domain/Settings/Requests/StorePaymentServiceCredentialsRequest.php index 4fdfe4f0..26086a4c 100644 --- a/src/Domain/Settings/Requests/StorePaymentServiceCredentialsRequest.php +++ b/src/Domain/Settings/Requests/StorePaymentServiceCredentialsRequest.php @@ -1,5 +1,4 @@ shouldUpdateTranslations()) { + resolve(UpgradeLanguageTranslationsAction::class)(); + } + + // Check if there are some version to upgrade + $shouldUpgradeSystem = $this->shouldUpgradeSystem(); + + // Upgrade the app + if (! empty($shouldUpgradeSystem)) { + foreach ($shouldUpgradeSystem as $version) { + // Get method name + $method = "upgrade_to_$version"; + + if (method_exists($this, $method)) { + // Run update + $this->{$method}(); + + // Store update record + AppUpdate::create(['version' => $version]); + } + } + + // Clear config + Artisan::call('config:clear'); + } + } + + private function shouldUpgradeSystem(): array + { + // Get already updated versions + $alreadyUpdated = Schema::hasTable('app_updates') + ? AppUpdate::all() + ->pluck('version') + ->toArray() + : []; + + // Get versions which has to be upgraded + return array_diff(config('vuefilemanager.updates'), $alreadyUpdated); + } + + private function shouldUpdateTranslations(): bool + { + $default_translations = [ + 'extended' => collect([ + config('language-translations.extended'), + config('language-translations.regular'), + config('custom-language-translations'), + ])->collapse(), + 'regular' => collect([ + config('language-translations.regular'), + config('custom-language-translations'), + ])->collapse(), + ]; + + $originalTranslationCount = count($default_translations[get_settings('license')]); + + $activeTranslationsCount = DB::table('language_translations') + ->where('lang', 'en') + ->count(); + + return $activeTranslationsCount !== $originalTranslationCount; + } +} diff --git a/src/Domain/Maintenance/Controllers/UpgradeSystemController.php b/src/Support/Upgrading/Controllers/UpgradingVersionsController.php similarity index 69% rename from src/Domain/Maintenance/Controllers/UpgradeSystemController.php rename to src/Support/Upgrading/Controllers/UpgradingVersionsController.php index e5bc10a5..f531110c 100644 --- a/src/Domain/Maintenance/Controllers/UpgradeSystemController.php +++ b/src/Support/Upgrading/Controllers/UpgradingVersionsController.php @@ -1,69 +1,28 @@ pluck('version') - ->toArray() - : []; - - // Get versions which has to be upgraded - $needToUpgrade = array_diff(config('vuefilemanager.updates'), $alreadyUpdated); - - // Iterate and upgrade - foreach ($needToUpgrade as $version) { - // Get method name - $method = "upgrade_to_$version"; - - if (method_exists($this, $method)) { - // Run update - $this->{$method}($request); - - // Store update record - AppUpdate::create(['version' => $version]); - - return response('Done', 201); - } - } - - return response('Whooops, something went wrong!', 500); - } - - private function upgrade_to_2_0_10(): void + public function upgrade_to_2_0_10(): void { ($this->upgradeDatabase)(); @@ -131,7 +90,7 @@ class UpgradeSystemController extends Controller ])); } - private function upgrade_to_2_0_13(): void + public function upgrade_to_2_0_13(): void { // Force plan synchronization if (get_settings('license') === 'extended' && Plan::count() !== 0) { @@ -139,7 +98,7 @@ class UpgradeSystemController extends Controller } } - private function upgrade_to_2_0_14(): void + public function upgrade_to_2_0_14(): void { ($this->upgradeDatabase)(); @@ -148,7 +107,7 @@ class UpgradeSystemController extends Controller ->each(fn ($user) => $user->forceFill(['two_factor_confirmed_at' => now()])->save()); ($this->deleteLanguageStrings)([ - 'popup_2fa.disappear_qr' + 'popup_2fa.disappear_qr', ]); ($this->updateLanguageStrings)([ diff --git a/tests/App/Users/UserAccountTest.php b/tests/App/Users/UserAccountTest.php index 001d1156..9a40cee0 100644 --- a/tests/App/Users/UserAccountTest.php +++ b/tests/App/Users/UserAccountTest.php @@ -157,6 +157,7 @@ class UserAccountTest extends TestCase 'role' => $user->role, 'socialite_account' => false, 'two_factor_authentication' => false, + 'two_factor_confirmed_at' => null, 'storage' => [ 'used' => 0, 'used_formatted' => '0%', diff --git a/tests/Domain/Admin/DashboardTest.php b/tests/Domain/Admin/DashboardTest.php index c09f2c5e..5b340bcf 100644 --- a/tests/Domain/Admin/DashboardTest.php +++ b/tests/Domain/Admin/DashboardTest.php @@ -25,8 +25,6 @@ class DashboardTest extends TestCase ->assertStatus(200) ->assertJsonFragment([ 'app' => [ - 'shouldUpgrade' => true, - 'shouldUpgradeTranslations' => true, 'earnings' => '$0.00', 'isRunningCron' => false, 'license' => 'extended', diff --git a/tests/Domain/Maintenance/AppUpgradeTest.php b/tests/Domain/Maintenance/AppUpgradeTest.php index 58ba24a6..0d5c3cb9 100644 --- a/tests/Domain/Maintenance/AppUpgradeTest.php +++ b/tests/Domain/Maintenance/AppUpgradeTest.php @@ -5,6 +5,7 @@ use DB; use Tests\TestCase; use App\Users\Models\User; use Illuminate\Support\Str; +use Support\Upgrading\Actions\UpdateSystemAction; class AppUpgradeTest extends TestCase { @@ -39,10 +40,7 @@ class AppUpgradeTest extends TestCase ]); }); - $this - ->actingAs($user) - ->get('/upgrade/translations') - ->assertStatus(201); + resolve(UpdateSystemAction::class)(); collect(['en', 'sk']) ->map(function ($locale) { @@ -65,13 +63,7 @@ class AppUpgradeTest extends TestCase */ public function it_upgrade_app() { - $user = User::factory() - ->create(['role' => 'admin']); - - $this - ->actingAs($user) - ->get('/upgrade/system') - ->assertStatus(201); + resolve(UpdateSystemAction::class)(); $this->assertDatabaseHas('app_updates', [ 'version' => '2_0_10', diff --git a/tests/Support/Demo/DemoTest.php b/tests/Support/Demo/DemoTest.php index 963b8329..ffc80e37 100644 --- a/tests/Support/Demo/DemoTest.php +++ b/tests/Support/Demo/DemoTest.php @@ -1,11 +1,10 @@ create(['user_id' => $howdy->id]); - resolve(DeleteAllSharedLinksAction::class)(); + resolve(DeleteAllDemoSharedLinksAction::class)(); $this->assertDatabaseHas('shares', [ 'user_id' => $user->id, @@ -38,4 +37,4 @@ class DemoTest extends TestCase 'user_id' => $howdy->id, ]); } -} \ No newline at end of file +}