Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

InviteCompanyEmployee.php 2.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace App\Actions\FilamentCompanies;
  3. use App\Models\{Company, User};
  4. use Closure;
  5. use Illuminate\Auth\Access\AuthorizationException;
  6. use Illuminate\Database\Query\Builder;
  7. use Illuminate\Support\Facades\{Gate, Mail, Validator};
  8. use Illuminate\Validation\Rule;
  9. use Wallo\FilamentCompanies\Contracts\InvitesCompanyEmployees;
  10. use Wallo\FilamentCompanies\Events\InvitingCompanyEmployee;
  11. use Wallo\FilamentCompanies\FilamentCompanies;
  12. use Wallo\FilamentCompanies\Mail\CompanyInvitation;
  13. use Wallo\FilamentCompanies\Rules\Role;
  14. class InviteCompanyEmployee implements InvitesCompanyEmployees
  15. {
  16. /**
  17. * Invite a new company employee to the given company.
  18. *
  19. * @throws AuthorizationException
  20. */
  21. public function invite(User $user, Company $company, string $email, ?string $role = null): void
  22. {
  23. Gate::forUser($user)->authorize('addCompanyEmployee', $company);
  24. $this->validate($company, $email, $role);
  25. InvitingCompanyEmployee::dispatch($company, $email, $role);
  26. $invitation = $company->companyInvitations()->create([
  27. 'email' => $email,
  28. 'role' => $role,
  29. ]);
  30. Mail::to($email)->send(new CompanyInvitation($invitation));
  31. }
  32. /**
  33. * Validate the invite employee operation.
  34. */
  35. protected function validate(Company $company, string $email, ?string $role): void
  36. {
  37. Validator::make([
  38. 'email' => $email,
  39. 'role' => $role,
  40. ], $this->rules($company), [
  41. 'email.unique' => __('filament-companies::default.errors.employee_already_invited'),
  42. ])->after(
  43. $this->ensureUserIsNotAlreadyOnCompany($company, $email)
  44. )->validateWithBag('addCompanyEmployee');
  45. }
  46. /**
  47. * Get the validation rules for inviting a company employee.
  48. *
  49. * @return array<string, \Illuminate\Contracts\Validation\Rule|array|string>
  50. */
  51. protected function rules(Company $company): array
  52. {
  53. return array_filter([
  54. 'email' => [
  55. 'required', 'email',
  56. Rule::unique('company_invitations')->where(static function (Builder $query) use ($company) {
  57. $query->where('company_id', $company->id);
  58. }),
  59. ],
  60. 'role' => FilamentCompanies::hasRoles()
  61. ? ['required', 'string', new Role]
  62. : null,
  63. ]);
  64. }
  65. /**
  66. * Ensure that the employee is not already on the company.
  67. */
  68. protected function ensureUserIsNotAlreadyOnCompany(Company $company, string $email): Closure
  69. {
  70. return static function ($validator) use ($company, $email) {
  71. $validator->errors()->addIf(
  72. $company->hasUserWithEmail($email),
  73. 'email',
  74. __('filament-companies::default.errors.employee_already_belongs_to_company')
  75. );
  76. };
  77. }
  78. }