142 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Livewire\Team;
 | |
| 
 | |
| use App\Models\Team;
 | |
| use App\Models\User;
 | |
| use Livewire\Component;
 | |
| 
 | |
| class AdminView extends Component
 | |
| {
 | |
|     public $users;
 | |
| 
 | |
|     public ?string $search = '';
 | |
| 
 | |
|     public bool $lots_of_users = false;
 | |
| 
 | |
|     private $number_of_users_to_show = 20;
 | |
| 
 | |
|     public function mount()
 | |
|     {
 | |
|         if (! isInstanceAdmin()) {
 | |
|             return redirect()->route('dashboard');
 | |
|         }
 | |
|         $this->getUsers();
 | |
|     }
 | |
| 
 | |
|     public function submitSearch()
 | |
|     {
 | |
|         if ($this->search !== '') {
 | |
|             $this->users = User::where(function ($query) {
 | |
|                 $query->where('name', 'like', "%{$this->search}%")
 | |
|                     ->orWhere('email', 'like', "%{$this->search}%");
 | |
|             })->get()->filter(function ($user) {
 | |
|                 return $user->id !== auth()->id();
 | |
|             });
 | |
|         } else {
 | |
|             $this->getUsers();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function getUsers()
 | |
|     {
 | |
|         $users = User::where('id', '!=', auth()->id())->get();
 | |
|         if ($users->count() > $this->number_of_users_to_show) {
 | |
|             $this->lots_of_users = true;
 | |
|             $this->users = $users->take($this->number_of_users_to_show);
 | |
|         } else {
 | |
|             $this->lots_of_users = false;
 | |
|             $this->users = $users;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private function finalizeDeletion(User $user, Team $team)
 | |
|     {
 | |
|         $servers = $team->servers;
 | |
|         foreach ($servers as $server) {
 | |
|             $resources = $server->definedResources();
 | |
|             foreach ($resources as $resource) {
 | |
|                 ray('Deleting resource: '.$resource->name);
 | |
|                 $resource->forceDelete();
 | |
|             }
 | |
|             ray('Deleting server: '.$server->name);
 | |
|             $server->forceDelete();
 | |
|         }
 | |
| 
 | |
|         $projects = $team->projects;
 | |
|         foreach ($projects as $project) {
 | |
|             ray('Deleting project: '.$project->name);
 | |
|             $project->forceDelete();
 | |
|         }
 | |
|         $team->members()->detach($user->id);
 | |
|         ray('Deleting team: '.$team->name);
 | |
|         $team->delete();
 | |
|     }
 | |
| 
 | |
|     public function delete($id)
 | |
|     {
 | |
|         if (! auth()->user()->isInstanceAdmin()) {
 | |
|             return $this->dispatch('error', 'You are not authorized to delete users');
 | |
|         }
 | |
|         $user = User::find($id);
 | |
|         $teams = $user->teams;
 | |
|         foreach ($teams as $team) {
 | |
|             ray($team->name);
 | |
|             $user_alone_in_team = $team->members->count() === 1;
 | |
|             if ($team->id === 0) {
 | |
|                 if ($user_alone_in_team) {
 | |
|                     ray('user is alone in the root team, do nothing');
 | |
| 
 | |
|                     return $this->dispatch('error', 'User is alone in the root team, cannot delete');
 | |
|                 }
 | |
|             }
 | |
|             if ($user_alone_in_team) {
 | |
|                 ray('user is alone in the team');
 | |
|                 $this->finalizeDeletion($user, $team);
 | |
| 
 | |
|                 continue;
 | |
|             }
 | |
|             ray('user is not alone in the team');
 | |
|             if ($user->isOwner()) {
 | |
|                 $found_other_owner_or_admin = $team->members->filter(function ($member) {
 | |
|                     return $member->pivot->role === 'owner' || $member->pivot->role === 'admin';
 | |
|                 })->where('id', '!=', $user->id)->first();
 | |
| 
 | |
|                 if ($found_other_owner_or_admin) {
 | |
|                     ray('found other owner or admin');
 | |
|                     $team->members()->detach($user->id);
 | |
| 
 | |
|                     continue;
 | |
|                 } else {
 | |
|                     $found_other_member_who_is_not_owner = $team->members->filter(function ($member) {
 | |
|                         return $member->pivot->role === 'member';
 | |
|                     })->first();
 | |
|                     if ($found_other_member_who_is_not_owner) {
 | |
|                         ray('found other member who is not owner');
 | |
|                         $found_other_member_who_is_not_owner->pivot->role = 'owner';
 | |
|                         $found_other_member_who_is_not_owner->pivot->save();
 | |
|                         $team->members()->detach($user->id);
 | |
|                     } else {
 | |
|                         // This should never happen as if the user is the only member in the team, the team should be deleted already.
 | |
|                         ray('found no other member who is not owner');
 | |
|                         $this->finalizeDeletion($user, $team);
 | |
|                     }
 | |
| 
 | |
|                     continue;
 | |
|                 }
 | |
|             } else {
 | |
|                 ray('user is not owner');
 | |
|                 $team->members()->detach($user->id);
 | |
|             }
 | |
|         }
 | |
|         ray('Deleting user: '.$user->name);
 | |
|         $user->delete();
 | |
|         $this->getUsers();
 | |
|     }
 | |
| 
 | |
|     public function render()
 | |
|     {
 | |
|         return view('livewire.team.admin-view');
 | |
|     }
 | |
| }
 | 
