Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

CreateUserFromProvider.php 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <?php
  2. namespace App\Actions\FilamentCompanies;
  3. use App\Models\Company;
  4. use App\Models\User;
  5. use Illuminate\Support\Facades\DB;
  6. use Laravel\Socialite\Contracts\User as ProviderUserContract;
  7. use Wallo\FilamentCompanies\Contracts\CreatesConnectedAccounts;
  8. use Wallo\FilamentCompanies\Contracts\CreatesUserFromProvider;
  9. use Wallo\FilamentCompanies\Features;
  10. use Wallo\FilamentCompanies\FilamentCompanies;
  11. use Wallo\FilamentCompanies\Socialite;
  12. class CreateUserFromProvider implements CreatesUserFromProvider
  13. {
  14. /**
  15. * The creates connected accounts instance.
  16. */
  17. public CreatesConnectedAccounts $createsConnectedAccounts;
  18. /**
  19. * Create a new action instance.
  20. */
  21. public function __construct(CreatesConnectedAccounts $createsConnectedAccounts)
  22. {
  23. $this->createsConnectedAccounts = $createsConnectedAccounts;
  24. }
  25. /**
  26. * Create a new user from a social provider user.
  27. */
  28. public function create(string $provider, ProviderUserContract $providerUser): User
  29. {
  30. return DB::transaction(function () use ($providerUser, $provider) {
  31. return tap(User::create([
  32. 'name' => $providerUser->getName(),
  33. 'email' => $providerUser->getEmail(),
  34. ]), function (User $user) use ($providerUser, $provider) {
  35. $user->markEmailAsVerified();
  36. if ($this->shouldSetProfilePhoto($providerUser)) {
  37. $user->setProfilePhotoFromUrl($providerUser->getAvatar());
  38. }
  39. $user->switchConnectedAccount(
  40. $this->createsConnectedAccounts->create($user, $provider, $providerUser)
  41. );
  42. $this->createCompany($user);
  43. });
  44. });
  45. }
  46. private function shouldSetProfilePhoto(ProviderUserContract $providerUser): bool
  47. {
  48. return Features::profilePhotos() &&
  49. Socialite::hasProviderAvatarsFeature() &&
  50. FilamentCompanies::managesProfilePhotos() &&
  51. $providerUser->getAvatar();
  52. }
  53. /**
  54. * Create a personal company for the user.
  55. */
  56. protected function createCompany(User $user): void
  57. {
  58. $user->ownedCompanies()->save(Company::forceCreate([
  59. 'user_id' => $user->id,
  60. 'name' => explode(' ', $user->name, 2)[0]."'s Company",
  61. 'personal_company' => true,
  62. ]));
  63. }
  64. }