Browse Source

Implementa demais campos de classificação dos usuários.

Remove componentes do scaffolding não utilizados.
Todos os testes estão passando.
usuarios_separados
Guilherme Capanema 6 years ago
parent
commit
f6e80998e2
19 changed files with 88 additions and 342 deletions
  1. +0
    -27
      app/Http/Livewire/Auth/Passwords/Confirm.php
  2. +9
    -2
      app/Http/Livewire/Auth/Register/Individual.php
  3. +0
    -28
      app/Http/Livewire/Auth/Verify.php
  4. +1
    -1
      app/User.php
  5. +4
    -4
      app/UserCategory.php
  6. +26
    -0
      app/UserNature.php
  7. +30
    -0
      app/UserType.php
  8. +5
    -1
      database/factories/UserFactory.php
  9. +3
    -3
      database/migrations/2014_10_12_000000_create_users_table.php
  10. +0
    -8
      resources/views/auth/passwords/confirm.blade.php
  11. +0
    -8
      resources/views/auth/verify.blade.php
  12. +0
    -50
      resources/views/livewire/auth/passwords/confirm.blade.php
  13. +0
    -44
      resources/views/livewire/auth/verify.blade.php
  14. +0
    -5
      routes/web.php
  15. +2
    -2
      tests/Feature/Auth/LoginTest.php
  16. +0
    -76
      tests/Feature/Auth/Passwords/ConfirmTest.php
  17. +0
    -65
      tests/Feature/Auth/VerifyTest.php
  18. +0
    -18
      tests/Feature/ExampleTest.php
  19. +8
    -0
      tests/TestCase.php

+ 0
- 27
app/Http/Livewire/Auth/Passwords/Confirm.php View File

@ -1,27 +0,0 @@
<?php
namespace App\Http\Livewire\Auth\Passwords;
use Livewire\Component;
class Confirm extends Component
{
/** @var string */
public $password = '';
public function confirm()
{
$this->validate([
'password' => 'required|password',
]);
session()->put('auth.password_confirmed_at', time());
redirect()->intended(route('home'));
}
public function render()
{
return view('livewire.auth.passwords.confirm');
}
}

+ 9
- 2
app/Http/Livewire/Auth/Register/Individual.php View File

@ -5,6 +5,8 @@ namespace App\Http\Livewire\Auth\Register;
use App\Providers\RouteServiceProvider; use App\Providers\RouteServiceProvider;
use App\User; use App\User;
use App\UserCategory; use App\UserCategory;
use App\UserNature;
use App\UserType;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Livewire\Component; use Livewire\Component;
@ -36,13 +38,18 @@ class Individual extends Component
'email' => ['required', 'email', 'unique:users'], 'email' => ['required', 'email', 'unique:users'],
]); ]);
$user = User::create([
$user = new User([
'name' => $this->name, 'name' => $this->name,
'email' => $this->email, 'email' => $this->email,
'category_id' => UserCategory::where('key', 'individual')->first()->id,
'birthday' => Carbon::createFromFormat('d/m/Y', $this->birthday), 'birthday' => Carbon::createFromFormat('d/m/Y', $this->birthday),
]); ]);
$user->user_category_id = UserCategory::where('key', 'individual')->first()->id;
$user->user_nature_id = UserNature::where('key', 'individual')->first()->id;
$user->user_type_id = UserType::where('key', 'individual')->first()->id;
$user->save();
Auth::login($user, true); Auth::login($user, true);
redirect(route('home')); redirect(route('home'));


+ 0
- 28
app/Http/Livewire/Auth/Verify.php View File

@ -1,28 +0,0 @@
<?php
namespace App\Http\Livewire\Auth;
use App\Providers\RouteServiceProvider;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
class Verify extends Component
{
public function resend()
{
if (Auth::user()->hasVerifiedEmail()) {
redirect(route('home'));
}
Auth::user()->sendEmailVerificationNotification();
$this->emit('resent');
session()->flash('resent');
}
public function render()
{
return view('livewire.auth.verify');
}
}

+ 1
- 1
app/User.php View File

@ -16,7 +16,7 @@ class User extends Authenticatable
* @var array * @var array
*/ */
protected $fillable = [ protected $fillable = [
'name', 'email', 'password', 'category_id', 'birthday'
'name', 'email', 'password', 'birthday'
]; ];
/** /**


+ 4
- 4
app/UserCategory.php View File

@ -15,16 +15,16 @@ class UserCategory extends Model
'name' => 'Associado Indivíduo', 'name' => 'Associado Indivíduo',
], ],
[ [
'key' => 'company',
'name' => 'Associada Empresa Apoiadora',
'key' => 'supporting-institution',
'name' => 'Associada Instituição Apoiadora',
], ],
[ [
'key' => 'acting-institution', 'key' => 'acting-institution',
'name' => 'Associada Instituição Atuante', 'name' => 'Associada Instituição Atuante',
], ],
[ [
'key' => 'supporting-institution',
'name' => 'Associada Instituição Apoiadora',
'key' => 'company',
'name' => 'Associada Empresa Apoiadora',
], ],
]; ];
} }

+ 26
- 0
app/UserNature.php View File

@ -0,0 +1,26 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Sushi\Sushi;
class UserNature extends Model
{
use Sushi;
protected $rows = [
[
'key' => 'individual',
'name' => 'Pessoa Física',
],
[
'key' => 'informal',
'name' => 'Coletivo Informal',
],
[
'key' => 'company',
'name' => 'Pessoa Jurídica',
]
];
}

+ 30
- 0
app/UserType.php View File

@ -0,0 +1,30 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Sushi\Sushi;
class UserType extends Model
{
use Sushi;
protected $rows = [
[
'key' => 'individual',
'name' => 'Indivíduo',
],
[
'key' => 'collective',
'name' => 'Coletivo Informal',
],
[
'key' => 'association',
'name' => 'Associação Formal',
],
[
'key' => 'company',
'name' => 'Empresa Privada',
],
];
}

+ 5
- 1
database/factories/UserFactory.php View File

@ -4,6 +4,8 @@
use App\User; use App\User;
use App\UserCategory; use App\UserCategory;
use App\UserNature;
use App\UserType;
use Carbon\Carbon; use Carbon\Carbon;
use Faker\Generator as Faker; use Faker\Generator as Faker;
use Illuminate\Support\Str; use Illuminate\Support\Str;
@ -24,7 +26,9 @@ $factory->define(User::class, function (Faker $faker) {
'name' => $faker->name, 'name' => $faker->name,
'email' => $faker->unique()->safeEmail, 'email' => $faker->unique()->safeEmail,
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'category_id' => UserCategory::where('key', 'individual')->first()->id,
'user_category_id' => UserCategory::where('key', 'individual')->first()->id,
'user_nature_id' => UserNature::where('key', 'individual')->first()->id,
'user_type_id' => UserType::where('key', 'individual')->first()->id,
'birthday' => Carbon::createFromFormat('d/m/Y', $faker->date('d/m/Y')), 'birthday' => Carbon::createFromFormat('d/m/Y', $faker->date('d/m/Y')),
'remember_token' => Str::random(10), 'remember_token' => Str::random(10),
]; ];


+ 3
- 3
database/migrations/2014_10_12_000000_create_users_table.php View File

@ -20,9 +20,9 @@ class CreateUsersTable extends Migration
$table->string('password'); $table->string('password');
// User profile // User profile
$table->foreignId('category_id');
// $table->foreignId('nature_id');
// $table->foreignId('type_id');
$table->foreignId('user_category_id');
$table->foreignId('user_nature_id');
$table->foreignId('user_type_id');
// $table->string('avatar')->nullable(); // $table->string('avatar')->nullable();
$table->date('birthday'); $table->date('birthday');
// $table->json('document')->nullable(); // $table->json('document')->nullable();


+ 0
- 8
resources/views/auth/passwords/confirm.blade.php View File

@ -1,8 +0,0 @@
@extends('layouts.auth')
@section('title', 'Confirm your password')
@section('content')
<div>
@livewire('auth.passwords.confirm')
</div>
@endsection

+ 0
- 8
resources/views/auth/verify.blade.php View File

@ -1,8 +0,0 @@
@extends('layouts.auth')
@section('title', 'Verify your email address')
@section('content')
<div>
@livewire('auth.verify')
</div>
@endsection

+ 0
- 50
resources/views/livewire/auth/passwords/confirm.blade.php View File

@ -1,50 +0,0 @@
<div>
<div class="sm:mx-auto sm:w-full sm:max-w-md">
<a href="{{ route('home') }}">
<x-logo class="w-auto h-16 mx-auto text-green-600" />
</a>
<h2 class="mt-6 text-3xl font-extrabold text-center text-gray-900 leading-9">
Confirm your password
</h2>
<p class="mt-2 text-sm text-center text-gray-600 leading-5 max-w">
Please confirm your password before continuing
</p>
</div>
<div class="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
<div class="px-4 py-8 bg-white shadow sm:rounded-lg sm:px-10">
<form wire:submit.prevent="confirm">
<div>
<label for="password" class="block text-sm font-medium text-gray-700 leading-5">
Password
</label>
<div class="mt-1 rounded-md shadow-sm">
<input wire:model.lazy="password" id="password" name="password" type="password" required autofocus class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md placeholder-gray-400 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 transition duration-150 ease-in-out sm:text-sm sm:leading-5 @error('password') border-red-300 text-red-900 placeholder-red-300 focus:border-red-300 focus:shadow-outline-red @enderror" />
</div>
@error('password')
<p class="mt-2 text-sm text-red-600" id="password-error">{{ $message }}</p>
@enderror
</div>
<div class="flex items-center justify-end mt-6">
<div class="text-sm leading-5">
<a href="{{ route('password.request') }}" class="font-medium text-green-600 hover:text-green-500 focus:outline-none focus:underline transition ease-in-out duration-150">
Forgot your password?
</a>
</div>
</div>
<div class="mt-6">
<span class="block w-full rounded-md shadow-sm">
<button type="submit" class="flex justify-center w-full px-4 py-2 text-sm font-medium text-white bg-green-600 border border-transparent rounded-md hover:bg-green-500 focus:outline-none focus:border-green-700 focus:shadow-outline-green active:bg-green-700 transition duration-150 ease-in-out">
Confirm password
</button>
</span>
</div>
</form>
</div>
</div>
</div>

+ 0
- 44
resources/views/livewire/auth/verify.blade.php View File

@ -1,44 +0,0 @@
<div>
<div class="sm:mx-auto sm:w-full sm:max-w-md">
<a href="{{ route('home') }}">
<x-logo class="w-auto h-16 mx-auto text-green-600" />
</a>
<h2 class="mt-6 text-3xl font-extrabold text-center text-gray-900 leading-9">
Verify your email address
</h2>
<p class="mt-2 text-sm text-center text-gray-600 leading-5 max-w">
Or
<a href="{{ route('logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();" class="font-medium text-green-600 hover:text-green-500 focus:outline-none focus:underline transition ease-in-out duration-150">
sign out
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
@csrf
</form>
</p>
</div>
<div class="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
<div class="px-4 py-8 bg-white shadow sm:rounded-lg sm:px-10">
@if (session('resent'))
<div class="flex items-center px-4 py-3 mb-6 text-sm text-white bg-green-500 rounded shadow" role="alert">
<svg class="w-4 h-4 mr-3 fill-current" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path>
</svg>
<p>A fresh verification link has been sent to your email address.</p>
</div>
@endif
<div class="text-sm text-gray-700">
<p>Before proceeding, please check your email for a verification link.</p>
<p class="mt-3">
If you did not receive the email, <a wire:click="resend" class="text-green-700 cursor-pointer hover:text-green-600 focus:outline-none focus:underline transition ease-in-out duration-150">click here to request another</a>.
</p>
</div>
</div>
</div>
</div>

+ 0
- 5
routes/web.php View File

@ -25,10 +25,5 @@ Route::view('password/reset', 'auth.passwords.email')->name('password.request');
Route::get('password/reset/{token}', 'Auth\PasswordResetController')->name('password.reset'); Route::get('password/reset/{token}', 'Auth\PasswordResetController')->name('password.reset');
Route::middleware('auth')->group(function () { Route::middleware('auth')->group(function () {
Route::view('email/verify', 'auth.verify')->middleware('throttle:6,1')->name('verification.notice');
Route::get('email/verify/{id}/{hash}', 'Auth\EmailVerificationController')->middleware('signed')->name('verification.verify');
Route::post('logout', 'Auth\LogoutController')->name('logout'); Route::post('logout', 'Auth\LogoutController')->name('logout');
Route::view('password/confirm', 'auth.passwords.confirm')->name('password.confirm');
}); });

+ 2
- 2
tests/Feature/Auth/LoginTest.php View File

@ -35,7 +35,7 @@ class LoginTest extends TestCase
/** @test */ /** @test */
public function a_user_can_login() public function a_user_can_login()
{ {
$user = factory(User::class)->create(['password' => Hash::make('password')]);
$user = $this->factoryWithoutObservers(User::class)->create(['password' => Hash::make('password')]);
Livewire::test('auth.login') Livewire::test('auth.login')
->set('email', $user->email) ->set('email', $user->email)
@ -48,7 +48,7 @@ class LoginTest extends TestCase
/** @test */ /** @test */
public function is_redirected_to_the_home_page_after_login() public function is_redirected_to_the_home_page_after_login()
{ {
$user = factory(User::class)->create(['password' => Hash::make('password')]);
$user = $this->factoryWithoutObservers(User::class)->create(['password' => Hash::make('password')]);
Livewire::test('auth.login') Livewire::test('auth.login')
->set('email', $user->email) ->set('email', $user->email)


+ 0
- 76
tests/Feature/Auth/Passwords/ConfirmTest.php View File

@ -1,76 +0,0 @@
<?php
namespace Tests\Feature\Auth\Passwords;
use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Route;
use Livewire\Livewire;
use Tests\TestCase;
class ConfirmTest extends TestCase
{
use RefreshDatabase;
protected function setUp(): void
{
parent::setUp();
Route::get('/must-be-confirmed', function () {
return 'You must be confirmed to see this page.';
})->middleware(['web', 'password.confirm']);
}
/** @test */
public function a_user_must_confirm_their_password_before_visiting_a_protected_page()
{
$user = factory(User::class)->create();
$this->be($user);
$this->get('/must-be-confirmed')
->assertRedirect(route('password.confirm'));
$this->followingRedirects()
->get('/must-be-confirmed')
->assertSeeLivewire('auth.passwords.confirm');
}
/** @test */
public function a_user_must_enter_a_password_to_confirm_it()
{
Livewire::test('auth.passwords.confirm')
->call('confirm')
->assertHasErrors(['password' => 'required']);
}
/** @test */
public function a_user_must_enter_their_own_password_to_confirm_it()
{
$user = factory(User::class)->create([
'password' => Hash::make('password'),
]);
Livewire::test('auth.passwords.confirm')
->set('password', 'not-password')
->call('confirm')
->assertHasErrors(['password' => 'password']);
}
/** @test */
public function a_user_who_confirms_their_password_will_get_redirected()
{
$user = factory(User::class)->create([
'password' => Hash::make('password'),
]);
$this->be($user);
$this->withSession(['url.intended' => '/must-be-confirmed']);
Livewire::test('auth.passwords.confirm')
->set('password', 'password')
->call('confirm')
->assertRedirect('/must-be-confirmed');
}
}

+ 0
- 65
tests/Feature/Auth/VerifyTest.php View File

@ -1,65 +0,0 @@
<?php
namespace Tests\Feature\Auth;
use App\User;
use Tests\TestCase;
use Livewire\Livewire;
use Illuminate\Support\Facades\Hash;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\URL;
class VerifyTest extends TestCase
{
use RefreshDatabase;
/** @test */
public function can_view_verification_page()
{
$user = factory(User::class)->create([
'email_verified_at' => null,
]);
Auth::login($user);
$this->get(route('verification.notice'))
->assertSuccessful()
->assertSeeLivewire('auth.verify');
}
/** @test */
public function can_resend_verification_email()
{
$user = factory(User::class)->create();
Livewire::actingAs($user);
Livewire::test('auth.verify')
->call('resend')
->assertEmitted('resent');
}
/** @test */
public function can_verify()
{
$user = factory(User::class)->create([
'email_verified_at' => null,
]);
Auth::login($user);
$url = URL::temporarySignedRoute('verification.verify', Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)), [
'id' => $user->getKey(),
'hash' => sha1($user->getEmailForVerification()),
]);
$this->get($url)
->assertRedirect(route('home'));
$this->assertTrue($user->hasVerifiedEmail());
}
}

+ 0
- 18
tests/Feature/ExampleTest.php View File

@ -1,18 +0,0 @@
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$this->get(route('home'))->assertSuccessful();
}
}

+ 8
- 0
tests/TestCase.php View File

@ -20,4 +20,12 @@ abstract class TestCase extends BaseTestCase
return ''; return '';
}); });
} }
/**
* Create a model factory and forget observers so events do not trigger actions.
*/
public function factoryWithoutObservers($class, $name = 'default') {
$class::flushEventListeners();
return factory($class, $name);
}
} }