Member update endpoint can now change ownership

This commit is contained in:
Constantin Graf
2024-07-01 16:56:18 +02:00
committed by Gregor Vostrak
parent 264b7c9b8d
commit 3a17ae83ae
16 changed files with 352 additions and 85 deletions

View File

@@ -24,9 +24,12 @@ class DeletionService
{
private UserService $userService;
public function __construct(UserService $userService)
private MemberService $memberService;
public function __construct(UserService $userService, MemberService $memberService)
{
$this->userService = $userService;
$this->memberService = $memberService;
}
public function deleteOrganization(Organization $organization, bool $inTransaction = true, ?User $ignoreUser = null): void
@@ -145,7 +148,7 @@ class DeletionService
if ($member->role === Role::Owner->value) {
$this->deleteOrganization($member->organization, false, $user);
} else {
$this->userService->makeMemberToPlaceholder($member);
$this->memberService->makeMemberToPlaceholder($member);
}
}

View File

@@ -0,0 +1,61 @@
<?php
declare(strict_types=1);
namespace App\Service;
use App\Enums\Role;
use App\Models\Member;
use App\Models\Organization;
use App\Models\User;
use InvalidArgumentException;
class MemberService
{
private UserService $userService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
/**
* Change the ownership of an organization to a new user.
* The previous owner will be demoted to an admin.
*/
public function changeOwnership(Organization $organization, Member $newOwner): void
{
$organization->update([
'user_id' => $newOwner->user_id,
]);
if ($newOwner->organization_id !== $organization->getKey()) {
throw new InvalidArgumentException('Member is not part of the organization');
}
$newOwner->role = Role::Owner->value;
$newOwner->save();
$oldOwners = Member::query()
->whereBelongsTo($organization, 'organization')
->where('role', '=', Role::Owner->value)
->where('id', '!=', $newOwner->getKey())
->get();
foreach ($oldOwners as $oldOwner) {
$oldOwner->role = Role::Admin->value;
$oldOwner->save();
}
}
public function makeMemberToPlaceholder(Member $member): void
{
$user = $member->user;
$placeholderUser = $user->replicate();
$placeholderUser->is_placeholder = true;
$placeholderUser->save();
$member->user()->associate($placeholderUser);
$member->role = Role::Placeholder->value;
$member->save();
$this->userService->assignOrganizationEntitiesToDifferentMember($member->organization, $user, $placeholderUser, $member);
$this->userService->makeSureUserHasAtLeastOneOrganization($user);
}
}

View File

@@ -31,7 +31,7 @@ class UserService
$this->assignOrganizationEntitiesToDifferentMember($organization, $fromUser, $toUser, $toMember);
}
private function assignOrganizationEntitiesToDifferentMember(Organization $organization, User $fromUser, User $toUser, Member $toMember): void
public function assignOrganizationEntitiesToDifferentMember(Organization $organization, User $fromUser, User $toUser, Member $toMember): void
{
// Time entries
TimeEntry::query()
@@ -52,21 +52,6 @@ class UserService
]);
}
public function makeMemberToPlaceholder(Member $member): void
{
$user = $member->user;
$placeholderUser = $user->replicate();
$placeholderUser->is_placeholder = true;
$placeholderUser->save();
$member->user()->associate($placeholderUser);
$member->role = Role::Placeholder->value;
$member->save();
$this->assignOrganizationEntitiesToDifferentMember($member->organization, $user, $placeholderUser, $member);
$this->makeSureUserHasAtLeastOneOrganization($user);
}
public function makeSureUserHasAtLeastOneOrganization(User $user): void
{
if ($user->organizations()->count() > 0) {