From a70f95618c03c810587678c896658a217a0bc59b Mon Sep 17 00:00:00 2001 From: Adam Wathan Date: Fri, 8 Dec 2017 13:20:30 -0500 Subject: [PATCH] 150 - Registering with a Valid Invitation --- .../Controllers/Auth/RegisterController.php | 68 ++++--------------- app/Invitation.php | 7 ++ resources/views/invitations/show.blade.php | 40 +++++++++++ routes/web.php | 2 + tests/Feature/AcceptInvitationTest.php | 27 ++++++++ 5 files changed, 89 insertions(+), 55 deletions(-) diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index e48e2e3..84006fc 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -3,69 +3,27 @@ namespace App\Http\Controllers\Auth; use App\User; +use App\Invitation; use App\Http\Controllers\Controller; -use Illuminate\Support\Facades\Validator; -use Illuminate\Foundation\Auth\RegistersUsers; +use Illuminate\Support\Facades\Auth; class RegisterController extends Controller { - /* - |-------------------------------------------------------------------------- - | Register Controller - |-------------------------------------------------------------------------- - | - | This controller handles the registration of new users as well as their - | validation and creation. By default this controller uses a trait to - | provide this functionality without requiring any additional code. - | - */ - - use RegistersUsers; - - /** - * Where to redirect users after login / registration. - * - * @var string - */ - protected $redirectTo = '/home'; - - /** - * Create a new controller instance. - * - * @return void - */ - public function __construct() + public function register() { - $this->middleware('guest'); - } + $invitation = Invitation::findByCode(request('invitation_code')); - /** - * Get a validator for an incoming registration request. - * - * @param array $data - * @return \Illuminate\Contracts\Validation\Validator - */ - protected function validator(array $data) - { - return Validator::make($data, [ - 'name' => 'required|max:255', - 'email' => 'required|email|max:255|unique:users', - 'password' => 'required|min:6|confirmed', + $user = User::create([ + 'email' => request('email'), + 'password' => bcrypt(request('password')), ]); - } - /** - * Create a new user instance after a valid registration. - * - * @param array $data - * @return User - */ - protected function create(array $data) - { - return User::create([ - 'name' => $data['name'], - 'email' => $data['email'], - 'password' => bcrypt($data['password']), + $invitation->update([ + 'user_id' => $user->id, ]); + + Auth::login($user); + + return redirect()->route('backstage.concerts.index'); } } diff --git a/app/Invitation.php b/app/Invitation.php index 79d93e3..efd95b1 100644 --- a/app/Invitation.php +++ b/app/Invitation.php @@ -6,11 +6,18 @@ use Illuminate\Database\Eloquent\Model; class Invitation extends Model { + protected $guarded = []; + public static function findByCode($code) { return self::where('code', $code)->firstOrFail(); } + public function user() + { + return $this->belongsTo(User::class); + } + public function hasBeenUsed() { return $this->user_id !== null; diff --git a/resources/views/invitations/show.blade.php b/resources/views/invitations/show.blade.php index e69de29..1f6f628 100644 --- a/resources/views/invitations/show.blade.php +++ b/resources/views/invitations/show.blade.php @@ -0,0 +1,40 @@ +@extends('layouts.master') + +@section('body') +
+
+
+
+ {{ csrf_field() }} + +

Join TicketBeast

+
+ +
+ + @icon('user', 'text-dark-muted text-xs') + + +
+ @if ($errors->has('email')) +

{{ $errors->first('email') }}

+ @endif +
+
+ +
+ + @icon('lock-closed', 'text-dark-muted text-xs') + + +
+ @if ($errors->has('password')) +

{{ $errors->first('password') }}

+ @endif +
+ +
+
+
+
+@endsection diff --git a/routes/web.php b/routes/web.php index adbff40..7d511f6 100644 --- a/routes/web.php +++ b/routes/web.php @@ -19,6 +19,8 @@ Route::get('/login', 'Auth\LoginController@showLoginForm')->name('auth.show-logi Route::post('/login', 'Auth\LoginController@login')->name('auth.login'); Route::post('/logout', 'Auth\LoginController@logout')->name('auth.logout'); +Route::post('/register', 'Auth\RegisterController@register')->name('auth.register'); + Route::get('/invitations/{code}', 'InvitationsController@show')->name('invitations.show'); Route::group(['middleware' => 'auth', 'prefix' => 'backstage', 'namespace' => 'Backstage'], function () { diff --git a/tests/Feature/AcceptInvitationTest.php b/tests/Feature/AcceptInvitationTest.php index 8e63867..c34b1df 100644 --- a/tests/Feature/AcceptInvitationTest.php +++ b/tests/Feature/AcceptInvitationTest.php @@ -5,6 +5,7 @@ namespace Tests\Feature; use App\User; use App\Invitation; use Tests\TestCase; +use Illuminate\Support\Facades\Hash; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; @@ -49,4 +50,30 @@ class AcceptInvitationTest extends TestCase $response->assertStatus(404); } + + /** @test */ + function registering_with_a_valid_invitation_code() + { + $this->withoutExceptionHandling(); + + $invitation = factory(Invitation::class)->create([ + 'user_id' => null, + 'code' => 'TESTCODE1234', + ]); + + $response = $this->post('/register', [ + 'email' => 'john@example.com', + 'password' => 'secret', + 'invitation_code' => 'TESTCODE1234', + ]); + + $response->assertRedirect('/backstage/concerts'); + + $this->assertEquals(1, User::count()); + $user = User::first(); + $this->assertAuthenticatedAs($user); + $this->assertEquals('john@example.com', $user->email); + $this->assertTrue(Hash::check('secret', $user->password)); + $this->assertTrue($invitation->fresh()->user->is($user)); + } }