Browse Source

Remove user roles feature

pull/1/head
Nafies Luthfi 8 years ago
parent
commit
d8092404ad
  1. 71
      app/Entities/Users/User.php
  2. 17
      app/Entities/Users/UserPresenter.php
  3. 33
      app/Entities/Users/UsersRepository.php
  4. 5
      app/Http/Controllers/AuthController.php
  5. 3
      app/Http/Requests/Users/UpdateRequest.php
  6. 2
      app/Providers/AuthServiceProvider.php
  7. 1
      tests/Feature/Auth/MemberLoginTest.php
  8. 63
      tests/Feature/ManageFeaturesTest.php
  9. 39
      tests/Feature/ManageTasksTest.php
  10. 2
      tests/Feature/Users/ManageUsersTest.php
  11. 41
      tests/Unit/Models/UserTest.php

71
app/Entities/Users/User.php

@ -25,77 +25,6 @@ class User extends Authenticatable
return link_to_route('users.show', $this->name, [$this->id], ['target' => '_blank']);
}
/**
* A user may have multiple roles.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function roles()
{
return $this->belongsToMany(Role::class);
}
/**
* Assign the given role to the user.
*
* @param string $role
* @return mixed
*/
public function assignRole($roleName)
{
$role = Role::firstOrNew(['name' => $roleName]);
if ($role->exists == false) {
$role->type = 0;
$role->label = ucwords($roleName);
$role->save();
}
return $this->roles()->attach($role);
}
/**
* Remove the given role from the user.
*
* @param string $role
* @return mixed
*/
public function removeRole($role)
{
$roleId = Role::whereName($role)->firstOrFail()->id;
return $this->roles()->detach($roleId);
}
/**
* Determine if the user has the given role.
*
* @param mixed $role
* @return boolean
*/
public function hasRole($role)
{
if (is_string($role)) {
return $this->roles->contains('name', $role);
}
return ! ! $role->intersect($this->roles)->count();
}
public function hasRoles(array $roleNameArray)
{
return $this->roles->pluck('name')
->contains(function ($role, $key) use ($roleNameArray) {
return in_array($role, $roleNameArray);
});
}
public function scopeHasRoles($query, array $roleNameArray)
{
return $query->whereHas('roles', function ($q) use ($roleNameArray) {
$q->whereIn('name', $roleNameArray);
});
}
public function agency()
{
return $this->hasOne('App\Entities\Agencies\Agency', 'owner_id');

17
app/Entities/Users/UserPresenter.php

@ -2,7 +2,6 @@
namespace App\Entities\Users;
use Html;
use Laracasts\Presenter\Presenter;
class UserPresenter extends Presenter
@ -10,10 +9,6 @@ class UserPresenter extends Presenter
public function displayRoles()
{
$string = '';
foreach($this->roles as $key => $role) {
$string .= ($key != 0) ? ' | ' : '';
$string .= $role->label;
}
return $string;
}
@ -21,23 +16,15 @@ class UserPresenter extends Presenter
public function rolesLink()
{
$string = '';
foreach($this->roles as $key => $role) {
$string .= ($key != 0) ? ' | ' : '';
$string .= link_to_route('users.index', $role->label, ['role' => $role->name], ['title' => 'Lihat semua ' . $role->label]);
}
return $string;
}
public function usernameRoles()
{
$string = $this->name . ' (';
foreach($this->roles as $key => $role) {
$string .= ($key != 0) ? ' | ' : '';
$string .= $role->label;
}
$string = $this->name.' (';
$string .= ')';
return $string;
}
}
}

33
app/Entities/Users/UsersRepository.php

@ -3,13 +3,11 @@ namespace App\Entities\Users;
use App\Entities\BaseRepository;
use App\Exceptions\UpdateUserException;
use App\Exceptions\UserDeleteException;
use App\Exceptions\UserNotFoundException;
use App\Services\Facades\Option;
/**
* Users Repository Class
*/
* Users Repository Class
*/
class UsersRepository extends BaseRepository
{
@ -23,23 +21,17 @@ class UsersRepository extends BaseRepository
public function getUsers($q, $rolesString)
{
return $this->model->latest()
->where('name','like','%'.$q.'%')
->whereHas('roles', function($query) use ($rolesString) {
if (!is_null($rolesString)) {
$query->whereIn('name', explode('|', $rolesString));
}
})
->with('roles')
->paginate($this->_paginate);
->where('name', 'like', '%'.$q.'%')
->paginate($this->_paginate);
}
public function create($userData)
{
if ($userData['password'] == '')
$userData['password'] = Option::get('password_default','member');
if ($userData['password'] == '') {
$userData['password'] = Option::get('password_default', 'member');
}
$user = $this->storeArray($userData);
$user->roles()->sync($userData['role']);
return $user;
}
@ -49,28 +41,25 @@ class UsersRepository extends BaseRepository
$user = $this->requireById($userId);
foreach ($userData as $key => $value) {
if ($value == '' || $key == 'role') continue;
$user->{$key} = $value;
}
$user->roles()->sync($userData['role']);
if ($user->save())
if ($user->save()) {
return $user;
}
throw new UpdateUserException('Failed to update User');
}
public function getRolesList()
{
return Role::where('type', 0)->pluck('label','id')->all();
return Role::where('type', 0)->pluck('label', 'id')->all();
}
public function delete($userId)
{
$user = $this->requireById($userId);
$user->roles()->detach();
return $user->delete();
}
}
}

5
app/Http/Controllers/AuthController.php

@ -31,9 +31,6 @@ class AuthController extends Controller
$registerData['api_token'] = str_random(32);
$user = User::create($registerData);
$user->assignRole('admin');
$user->assignRole('worker');
Auth::login($user);
$agency = Agency::create([
'name' => $request->get('agency_name'),
@ -42,6 +39,8 @@ class AuthController extends Controller
'owner_id' => $user->id,
]);
Auth::login($user);
flash()->success(trans('auth.welcome', ['name' => $user->name]));
return redirect()->route('home');
}

3
app/Http/Requests/Users/UpdateRequest.php

@ -25,8 +25,7 @@ class UpdateRequest extends Request
{
return [
'name' => 'required|min:5',
'email' => 'required|email|unique:users,email,' . $this->segment(2),
'role' => 'required|array',
'email' => 'required|email|unique:users,email,'.$this->segment(2),
'password' => 'nullable|required_with:password_confirmation|between:6,15|confirmed',
'password_confirmation' => 'required_with:password',
];

2
app/Providers/AuthServiceProvider.php

@ -36,7 +36,7 @@ class AuthServiceProvider extends ServiceProvider
}
Gate::define('add_project', function ($user) {
return $user->hasRole('admin');
return ! is_null($user->agency);
});
Gate::define('manage_project', function ($user, $project) {

1
tests/Feature/Auth/MemberLoginTest.php

@ -11,7 +11,6 @@ class MemberLoginTest extends TestCase
public function user_can_login_and_logout()
{
$user = factory(User::class)->create(['name' => 'Nama Member', 'email' => 'email@mail.com']);
$user->assignRole('worker');
$this->visit(route('auth.login'));

63
tests/Feature/ManageFeaturesTest.php

@ -24,21 +24,21 @@ class ManageFeaturesTest extends TestCase
$this->seePageIs(route('features.create', $project->id));
$this->submitForm(trans('feature.create'), [
'name' => 'Nama Fitur Baru',
'price' => 100000,
'worker_id' => $worker->id,
'type_id' => 1,
'name' => 'Nama Fitur Baru',
'price' => 100000,
'worker_id' => $worker->id,
'type_id' => 1,
'description' => 'Similique, eligendi fuga animi?',
]);
$this->see(trans('feature.created'));
$this->seeInDatabase('features', [
'name' => 'Nama Fitur Baru',
'price' => 100000,
'worker_id' => $worker->id,
'type_id' => 1,
'project_id' => $project->id
'name' => 'Nama Fitur Baru',
'price' => 100000,
'worker_id' => $worker->id,
'type_id' => 1,
'project_id' => $project->id,
]);
}
@ -46,9 +46,6 @@ class ManageFeaturesTest extends TestCase
public function admin_can_edit_feature_data()
{
$user = factory(User::class, 3)->create();
$user[0]->assignRole('admin');
$user[1]->assignRole('worker');
$user[2]->assignRole('worker');
$this->actingAs($user[0]);
$project = factory(Project::class)->create(['owner_id' => $user[0]->id]);
@ -58,10 +55,10 @@ class ManageFeaturesTest extends TestCase
$this->visit(route('features.edit', $feature->id));
$this->submitForm(trans('feature.update'), [
'name' => 'Nama Fitur Edit',
'price' => 33333,
'name' => 'Nama Fitur Edit',
'price' => 33333,
'worker_id' => $user[2]->id,
'type_id' => 2,
'type_id' => 2,
]);
$this->seePageIs(route('features.show', $feature->id));
@ -69,11 +66,11 @@ class ManageFeaturesTest extends TestCase
$this->see(trans('feature.updated'));
$this->seeInDatabase('features', [
'name' => 'Nama Fitur Edit',
'price' => 33333,
'worker_id' => $user[2]->id,
'name' => 'Nama Fitur Edit',
'price' => 33333,
'worker_id' => $user[2]->id,
'project_id' => $project->id,
'type_id' => 2
'type_id' => 2,
]);
}
@ -84,11 +81,11 @@ class ManageFeaturesTest extends TestCase
$project = factory(Project::class)->create(['owner_id' => $user->id]);
$feature = factory(Feature::class)->create(['project_id' => $project->id]);
$tasks = factory(Task::class, 2)->create(['feature_id' => $feature->id]);
$tasks = factory(Task::class, 2)->create(['feature_id' => $feature->id]);
$this->seeInDatabase('features', [
'name' => $feature->name,
'price' => $feature->price,
'name' => $feature->name,
'price' => $feature->price,
'project_id' => $project->id,
]);
@ -103,8 +100,8 @@ class ManageFeaturesTest extends TestCase
$this->see(trans('feature.deleted'));
$this->notSeeInDatabase('features', [
'name' => $feature->name,
'price' => $feature->price,
'name' => $feature->name,
'price' => $feature->price,
'project_id' => $project->id,
]);
@ -119,7 +116,7 @@ class ManageFeaturesTest extends TestCase
$user = $this->adminUserSigningIn();
$project = factory(Project::class)->create(['owner_id' => $user->id]);
$feature = factory(Feature::class)->create(['project_id' => $project->id,'type_id' => 1]);
$feature = factory(Feature::class)->create(['project_id' => $project->id, 'type_id' => 1]);
$this->visit(route('projects.features', $project->id));
$this->click('show-feature-'.$feature->id);
@ -137,8 +134,8 @@ class ManageFeaturesTest extends TestCase
$projects = factory(Project::class, 2)->create(['owner_id' => $user->id]);
$features = factory(Feature::class, 3)->create(['project_id' => $projects[0]->id]);
$tasks1 = factory(Task::class, 3)->create(['feature_id' => $features[0]->id]);
$tasks2 = factory(Task::class, 3)->create(['feature_id' => $features[1]->id]);
$tasks1 = factory(Task::class, 3)->create(['feature_id' => $features[0]->id]);
$tasks2 = factory(Task::class, 3)->create(['feature_id' => $features[1]->id]);
$this->visit(route('projects.features', $projects[1]->id));
@ -166,16 +163,16 @@ class ManageFeaturesTest extends TestCase
$this->seeInDatabase('features', [
'project_id' => $projects[1]->id,
'name' => $features[0]->name,
'price' => $features[0]->price,
'worker_id' => $features[0]->worker_id,
'name' => $features[0]->name,
'price' => $features[0]->price,
'worker_id' => $features[0]->worker_id,
]);
$this->seeInDatabase('features', [
'project_id' => $projects[1]->id,
'name' => $features[1]->name,
'price' => $features[1]->price,
'worker_id' => $features[1]->worker_id,
'name' => $features[1]->name,
'price' => $features[1]->price,
'worker_id' => $features[1]->worker_id,
]);
}

39
tests/Feature/ManageTasksTest.php

@ -13,7 +13,6 @@ class ManageTasksTest extends TestCase
public function admin_can_entry_task()
{
$user = factory(User::class)->create();
$user->assignRole('admin');
$this->actingAs($user);
$feature = factory(Feature::class)->create(['worker_id' => $user->id]);
@ -32,8 +31,8 @@ class ManageTasksTest extends TestCase
$this->seePageIs('features/'.$feature->id);
$this->see(trans('task.created'));
$this->seeInDatabase('tasks', [
'name' => 'Nama Task Baru',
'progress' => 70,
'name' => 'Nama Task Baru',
'progress' => 70,
'feature_id' => $feature->id,
'route_name' => 'tasks/create',
]);
@ -43,8 +42,6 @@ class ManageTasksTest extends TestCase
public function admin_can_edit_task_data()
{
$user = factory(User::class)->create();
$user->assignRole('admin');
$user->assignRole('worker');
$this->actingAs($user);
$feature = factory(Feature::class)->create(['worker_id' => $user->id]);
@ -65,9 +62,9 @@ class ManageTasksTest extends TestCase
$this->seePageIs('features/'.$feature->id);
$this->see(trans('task.updated'));
$this->seeInDatabase('tasks', [
'name' => 'Nama Task Edit',
'progress' => 77,
'feature_id' => $feature->id
'name' => 'Nama Task Edit',
'progress' => 77,
'feature_id' => $feature->id,
]);
}
@ -75,8 +72,6 @@ class ManageTasksTest extends TestCase
public function admin_can_delete_a_task()
{
$user = factory(User::class)->create();
$user->assignRole('admin');
$user->assignRole('worker');
$this->actingAs($user);
$feature = factory(Feature::class)->create(['worker_id' => $user->id]);
@ -90,28 +85,4 @@ class ManageTasksTest extends TestCase
$this->seePageIs('features/'.$feature->id);
$this->see(trans('task.deleted'));
}
// /** @test */
// public function admin_can_see_all_tasks()
// {
// $user = factory(User::class)->create();
// $user->assignRole('admin');
// $user->assignRole('worker');
// $this->actingAs($user);
// $feature = factory(Feature::class)->create(['worker_id' => $user->id]);
// $tasks = factory(Task::class, 5)->create(['feature_id' => $feature->id]);
// $this->assertEquals(5, $tasks->count());
// $this->visit('features/'.$feature->id);
// $this->see($tasks[1]->name);
// $this->see($tasks[1]->progress);
// $this->see($tasks[1]->description);
// $this->see($tasks[1]->route_name);
// $this->see($tasks[4]->name);
// $this->see($tasks[4]->progress);
// $this->see($tasks[4]->description);
// $this->see($tasks[4]->route_name);
// }
}

2
tests/Feature/Users/ManageUsersTest.php

@ -49,7 +49,6 @@ class ManageUsersTest extends TestCase
{
$user = $this->adminUserSigningIn();
$user2 = factory(User::class)->create();
$user2->assignRole('worker');
$this->visit(route('users.edit', $user2->id));
$this->type('Ganti nama User', 'name');
@ -72,7 +71,6 @@ class ManageUsersTest extends TestCase
{
$user = $this->adminUserSigningIn();
$user2 = factory(User::class)->create();
$user2->assignRole('worker');
$this->visit(route('users.edit', $user2->id));

41
tests/Unit/Models/UserTest.php

@ -19,47 +19,6 @@ class UserTest extends TestCase
}
/** @test */
public function user_can_assigned_to_a_role()
{
$user = factory(User::class)->create();
$user->assignRole('admin');
$this->assertTrue($user->hasRole('admin'));
}
/** @test */
public function user_has_many_roles()
{
$user = factory(User::class)->create();
$user->assignRole('admin');
$user->assignRole('worker');
$this->assertTrue($user->hasRoles(['admin', 'worker']));
}
/** @test */
public function user_can_be_removed_from_a_role()
{
$user = factory(User::class)->create();
$user->assignRole('admin');
$user->assignRole('worker');
$this->assertTrue($user->hasRoles(['admin', 'worker']));
$user->removeRole('worker');
$this->assertFalse($user->fresh()->hasRole('worker'));
}
/** @test */
public function user_can_queried_by_roles()
{
$user = factory(User::class)->create();
$user->assignRole('worker');
$this->assertCount(1, User::orderBy('name')->hasRoles(['worker'])->get());
}
/** @test */
public function user_can_owns_one_agency()
{
$user = factory(User::class)->create();

Loading…
Cancel
Save