From 80f410835b066585a32c7e2a6654d2c8c705f096 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 1 Apr 2024 14:04:22 +0200 Subject: [PATCH] Expand models, user groups need more properties. --- .../Integrity/CreateGroupMemberships.php | 37 ++++++++++--------- app/Models/Account.php | 1 + app/Models/InvitedUser.php | 2 + app/Models/Preference.php | 2 + app/Models/RecurrenceTransaction.php | 1 + app/Models/UserGroup.php | 2 +- app/Repositories/User/UserRepository.php | 24 ++++++++++++ .../User/UserRepositoryInterface.php | 2 + ...01_131611_update_user_group_properties.php | 10 ++--- 9 files changed, 57 insertions(+), 24 deletions(-) diff --git a/app/Console/Commands/Integrity/CreateGroupMemberships.php b/app/Console/Commands/Integrity/CreateGroupMemberships.php index 2bfb099912..8437488207 100644 --- a/app/Console/Commands/Integrity/CreateGroupMemberships.php +++ b/app/Console/Commands/Integrity/CreateGroupMemberships.php @@ -43,9 +43,8 @@ class CreateGroupMemberships extends Command use ShowsFriendlyMessages; public const string CONFIG_NAME = '560_create_group_memberships'; - protected $description = 'Update group memberships'; - protected $signature = 'firefly-iii:create-group-memberships'; - + protected $description = 'Update group memberships'; + protected $signature = 'firefly-iii:create-group-memberships'; /** * Execute the console command. @@ -82,19 +81,20 @@ class CreateGroupMemberships extends Command public static function createGroupMembership(User $user): void { // check if membership exists - $userGroup = UserGroup::where('title', $user->email)->first(); + $userGroup = UserGroup::where('title', $user->email)->first(); if (null === $userGroup) { $userGroup = UserGroup::create(['title' => $user->email, 'default_administration' => true]); } - $userRole = UserRole::where('title', UserRoleEnum::OWNER->value)->first(); + $userRole = UserRole::where('title', UserRoleEnum::OWNER->value)->first(); if (null === $userRole) { throw new FireflyException('Firefly III could not find a user role. Please make sure all migrations have run.'); } $membership = GroupMembership::where('user_id', $user->id) - ->where('user_group_id', $userGroup->id) - ->where('user_role_id', $userRole->id)->first(); + ->where('user_group_id', $userGroup->id) + ->where('user_role_id', $userRole->id)->first() + ; if (null === $membership) { GroupMembership::create( [ @@ -126,15 +126,17 @@ class CreateGroupMemberships extends Command private function setDefaultGroup(User $user): void { Log::debug(sprintf('setDefaultGroup() for #%d "%s"', $user->id, $user->email)); + /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); $groups = $repository->getUserGroups($user); - if(1 === $groups->count()) { + if (1 === $groups->count()) { /** @var UserGroup $first */ - $first = $groups->first(); + $first = $groups->first(); $first->default_administration = true; $first->save(); Log::debug(sprintf('User has only one group (#%d, "%s"), make it the default (owner or not).', $first->id, $first->title)); + return; } Log::debug(sprintf('User has %d groups.', $groups->count())); @@ -145,28 +147,30 @@ class CreateGroupMemberships extends Command */ /** @var UserGroup $group */ - foreach($groups as $group) { + foreach ($groups as $group) { $group->default_administration = false; $group->save(); - if($group->title === $user->email) { - $roles = $repository->getRolesInGroup($user, $group->id); + if ($group->title === $user->email) { + $roles = $repository->getRolesInGroup($user, $group->id); Log::debug(sprintf('Group #%d ("%s")', $group->id, $group->title), $roles); $isOwner = false; - foreach($roles as $role) { - if($role === UserRoleEnum::OWNER->value) { + foreach ($roles as $role) { + if ($role === UserRoleEnum::OWNER->value) { $isOwner = true; } } - if(true === $isOwner) { + if (true === $isOwner) { // make this group the default, set the rest NOT to be the default: $group->default_administration = true; $group->save(); Log::debug(sprintf('Make group #%d ("%s") the default (is owner + name matches).', $group->id, $group->title)); + return; } - if(false === $isOwner) { + if (false === $isOwner) { $this->friendlyWarning(sprintf('User "%s" has a group with matching name (#%d), but is not the owner. User will be given the owner role.', $user->email, $group->id)); self::createGroupMembership($user); + return; } } @@ -175,5 +179,4 @@ class CreateGroupMemberships extends Command $this->friendlyWarning(sprintf('User "%s" has no group with matching name. Will be created.', $user->email)); self::createGroupMembership($user); } - } diff --git a/app/Models/Account.php b/app/Models/Account.php index e3ff91e3ca..f6182fad25 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -110,6 +110,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @method static EloquentBuilder|Account whereUserGroupId($value) * * @property null|UserGroup $userGroup + * @property mixed $account_id * * @mixin Eloquent */ diff --git a/app/Models/InvitedUser.php b/app/Models/InvitedUser.php index 9e560599b5..583f6b0a20 100644 --- a/app/Models/InvitedUser.php +++ b/app/Models/InvitedUser.php @@ -61,6 +61,8 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @method static Builder|InvitedUser whereUpdatedAt($value) * @method static Builder|InvitedUser whereUserId($value) * + * @property mixed $user_group_id + * * @mixin Eloquent */ class InvitedUser extends Model diff --git a/app/Models/Preference.php b/app/Models/Preference.php index 82758bf0b8..bcf0a2b640 100644 --- a/app/Models/Preference.php +++ b/app/Models/Preference.php @@ -54,6 +54,8 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @method static Builder|Preference whereUpdatedAt($value) * @method static Builder|Preference whereUserId($value) * + * @property mixed $user_group_id + * * @mixin Eloquent */ class Preference extends Model diff --git a/app/Models/RecurrenceTransaction.php b/app/Models/RecurrenceTransaction.php index 0d4364e8c7..d201f679f1 100644 --- a/app/Models/RecurrenceTransaction.php +++ b/app/Models/RecurrenceTransaction.php @@ -81,6 +81,7 @@ use Illuminate\Database\Query\Builder; * @method static \Illuminate\Database\Eloquent\Builder|RecurrenceTransaction whereTransactionTypeId($value) * * @property null|TransactionType $transactionType + * @property mixed $user_id * * @mixin Eloquent */ diff --git a/app/Models/UserGroup.php b/app/Models/UserGroup.php index 34cf18f84e..e24f8c3df5 100644 --- a/app/Models/UserGroup.php +++ b/app/Models/UserGroup.php @@ -98,7 +98,7 @@ class UserGroup extends Model { use ReturnsIntegerIdTrait; - protected $fillable = ['title']; + protected $fillable = ['title', 'default_administration']; /** * Route binder. Converts the key in the URL to the specified object (or throw 404). diff --git a/app/Repositories/User/UserRepository.php b/app/Repositories/User/UserRepository.php index 8cb3b53854..8e368f7503 100644 --- a/app/Repositories/User/UserRepository.php +++ b/app/Repositories/User/UserRepository.php @@ -392,4 +392,28 @@ class UserRepository implements UserRepositoryInterface return null !== $invitee; } + + #[\Override] + public function getUserGroups(User $user): Collection + { + $memberships = $user->groupMemberships()->get(); + $set = []; + $collection = new Collection(); + + /** @var GroupMembership $membership */ + foreach ($memberships as $membership) { + /** @var null|UserGroup $group */ + $group = $membership->userGroup()->first(); + if (null !== $group) { + $groupId = (int)$group->id; + if (in_array($groupId, $set, true)) { + continue; + } + $set[$groupId] = $group; + } + } + $collection->push(...$set); + + return $collection; + } } diff --git a/app/Repositories/User/UserRepositoryInterface.php b/app/Repositories/User/UserRepositoryInterface.php index a76e8d770e..962fcb60f5 100644 --- a/app/Repositories/User/UserRepositoryInterface.php +++ b/app/Repositories/User/UserRepositoryInterface.php @@ -59,6 +59,8 @@ interface UserRepositoryInterface public function changeStatus(User $user, bool $isBlocked, string $code): bool; + public function getUserGroups(User $user): Collection; + /** * Returns a count of all users. */ diff --git a/database/migrations/2024_04_01_131611_update_user_group_properties.php b/database/migrations/2024_04_01_131611_update_user_group_properties.php index 21cc9c39c2..43d4a4b170 100644 --- a/database/migrations/2024_04_01_131611_update_user_group_properties.php +++ b/database/migrations/2024_04_01_131611_update_user_group_properties.php @@ -1,12 +1,13 @@