Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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