diff --git a/app/Entities/Users/Role.php b/app/Entities/Users/Role.php new file mode 100644 index 0000000..43698fe --- /dev/null +++ b/app/Entities/Users/Role.php @@ -0,0 +1,36 @@ + 'admin', + 2 => 'worker', + ]; + + public static function getNameById($roleId) + { + return trans('user.roles.'.static::$lists[$roleId]); + } + + public static function getIdByName($roleName) + { + return array_search($roleName, static::$lists); + } + + public static function toArray() + { + $lists = []; + foreach (static::$lists as $key => $value) { + $lists[$key] = trans('user.roles.'.$value); + } + + return $lists; + } +} diff --git a/app/Entities/Users/User.php b/app/Entities/Users/User.php index 525018b..644ed80 100644 --- a/app/Entities/Users/User.php +++ b/app/Entities/Users/User.php @@ -10,7 +10,7 @@ class User extends Authenticatable use Notifiable; protected $fillable = ['name', 'email', 'password', 'api_token']; - protected $hidden = ['password', 'remember_token', 'api_token']; + protected $hidden = ['password', 'remember_token', 'api_token']; public function setPasswordAttribute($value) { @@ -21,4 +21,103 @@ 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->hasMany(UserRole::class); + } + + /** + * Assign the given role to the user. + * + * @param string $role + * @return void + */ + public function assignRole(string $roleName) + { + $roleId = Role::getIdByName($roleName); + + UserRole::create([ + 'user_id' => $this->id, + 'role_id' => $roleId, + ]); + } + + /** + * Remove the given role from the user. + * + * @param string $role + * @return void + */ + public function removeRole(string $roleName) + { + $roleId = Role::getIdByName($roleName); + + \DB::table('user_roles')->where([ + 'user_id' => $this->id, + 'role_id' => $roleId, + ])->delete(); + } + + /** + * Determine if the user has the given role. + * + * @param string $role + * @return boolean + */ + public function hasRole(string $roleName) + { + $roleId = Role::getIdByName($roleName); + + return $this->roles->contains('role_id', $roleId); + } + + /** + * Determine if the user has the given array of role. + * + * @param array $role + * @return boolean + */ + public function hasRoles(array $roleNameArray) + { + return $this->roles->pluck('role_id') + ->contains(function ($roleId, $key) use ($roleNameArray) { + $roleIds = []; + + foreach ($roleNameArray as $roleName) { + $roleIds[] = Role::getIdByName($roleName); + } + + return in_array($roleId, $roleIds); + }); + } + + public function scopeHasRoles($query, array $roleNameArray) + { + return $query->whereHas('roles', function ($q) use ($roleNameArray) { + $roleIds = []; + + foreach ($roleNameArray as $roleName) { + $roleIds[] = Role::getIdByName($roleName); + } + + $q->whereIn('role_id', $roleIds); + }); + } + + public function roleList() + { + $roleList = ''; + + return $roleList; + } } diff --git a/app/Entities/Users/UserRole.php b/app/Entities/Users/UserRole.php new file mode 100644 index 0000000..bb37742 --- /dev/null +++ b/app/Entities/Users/UserRole.php @@ -0,0 +1,21 @@ + + */ +class UserRole extends Model +{ + protected $table = 'user_roles'; + public $timestamps = false; + protected $appends = ['name']; + protected $fillable = ['user_id', 'role_id']; + + public function getNameAttribute() + { + return Role::getNameById($this->role_id); + } +} diff --git a/app/Http/Controllers/Users/UsersController.php b/app/Http/Controllers/Users/UsersController.php index cba278c..0bd61c1 100755 --- a/app/Http/Controllers/Users/UsersController.php +++ b/app/Http/Controllers/Users/UsersController.php @@ -7,6 +7,8 @@ use App\Http\Controllers\Controller; use Illuminate\Http\Request; /** + * Users Controller + * * @author Nafies Luthfi */ class UsersController extends Controller @@ -15,6 +17,7 @@ class UsersController extends Controller { $query = $request->get('q'); $users = User::where('name', 'like', '%'.$query.'%') + ->with('roles') ->paginate(25); return view('users.index', compact('users')); @@ -30,8 +33,8 @@ class UsersController extends Controller $userData = $request->validate([ 'name' => 'required|min:5', 'email' => 'required|email|unique:users,email', - 'password' => 'nullable|between:6,15|confirmed', - // 'password_confirmation' => 'required_with:password', + 'password' => 'nullable|between:6,15', + 'role' => 'required|array', ]); if (!$userData['password']) { @@ -40,6 +43,15 @@ class UsersController extends Controller $user = User::create($userData); + $rolesData = array_map(function ($roleId) use ($user) { + return [ + 'user_id' => $user->id, + 'role_id' => $roleId, + ]; + }, $userData['role']); + + \DB::table('user_roles')->insert($rolesData); + flash()->success(trans('user.created')); return redirect()->route('users.index'); @@ -62,14 +74,25 @@ class UsersController extends Controller $this->authorize('update', $user); $userData = $request->validate([ - 'name' => 'required|min:5', - 'email' => 'required|email|unique:users,email,'.$request->segment(2), - 'password' => 'nullable|required_with:password_confirmation|between:6,15|confirmed', - 'password_confirmation' => 'required_with:password', + 'name' => 'required|min:5', + 'email' => 'required|email|unique:users,email,'.$request->segment(2), + 'password' => 'nullable|required_with:password_confirmation|between:6,15', + 'role' => 'required|array', ]); $user->update($userData); + \DB::table('user_roles')->where(['user_id' => $user->id])->delete(); + + $rolesData = array_map(function ($roleId) use ($user) { + return [ + 'user_id' => $user->id, + 'role_id' => $roleId, + ]; + }, $userData['role']); + + \DB::table('user_roles')->insert($rolesData); + flash()->success(trans('user.updated')); return redirect()->route('users.edit', $user->id); } diff --git a/database/migrations/2017_10_28_170121_create_agencies_table.php b/database/migrations/2017_10_28_170121_create_agencies_table.php deleted file mode 100644 index b85c38c..0000000 --- a/database/migrations/2017_10_28_170121_create_agencies_table.php +++ /dev/null @@ -1,37 +0,0 @@ -increments('id'); - $table->string('name'); - $table->string('email')->unique(); - $table->string('address')->nullable(); - $table->string('phone')->nullable(); - $table->string('website')->nullable(); - $table->unsignedInteger('owner_id'); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('agencies'); - } -} diff --git a/database/migrations/2017_11_14_061927_create_user_roles_table.php b/database/migrations/2017_11_14_061927_create_user_roles_table.php new file mode 100644 index 0000000..37e0e83 --- /dev/null +++ b/database/migrations/2017_11_14_061927_create_user_roles_table.php @@ -0,0 +1,33 @@ +unsignedInteger('user_id'); + $table->unsignedTinyInteger('role_id'); + + $table->unique(['user_id', 'role_id'], 'user_role_unique'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_roles'); + } +} diff --git a/resources/lang/id/user.php b/resources/lang/id/user.php index 88549ad..294082b 100644 --- a/resources/lang/id/user.php +++ b/resources/lang/id/user.php @@ -14,19 +14,27 @@ return [ 'back_to_index' => 'Kembali ke Daftar User', // Actions - 'create' => 'Input User Baru', - 'created' => 'Input User baru telah berhasil.', - 'show' => 'Detail User', - 'edit' => 'Edit Data User', - 'update' => 'Update Data User', - 'updated' => 'Update data User telah berhasil.', - 'delete' => 'Hapus Data User', - 'deleted' => 'Hapus data User telah berhasil.', - 'undeleted' => 'Data User gagal dihapus.', + 'create' => 'Input User Baru', + 'created' => 'Input User baru telah berhasil.', + 'show' => 'Detail User', + 'edit' => 'Edit Data User', + 'update' => 'Update Data User', + 'updated' => 'Update data User telah berhasil.', + 'delete' => 'Hapus Data User', + 'deleted' => 'Hapus data User telah berhasil.', + 'undeleted' => 'Data User gagal dihapus.', // Attributes 'name' => 'Nama User', 'email' => 'Alamat Email', 'api_token' => 'API Token', 'registered_at' => 'Terdaftar sejak', + + // Roles + + 'role' => 'Role', + 'roles' => [ + 'admin' => 'Administrator', + 'worker' => 'Worker', + ], ]; diff --git a/resources/views/users/create.blade.php b/resources/views/users/create.blade.php index b0e1479..ff18d27 100755 --- a/resources/views/users/create.blade.php +++ b/resources/views/users/create.blade.php @@ -1,3 +1,4 @@ +@inject('roles', 'App\Entities\Users\Role') @extends('layouts.dashboard') @section('title', trans('user.create')) @@ -11,6 +12,7 @@
{!! FormField::text('name', ['label' => trans('app.name')]) !!} {!! FormField::email('email', ['label' => trans('user.email')]) !!} + {!! FormField::checkboxes('role', $roles::toArray(), ['label' => trans('user.role')]) !!} {!! FormField::password('password', [ 'label' => trans('auth.password'), @@ -19,10 +21,6 @@ 'class' => 'info', ], ]) !!} - - {!! FormField::password('password_confirmation', [ - 'label' => trans('auth.password_confirmation') - ]) !!}