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 = '
';
+ foreach ($this->roles as $role) {
+ $roleList .= '- '.$role->name.'
';
+ }
+ $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')
- ]) !!}