You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
6.6 KiB
229 lines
6.6 KiB
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\User;
|
|
use App\Models\Role;
|
|
use App\Models\Permission;
|
|
use App\Models\Organization;
|
|
use App\Traits\Authorizable;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class UserManagementController extends Controller
|
|
{
|
|
use Authorizable;
|
|
|
|
/**
|
|
* Display a listing of the resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
if(!Auth::user()->hasAnyRole(['Super Admin', 'Admin'])) {
|
|
User::where('organization_id', Auth::user()->organization_id);
|
|
}
|
|
|
|
if($request->get('email')) {
|
|
$result = User::where('email', $request->get('email'))->addSelect(['organization_name' => Organization::select('name')->whereColumn('organization_id', 'organizations.id')])->paginate();
|
|
}
|
|
else {
|
|
$result = User::addSelect(['organization_name' => Organization::select('name')->whereColumn('organization_id', 'organizations.id')])->latest()->paginate();
|
|
}
|
|
|
|
return view('user.index', compact('result'));
|
|
}
|
|
|
|
/**
|
|
* Show the form for creating a new resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function create()
|
|
{
|
|
$roles = Role::whereNot('name', 'Super Admin')->pluck('name', 'id');
|
|
|
|
if(Auth::user()->hasAnyRole(['Super Admin', 'Admin'])) {
|
|
$organizations = Organization::latest()->pluck('name', 'id');
|
|
} else {
|
|
$organizations = Organization::where('id', Auth::user()->organization_id)->pluck('name', 'id');
|
|
}
|
|
|
|
return view('user.new', compact('roles', 'organizations'));
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
$this->validate($request, [
|
|
'name' => 'bail|required|min:2',
|
|
'email' => 'required|email|unique:users',
|
|
'password' => 'required|min:6',
|
|
'roles' => 'required|min:1',
|
|
'organization_id' => 'required',
|
|
]);
|
|
|
|
if(!Auth::user()->hasAnyRole(['Super Admin', 'Admin'])) {
|
|
$request->merge(['organization_id' => Auth::user()->organization_id]);
|
|
}
|
|
|
|
// hash password
|
|
$request->merge(['password' => bcrypt($request->get('password'))]);
|
|
|
|
// Create the user
|
|
if ( $user = User::create($request->except('roles', 'permissions')) ) {
|
|
|
|
$this->syncPermissions($request, $user);
|
|
|
|
flash('User has been created.');
|
|
|
|
} else {
|
|
flash()->error('Unable to create user.');
|
|
}
|
|
|
|
return redirect()->route('users.index');
|
|
}
|
|
|
|
/**
|
|
* Display the specified resource.
|
|
*
|
|
* @param int $id
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function show($id)
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Show the form for editing the specified resource.
|
|
*
|
|
* @param int $id
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function edit($id)
|
|
{
|
|
$user = User::find($id);
|
|
$roles = Role::whereNot('name', 'Super Admin')->pluck('name', 'id');
|
|
// $permissions = Permission::all('name', 'id');
|
|
$permissions = Permission::all();
|
|
|
|
if(Auth::user()->hasAnyRole(['Super Admin', 'Admin'])) {
|
|
$organizations = Organization::latest()->pluck('name', 'id');
|
|
} else {
|
|
$organizations = Organization::where('id', Auth::user()->organization_id)->pluck('name', 'id');
|
|
}
|
|
|
|
return view('user.edit', compact('user', 'roles', 'permissions', 'organizations'));
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @param int $id
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function update(Request $request, $id)
|
|
{
|
|
$this->validate($request, [
|
|
'name' => 'bail|required|min:2',
|
|
'email' => 'required|email|unique:users,email,' . $id,
|
|
'roles' => 'required|min:1',
|
|
'organization_id' => 'required',
|
|
]);
|
|
|
|
// Get the user
|
|
$user = User::findOrFail($id);
|
|
|
|
if(!Auth::user()->hasAnyRole(['Super Admin', 'Admin']) && Auth::user()->organization_id != $user->organization_id) {
|
|
flash()->warning('Update of other organization is not allowed :(')->important();
|
|
return redirect()->back();
|
|
}
|
|
|
|
// Update user
|
|
$user->fill($request->except('roles', 'permissions', 'password'));
|
|
|
|
// check for password change
|
|
if($request->get('password')) {
|
|
$user->password = bcrypt($request->get('password'));
|
|
}
|
|
|
|
$user->organization_id = $request->organization_id;
|
|
|
|
// Handle the user roles
|
|
$this->syncPermissions($request, $user);
|
|
|
|
$user->save();
|
|
|
|
flash()->success('User has been updated.');
|
|
|
|
return redirect()->route('users.index');
|
|
}
|
|
|
|
/**
|
|
* Remove the specified resource from storage.
|
|
*
|
|
* @param int $id
|
|
* @return \Illuminate\Http\Response
|
|
* @internal param Request $request
|
|
*/
|
|
public function destroy($id)
|
|
{
|
|
$user = User::findOrFail($id);
|
|
|
|
if(!Auth::user()->hasAnyRole(['Super Admin', 'Admin']) && Auth::user()->organization_id != $user->organization_id) {
|
|
flash()->warning('Deletion of other organization is not allowed :(')->important();
|
|
return redirect()->back();
|
|
}
|
|
|
|
if ( Auth::user()->id == $id ) {
|
|
flash()->warning('Deletion of currently logged in user is not allowed :(')->important();
|
|
return redirect()->back();
|
|
}
|
|
|
|
if( $user->delete() ) {
|
|
flash()->success('User has been deleted');
|
|
} else {
|
|
flash()->success('User not deleted');
|
|
}
|
|
|
|
return redirect()->back();
|
|
}
|
|
|
|
/**
|
|
* Sync roles and permissions
|
|
*
|
|
* @param Request $request
|
|
* @param $user
|
|
* @return string
|
|
*/
|
|
private function syncPermissions(Request $request, $user)
|
|
{
|
|
// Get the submitted roles
|
|
$roles = $request->get('roles', []);
|
|
$permissions = $request->get('permissions', []);
|
|
|
|
// Get the roles
|
|
$roles = Role::find($roles);
|
|
|
|
// check for current role changes
|
|
// if( ! $user->hasAllRoles( $roles ) ) {
|
|
// // reset all direct permissions for user
|
|
// $user->permissions()->sync([]);
|
|
// } else {
|
|
// // handle permissions
|
|
// $user->syncPermissions($permissions);
|
|
// }
|
|
|
|
$user->syncRoles($roles);
|
|
|
|
return $user;
|
|
}
|
|
}
|
|
|