Skip to content

Commit

Permalink
Implement happy path for new user registration
Browse files Browse the repository at this point in the history
  • Loading branch information
mzur committed Apr 26, 2023
1 parent 36f7614 commit 7813468
Show file tree
Hide file tree
Showing 4 changed files with 188 additions and 16 deletions.
76 changes: 73 additions & 3 deletions src/Http/Controllers/RegisterController.php
Expand Up @@ -3,11 +3,81 @@
namespace Biigle\Modules\AuthLSLogin\Http\Controllers;

use Biigle\Http\Controllers\Auth\RegisterController as BaseController;
use Biigle\Modules\AuthLSLogin\LsloginId;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Str;
use Laravel\Socialite\Facades\Socialite;

class RegisterController extends BaseController
{
// Handle disabled user registration (show error message)
//
// Reuse parent class code as much as possible (with optional required terms etc)
/**
* {@inheritdoc}
*/
public function showRegistrationForm()
{
if ($this->isRegistrationDisabled()) {
abort(Response::HTTP_NOT_FOUND);
}

if (!session()->has('lslogin-token')) {
return redirect()->route('register');
}

return view('auth-lslogin::register');
}

/**
* {@inheritdoc}
*/
public function register(Request $request)
{
$token = $request->session()->get('lslogin-token');
if (!$token) {
// error
}

$user = Socialite::driver('lifesciencelogin')->userFromToken($token);

$request->merge([
'id' => $user->id,
'email' => $user->email,
'firstname' => $user->given_name,
'lastname' => $user->family_name,
'password' => Str::random(8),
]);

return parent::register($request);
}

/**
* {@inheritdoc}
*/
protected function validator(array $data)
{
$validator = parent::validator($data);

$rules = $validator->getRules();
unset($rules['website']);
unset($rules['homepage']);

$validator->setRules($rules);

return $validator;
}

/**
* {@inheritdoc}
*/
protected function registered(Request $request, $user)
{
LsloginId::create([
'id' => $request->input('id'),
'user_id' => $user->id,
]);

$request->session()->forget('lslogin-token');

return parent::registered($request, $user);
}
}
5 changes: 5 additions & 0 deletions src/Http/routes.php
Expand Up @@ -14,3 +14,8 @@
'as' => 'lslogin-register-form',
'uses' => 'RegisterController@showRegistrationForm',
]);

$router->post('auth/lslogin/register', [
'as' => 'lslogin-register',
'uses' => 'RegisterController@register',
]);
50 changes: 50 additions & 0 deletions src/resources/views/register.blade.php
@@ -0,0 +1,50 @@
@extends('app')

@section('title', 'Sign up via Life Science Login')
@section('show-navbar', false)

@section('content')
<div class="container">
<div class="row center-form">
<div class="col-md-4 col-sm-6">
<h1 class="logo logo--standalone"><a href="{{ route('home') }}" class="logo__biigle">BIIGLE</a></h1>
<form class="well clearfix" role="form" method="POST" action="{{ url('lslogin-register') }}">

<p class="lead text-center">Create an account</p>

<p>
Please enter the information below to finish your sign-up.
</p>

<div class="form-group{{ $errors->any() ? ' has-error' : '' }}">
@if ($errors->any())
<span class="help-block">{{ $errors->first() }}</span>
@endif
<div class="input-group">
<div class="input-group-addon">
<i class="fa fa-building"></i>
</div>
<input type="text" placeholder="Affiliation (institute name, company, etc.)" class="form-control" name="affiliation" value="{{ old('affiliation') }}">
</div>
</div>

@mixin('registrationForm')

@include('auth.partials.privacy-checkbox')
@include('auth.partials.terms-checkbox')

<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="submit" class="btn btn-success btn-block" value="Sign up" onclick="this.disabled=true;this.form.submit();">

</form>
<p class="clearfix">
<a href="{{ route('home') }}" class="">Cancel</a>
<a href="{{ url('login') }}" class="pull-right" title="Log in">Log in</a>
</p>
</div>
</div>
</div>
@include('partials.footer', [
'positionAbsolute' => true,
])
@endsection
73 changes: 60 additions & 13 deletions tests/Http/Controllers/RegisterControllerTest.php
Expand Up @@ -2,38 +2,75 @@

namespace Biigle\Tests\Modules\AuthLSLogin\Http\Controllers;

use Biigle\Modules\AuthLSLogin\LsloginId;
use Biigle\Role;
use Biigle\User;
use Laravel\Socialite\Facades\Socialite;
use Laravel\Socialite\Two\User as SocialiteUser;
use Session;
use TestCase;


class RegisterControllerTest extends TestCase
{
public function testShowRegistrationForm()
{
// user should enter affiliation and check terms/privacy
$this->withSession(['lslogin-token' => 'mytoken'])
->get('auth/lslogin/register')
->assertSuccessful();
}

public function testShowRegistrationFormWithoutToken()
{
//
$this->get('auth/lslogin/register')->assertRedirectToRoute('register');
}

public function testShowRegistrationFormAuthenticated()
{
//
$user = User::factory()->create();
$this->be($user);
$this->get('auth/lslogin/register')->assertRedirectToRoute('home');
}

public function testShowRegistrationFormDisabledRegistration()
{
//
config(['biigle.user_registration' => false]);
$this->get('auth/lslogin/register')->assertStatus(404);
}

public function testRegister()
{
// should not require honeypot if the token is in the session
$user = new SocialiteUser;
$user->map([
'id' => 'mylsloginid',
'given_name' => 'Joe',
'family_name' => 'User',
'email' => 'joe@example.com',
]);
Socialite::shouldReceive('driver->userFromToken')
->with('mytoken')
->andReturn($user);

$this->withSession(['lslogin-token' => 'mytoken'])
->post('auth/lslogin/register', [
'_token' => Session::token(),
'affiliation' => 'something',
])
->assertSessionMissing('lslogin-token')
->assertRedirectToRoute('home');

$user = User::where('email', 'joe@example.com')->first();
$this->assertNotNull($user);
$this->assertEquals('Joe', $user->firstname);
$this->assertEquals('User', $user->lastname);
$this->assertEquals('something', $user->affiliation);
$this->assertEquals(Role::editorId(), $user->role_id);

$this->assertTrue(LsloginId::where('user_id', $user->id)->where('id', 'mylsloginid')->exists());
}

public function testRegisterMissingAffiliation()
{
// the token should be left in the session
}

public function testRegisterEmailTaken()
Expand All @@ -42,28 +79,38 @@ public function testRegisterEmailTaken()
// suggest to connect in account settings instead
}

public function testRegisterIdTaken()
{
// show error message
}

public function testRegisterWithoutToken()
{
//
// redirect to register route
}

public function testRegisterDisabledRegistration()
public function testRegisterInvalidToken()
{
//
// show error message
}

public function testRegisterAuthenticated()
public function testRegisterPrivacy()
{
//
}

public function testRegisterAdminConfirmationDisabled()
public function testRegisterTerms()
{
//
}

public function testRegisterAdminConfirmationEnabled()
public function testRegisterDisabledRegistration()
{
//
// not found?
}

public function testRegisterAuthenticated()
{
// redirect to home
}
}

0 comments on commit 7813468

Please sign in to comment.