AddTeamMember.php 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. namespace App\Actions\Jetstream;
  3. use Illuminate\Support\Facades\Gate;
  4. use Illuminate\Support\Facades\Validator;
  5. use Laravel\Jetstream\Contracts\AddsTeamMembers;
  6. use Laravel\Jetstream\Events\AddingTeamMember;
  7. use Laravel\Jetstream\Events\TeamMemberAdded;
  8. use Laravel\Jetstream\Jetstream;
  9. use Laravel\Jetstream\Rules\Role;
  10. class AddTeamMember implements AddsTeamMembers
  11. {
  12. /**
  13. * Add a new team member to the given team.
  14. *
  15. * @param mixed $user
  16. * @param mixed $team
  17. * @param string $email
  18. * @param string|null $role
  19. * @return void
  20. */
  21. public function add($user, $team, string $email, string $role = null)
  22. {
  23. Gate::forUser($user)->authorize('addTeamMember', $team);
  24. $this->validate($team, $email, $role);
  25. $newTeamMember = Jetstream::findUserByEmailOrFail($email);
  26. AddingTeamMember::dispatch($team, $newTeamMember);
  27. $team->users()->attach(
  28. $newTeamMember, ['role' => $role]
  29. );
  30. TeamMemberAdded::dispatch($team, $newTeamMember);
  31. }
  32. /**
  33. * Validate the add member operation.
  34. *
  35. * @param mixed $team
  36. * @param string $email
  37. * @param string|null $role
  38. * @return void
  39. */
  40. protected function validate($team, string $email, ?string $role)
  41. {
  42. Validator::make([
  43. 'email' => $email,
  44. 'role' => $role,
  45. ], $this->rules(), [
  46. 'email.exists' => __('We were unable to find a registered user with this email address.'),
  47. ])->after(
  48. $this->ensureUserIsNotAlreadyOnTeam($team, $email)
  49. )->validateWithBag('addTeamMember');
  50. }
  51. /**
  52. * Get the validation rules for adding a team member.
  53. *
  54. * @return array
  55. */
  56. protected function rules()
  57. {
  58. return array_filter([
  59. 'email' => ['required', 'email', 'exists:users'],
  60. 'role' => Jetstream::hasRoles()
  61. ? ['required', 'string', new Role]
  62. : null,
  63. ]);
  64. }
  65. /**
  66. * Ensure that the user is not already on the team.
  67. *
  68. * @param mixed $team
  69. * @param string $email
  70. * @return \Closure
  71. */
  72. protected function ensureUserIsNotAlreadyOnTeam($team, string $email)
  73. {
  74. return function ($validator) use ($team, $email) {
  75. $validator->errors()->addIf(
  76. $team->hasUserWithEmail($email),
  77. 'email',
  78. __('This user already belongs to the team.')
  79. );
  80. };
  81. }
  82. }