Skip to content
This repository was archived by the owner on Oct 1, 2021. It is now read-only.

Commit 72a92b4

Browse files
authored
fix: assign invitation to a new registered user (#46)
1 parent 4b2edbe commit 72a92b4

File tree

3 files changed

+79
-8
lines changed

3 files changed

+79
-8
lines changed

src/Actions/CreateNewUser.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use ARKEcosystem\Fortify\Models;
88
use Illuminate\Support\Facades\Config;
9+
use Illuminate\Support\Facades\DB;
910
use Illuminate\Support\Facades\Hash;
1011
use Illuminate\Support\Facades\Validator;
1112
use Illuminate\Validation\Validator as ValidationValidator;
@@ -25,9 +26,24 @@ class CreateNewUser implements CreatesNewUsers
2526
*/
2627
public function create(array $input)
2728
{
28-
$input = $this->buildValidator($input)->validate();
29+
$input = $this->buildValidator($input)->validate();
30+
$invitation = null;
2931

30-
return Models::user()::create($this->getUserData($input));
32+
if (array_key_exists('invitation', $input)) {
33+
$invitationId = $input['invitation'];
34+
unset($input['invitation']);
35+
$invitation = Models::invitation()::findByUuid($invitationId);
36+
}
37+
38+
return DB::transaction(function () use ($input, $invitation) {
39+
$user = Models::user()::create($this->getUserData($input));
40+
41+
if ($invitation) {
42+
$invitation->update(['user_id' => $user->id]);
43+
}
44+
45+
return $user;
46+
});
3147
}
3248

3349
private function buildValidator(array $input): ValidationValidator
@@ -37,6 +53,7 @@ private function buildValidator(array $input): ValidationValidator
3753
Fortify::username() => $this->usernameRules(),
3854
'password' => $this->passwordRules(),
3955
'terms' => ['required', 'accepted'],
56+
'invitation' => ['sometimes', 'required', 'string'],
4057
];
4158

4259
if ($usernameAlt = Config::get('fortify.username_alt')) {

src/Components/RegisterForm.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class RegisterForm extends Component
2323

2424
public string $formUrl;
2525

26-
protected $invitation = null;
26+
public ?string $invitationId = null;
2727

2828
public function mount()
2929
{
@@ -36,9 +36,7 @@ public function mount()
3636

3737
$this->formUrl = request()->fullUrl();
3838

39-
if (request()->has('invitation')) {
40-
$this->invitation = Models::invitation()::findByUuid(request()->get('invitation'));
41-
}
39+
$this->invitationId = request()->get('invitation');
4240
}
4341

4442
/**
@@ -49,7 +47,7 @@ public function mount()
4947
public function render()
5048
{
5149
return view('ark-fortify::auth.register-form', [
52-
'invitation' => $this->invitation,
50+
'invitation' => $this->invitationId ? Models::invitation()::findByUuid($this->invitationId) : null,
5351
]);
5452
}
5553
}

tests/Actions/CreateNewUserTest.php

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
declare(strict_types=1);
44

55
use ARKEcosystem\Fortify\Actions\CreateNewUser;
6+
use ARKEcosystem\Fortify\Models;
7+
8+
use Illuminate\Database\Eloquent\Model;
9+
use Illuminate\Support\Arr;
610
use Illuminate\Support\Facades\Config;
711
use Illuminate\Support\Facades\Hash;
8-
12+
use Spatie\MediaLibrary\MediaCollections\Models\Concerns\HasUuid;
913
use function Tests\expectValidationError;
1014

1115
beforeEach(function () {
@@ -164,3 +168,55 @@
164168
'terms' => true,
165169
]), 'password', 'The password must be at least 12 characters and contain at least one uppercase character, one number, and one special character.');
166170
});
171+
172+
it('handles the invitation parameter', function () {
173+
Config::set('fortify.models.user', \ARKEcosystem\Fortify\Models\User::class);
174+
Config::set('fortify.models.invitation', CreateNewUserTest::class);
175+
176+
$user = (new CreateNewUser())->create([
177+
'name' => 'John Doe',
178+
'username' => 'alfonsobries',
179+
'email' => 'john@doe.com',
180+
'password' => $this->validPassword,
181+
'password_confirmation' => $this->validPassword,
182+
'terms' => true,
183+
'invitation' => 'uuid-uuid-uuid-uuid',
184+
]);
185+
186+
$invitation = Models::invitation()::findByUuid('uuid-uuid-uuid-uuid');
187+
188+
$this->assertSame($user->id, $invitation->user_id);
189+
});
190+
191+
/**
192+
* @coversNothing
193+
*/
194+
class CreateNewUserTest extends Model
195+
{
196+
use HasUuid;
197+
198+
public ?string $uuid = null;
199+
200+
public ?int $user_id = null;
201+
202+
protected $guarded = [];
203+
204+
public static $model = null;
205+
206+
public static function findByUuid(string $uuid): ?Model
207+
{
208+
if (self::$model) {
209+
return self::$model;
210+
}
211+
212+
self::$model = new self(compact('uuid'));
213+
214+
return self::$model;
215+
}
216+
217+
public function update(array $attributes = [], array $options = [])
218+
{
219+
$this->user_id = Arr::get($attributes, 'user_id', $this->user_id);
220+
$this->uuid = Arr::get($attributes, 'uuid', $this->uuid);
221+
}
222+
}

0 commit comments

Comments
 (0)