81 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Actions\Jetstream;
 | |
| 
 | |
| use App\Models\Team;
 | |
| use App\Models\User;
 | |
| use Closure;
 | |
| use Illuminate\Support\Facades\Gate;
 | |
| use Illuminate\Support\Facades\Validator;
 | |
| use Laravel\Jetstream\Contracts\AddsTeamMembers;
 | |
| use Laravel\Jetstream\Events\AddingTeamMember;
 | |
| use Laravel\Jetstream\Events\TeamMemberAdded;
 | |
| use Laravel\Jetstream\Jetstream;
 | |
| use Laravel\Jetstream\Rules\Role;
 | |
| 
 | |
| class AddTeamMember implements AddsTeamMembers
 | |
| {
 | |
|     /**
 | |
|      * Add a new team member to the given team.
 | |
|      */
 | |
|     public function add(User $user, Team $team, string $email, string $role = null): void
 | |
|     {
 | |
|         Gate::forUser($user)->authorize('addTeamMember', $team);
 | |
| 
 | |
|         $this->validate($team, $email, $role);
 | |
| 
 | |
|         $newTeamMember = Jetstream::findUserByEmailOrFail($email);
 | |
| 
 | |
|         AddingTeamMember::dispatch($team, $newTeamMember);
 | |
| 
 | |
|         $team->users()->attach(
 | |
|             $newTeamMember, ['role' => $role]
 | |
|         );
 | |
| 
 | |
|         TeamMemberAdded::dispatch($team, $newTeamMember);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Validate the add member operation.
 | |
|      */
 | |
|     protected function validate(Team $team, string $email, ?string $role): void
 | |
|     {
 | |
|         Validator::make([
 | |
|             'email' => $email,
 | |
|             'role' => $role,
 | |
|         ], $this->rules(), [
 | |
|             'email.exists' => __('We were unable to find a registered user with this email address.'),
 | |
|         ])->after(
 | |
|             $this->ensureUserIsNotAlreadyOnTeam($team, $email)
 | |
|         )->validateWithBag('addTeamMember');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the validation rules for adding a team member.
 | |
|      *
 | |
|      * @return array<string, \Illuminate\Contracts\Validation\Rule|array|string>
 | |
|      */
 | |
|     protected function rules(): array
 | |
|     {
 | |
|         return array_filter([
 | |
|             'email' => ['required', 'email', 'exists:users'],
 | |
|             'role' => Jetstream::hasRoles()
 | |
|                             ? ['required', 'string', new Role]
 | |
|                             : null,
 | |
|         ]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Ensure that the user is not already on the team.
 | |
|      */
 | |
|     protected function ensureUserIsNotAlreadyOnTeam(Team $team, string $email): Closure
 | |
|     {
 | |
|         return function ($validator) use ($team, $email) {
 | |
|             $validator->errors()->addIf(
 | |
|                 $team->hasUserWithEmail($email),
 | |
|                 'email',
 | |
|                 __('This user already belongs to the team.')
 | |
|             );
 | |
|         };
 | |
|     }
 | |
| }
 | 
