From 4d12e6b58b73fe3cd9775876097219f4fe7f0571 Mon Sep 17 00:00:00 2001 From: James Cole Date: Tue, 23 Aug 2022 05:43:40 +0200 Subject: [PATCH] New migration command. --- .../Commands/Correction/CorrectDatabase.php | 1 + .../Integrity/UpdateGroupInformation.php | 109 ++++++++++++++++++ .../Commands/Upgrade/UpgradeDatabase.php | 1 + .../Controllers/System/InstallController.php | 1 + composer.json | 1 + .../2022_08_21_104626_add_user_groups.php | 46 ++++++++ 6 files changed, 159 insertions(+) create mode 100644 app/Console/Commands/Integrity/UpdateGroupInformation.php create mode 100644 database/migrations/2022_08_21_104626_add_user_groups.php diff --git a/app/Console/Commands/Correction/CorrectDatabase.php b/app/Console/Commands/Correction/CorrectDatabase.php index 02059baadf..e089e5268f 100644 --- a/app/Console/Commands/Correction/CorrectDatabase.php +++ b/app/Console/Commands/Correction/CorrectDatabase.php @@ -76,6 +76,7 @@ class CorrectDatabase extends Command 'firefly-iii:fix-long-descriptions', 'firefly-iii:fix-recurring-transactions', 'firefly-iii:restore-oauth-keys', + 'firefly-iii:upgrade-group-information', 'firefly-iii:fix-transaction-types', 'firefly-iii:fix-frontpage-accounts', ]; diff --git a/app/Console/Commands/Integrity/UpdateGroupInformation.php b/app/Console/Commands/Integrity/UpdateGroupInformation.php new file mode 100644 index 0000000000..4b009a2fd6 --- /dev/null +++ b/app/Console/Commands/Integrity/UpdateGroupInformation.php @@ -0,0 +1,109 @@ +. + */ + +namespace FireflyIII\Console\Commands\Integrity; + +use FireflyIII\Models\Account; +use FireflyIII\Models\Attachment; +use FireflyIII\Models\AvailableBudget; +use FireflyIII\Models\Bill; +use FireflyIII\Models\Budget; +use FireflyIII\Models\Category; +use FireflyIII\Models\CurrencyExchangeRate; +use FireflyIII\Models\Recurrence; +use FireflyIII\Models\Rule; +use FireflyIII\Models\RuleGroup; +use FireflyIII\Models\Tag; +use FireflyIII\Models\TransactionGroup; +use FireflyIII\Models\TransactionJournal; +use FireflyIII\Models\UserGroup; +use FireflyIII\Models\Webhook; +use FireflyIII\User; +use Illuminate\Console\Command; + +/** + * Class UpdateGroupInformation + */ +class UpdateGroupInformation extends Command +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $signature = 'firefly-iii:upgrade-group-information'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Makes sure that every object is linked to a group'; + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + // objects: accounts, attachments, available budgets, bills, budgets, categories, currency_exchange_rates + // recurrences, rule groups, rules, tags, transaction groups, transaction journals, webhooks + + $users = User::get(); + /** @var User $user */ + foreach ($users as $user) { + $this->updateGroupInfo($user); + } + + return 0; + } + + private function updateGroupInfo(User $user): void + { + $group = $user->userGroup; + if (null === $group) { + $this->warn(sprintf('User "%s" has no group.', $user->email)); + return; + } + $set = [Account::class, Attachment::class, AvailableBudget::class, + Bill::class, Budget::class, Category::class, CurrencyExchangeRate::class, + Recurrence::class, RuleGroup::class, Rule::class, Tag::class, TransactionGroup::class, + TransactionJournal::class, Webhook::class]; + foreach ($set as $className) { + $this->updateGroupInfoForObject($user, $group, $className); + } + } + + /** + * @param User $user + * @param UserGroup $group + * @param string $className + * @return void + */ + private function updateGroupInfoForObject(User $user, UserGroup $group, string $className): void + { + $result = $className::where('user_id', $user->id)->where('user_group_id', null)->update(['user_group_id' => $group->id]); + if (0 !== $result) { + $this->line(sprintf('Moved %d %s objects to the correct group.', $result, str_replace('FireflyIII\\Models\\', '', $className))); + } + } +} diff --git a/app/Console/Commands/Upgrade/UpgradeDatabase.php b/app/Console/Commands/Upgrade/UpgradeDatabase.php index 0f4b60f08f..6429fa9311 100644 --- a/app/Console/Commands/Upgrade/UpgradeDatabase.php +++ b/app/Console/Commands/Upgrade/UpgradeDatabase.php @@ -99,6 +99,7 @@ class UpgradeDatabase extends Command 'firefly-iii:fix-transaction-types', 'firefly-iii:fix-frontpage-accounts', 'firefly-iii:fix-ibans', + 'firefly-iii:upgrade-group-information', // two report commands 'firefly-iii:report-empty-objects', diff --git a/app/Http/Controllers/System/InstallController.php b/app/Http/Controllers/System/InstallController.php index 5777c8285e..5fcd7a133e 100644 --- a/app/Http/Controllers/System/InstallController.php +++ b/app/Http/Controllers/System/InstallController.php @@ -110,6 +110,7 @@ class InstallController extends Controller 'firefly-iii:fix-transaction-types' => [], 'firefly-iii:fix-frontpage-accounts' => [], 'firefly-iii:fix-ibans' => [], + 'firefly-iii:upgrade-group-information' => [], // final command to set latest version in DB 'firefly-iii:set-latest-version' => ['--james-is-cool' => true], diff --git a/composer.json b/composer.json index f792d2c07e..b17a1d2119 100644 --- a/composer.json +++ b/composer.json @@ -192,6 +192,7 @@ "@php artisan firefly-iii:report-empty-objects", "@php artisan firefly-iii:report-sum", "@php artisan firefly-iii:restore-oauth-keys", + "@php artisan firefly-iii:upgrade-group-information", "@php artisan firefly-iii:set-latest-version --james-is-cool", "@php artisan firefly:instructions update", "@php artisan firefly-iii:verify-security-alerts", diff --git a/database/migrations/2022_08_21_104626_add_user_groups.php b/database/migrations/2022_08_21_104626_add_user_groups.php new file mode 100644 index 0000000000..7c9636067c --- /dev/null +++ b/database/migrations/2022_08_21_104626_add_user_groups.php @@ -0,0 +1,46 @@ +bigInteger('user_group_id', false, true)->nullable()->after('user_id'); + $table->foreign('user_group_id', 'cer_to_ugi')->references('id')->on('user_groups')->onDelete('set null')->onUpdate('cascade'); + } + } + ); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::table( + 'currency_exchange_rates', function (Blueprint $table) { + + $table->dropForeign('cer_to_ugi'); + if (Schema::hasColumn('currency_exchange_rates', 'user_group_id')) { + $table->dropColumn('user_group_id'); + } + } + ); + } +};