2020-06-08 13:08:46 +00:00
< ? php
namespace App\Http\Controllers ;
2020-06-22 19:08:09 +00:00
use App\Helpers\Detector ;
2020-06-08 13:08:46 +00:00
use Illuminate\Http\Request ;
2020-06-23 04:42:43 +00:00
use Illuminate\Http\Response ;
2020-06-10 06:25:21 +00:00
use App\User ;
use Illuminate\Support\Facades\Auth ;
2020-07-07 17:29:21 +00:00
use Illuminate\Support\Facades\DB ;
2020-07-27 11:09:51 +00:00
use Illuminate\Support\Facades\Hash ;
2020-06-22 12:53:00 +00:00
use Illuminate\Support\Facades\Log ;
2020-07-29 11:33:11 +00:00
use mysql_xdevapi\Table ;
2020-06-30 10:08:31 +00:00
use Spatie\Permission\Models\Role ;
2020-06-10 06:25:21 +00:00
2020-06-08 13:08:46 +00:00
class UserController extends Controller
{
2020-06-15 06:59:15 +00:00
public function __construct ()
{
2020-06-29 12:28:09 +00:00
$this -> middleware ([ " auth " ]) -> only ( " logout " );
$this -> middleware ([ " guest " ]) -> only ( " login " );
$this -> middleware ([ " check.auth:user.list " ]) -> only ( " index " );
$this -> middleware ([ " check.auth:user.show " ]) -> only ( " show " );
$this -> middleware ([ " check.auth:user.create " ]) -> only ( " create " );
$this -> middleware ([ " check.auth:user.edit " ]) -> only ( " edit " , " update " );
$this -> middleware ([ " check.auth:user.delete " ]) -> only ( " delete " );
2020-06-15 06:59:15 +00:00
}
2020-06-08 13:08:46 +00:00
/**
* Display a listing of the resource .
*
2020-06-10 06:25:21 +00:00
* @ param Request $request
* @ return \Illuminate\Contracts\Foundation\Application | \Illuminate\Contracts\View\Factory | \Illuminate\View\View
2020-06-08 13:08:46 +00:00
*/
2020-06-10 06:25:21 +00:00
public function index ( Request $request )
2020-06-08 13:08:46 +00:00
{
2020-06-22 12:53:00 +00:00
$users = User :: query () -> paginate ( $request -> query ( " page " , 20 ));
2020-06-10 06:25:21 +00:00
2020-06-23 04:42:43 +00:00
return Response :: detect ( " users.index " , [ " users " => $users ]);
2020-06-08 13:08:46 +00:00
}
/**
* Show the form for creating a new resource .
*
2020-06-10 06:25:21 +00:00
* @ return \Illuminate\Contracts\Foundation\Application | \Illuminate\Contracts\View\Factory | \Illuminate\View\View
2020-06-08 13:08:46 +00:00
*/
public function create ()
{
2020-06-30 10:08:31 +00:00
$roles = Role :: all ();
return Response :: detect ( " users.create " , [ 'roles' => $roles ]);
2020-06-08 13:08:46 +00:00
}
/**
* Store a newly created resource in storage .
*
* @ param \Illuminate\Http\Request $request
2020-06-10 06:25:21 +00:00
* @ return \Illuminate\Contracts\Foundation\Application | \Illuminate\Contracts\View\Factory | \Illuminate\View\View
2020-06-08 13:08:46 +00:00
*/
public function store ( Request $request )
{
2020-06-10 06:25:21 +00:00
$data = $request -> validate ([
" name_first " => " required|max:255 " ,
" name_last " => " required|max:255 " ,
" email " => " required|email|unique:users " ,
" password " => " required|max:60 " ,
" phone " => " required|unique:users " ,
]);
2020-07-28 08:22:45 +00:00
$rolez = $request -> input ( " roles " , [ " User " ]);
2020-06-10 06:25:21 +00:00
$user = new User ( $data );
2020-06-22 12:53:00 +00:00
2020-07-28 08:22:45 +00:00
$user -> assignRole ( $rolez );
2020-06-10 06:25:21 +00:00
$user -> save ();
2020-06-22 12:53:00 +00:00
2020-06-29 12:28:09 +00:00
return Response :: detect ( " users.store " );
2020-06-08 13:08:46 +00:00
}
/**
* Display the specified resource .
*
* @ param int $id
2020-06-10 06:25:21 +00:00
* @ return \Illuminate\Contracts\Foundation\Application | \Illuminate\Contracts\View\Factory | \Illuminate\View\View
2020-06-08 13:08:46 +00:00
*/
public function show ( $id )
{
2020-06-10 06:25:21 +00:00
$user = User :: find ( $id );
2020-06-25 08:34:10 +00:00
return Response :: detect ( " users.show " , [
2020-06-10 06:25:21 +00:00
" user " => $user
]);
2020-06-08 13:08:46 +00:00
}
/**
* Show the form for editing the specified resource .
*
* @ param int $id
2020-06-10 06:25:21 +00:00
* @ return \Illuminate\Contracts\Foundation\Application | \Illuminate\Contracts\View\Factory | \Illuminate\View\View
2020-06-08 13:08:46 +00:00
*/
public function edit ( $id )
{
2020-06-30 10:11:18 +00:00
$roles = Role :: all ();
2020-06-10 06:25:21 +00:00
$user = User :: find ( $id );
2020-06-24 06:53:07 +00:00
return Response :: detect ( " users.edit " , [
2020-06-30 10:11:18 +00:00
" user " => $user ,
" roles " => $roles ,
2020-06-10 06:25:21 +00:00
]);
2020-06-08 13:08:46 +00:00
}
/**
* Update the specified resource in storage .
*
* @ param \Illuminate\Http\Request $request
* @ param int $id
2020-06-10 10:30:44 +00:00
* @ return \Illuminate\Contracts\Foundation\Application | \Illuminate\Contracts\View\Factory | \Illuminate\View\View
2020-06-08 13:08:46 +00:00
*/
public function update ( Request $request , $id )
{
2020-06-29 07:08:49 +00:00
$data = $request -> all ();
2020-06-10 10:30:44 +00:00
2020-06-29 07:08:49 +00:00
// $data = $request->validate([
// "name_first" => "max:255",
// "name_last" => "max:255",
// "email" => "email|unique:users",
// "password" => "max:60",
// "phone" => "unique:users",
// ]);
2020-06-10 10:30:44 +00:00
2020-06-29 07:08:49 +00:00
// Validates if the user is updating itself or another user.
// if($id === Auth::id()) {
// $user = Auth::user();
2020-06-29 06:50:50 +00:00
//
// $user->update($data);
//
// $user->save();
2020-06-29 07:08:49 +00:00
// return Response::detect("users.edit", [
// "user" => $user
// ]);
2020-06-29 06:50:50 +00:00
// }
2020-06-10 10:30:44 +00:00
2020-06-29 07:08:49 +00:00
//TODO: Implement when security's ready!!!
// else if(Auth::user()->hasPermissionTo("user.edit")) {
$user = User :: find ( $id );
2020-07-27 12:01:04 +00:00
if ( $request -> roles != null ) { //You can only edit roles on the admin site, so if there is an input roles, then update user info and edit roles
2020-07-27 11:09:51 +00:00
/** @var User $user */
$user -> update ( $data );
2020-07-01 08:13:49 +00:00
$user -> roles () -> detach ();
$user -> forgetCachedPermissions ();
2020-06-30 11:22:02 +00:00
2020-07-01 08:13:49 +00:00
foreach ( $request -> roles as $role ){
$user -> assignRole ( $role );
}
2020-07-27 11:09:51 +00:00
//$user->save();
2020-07-27 12:01:04 +00:00
} else { // Else if you're not on the admin site (user site)
if ( $request -> input ( 'password' ) != null ) { // If you're editing the password
2020-07-28 08:31:44 +00:00
if ( $request -> input ( 'password' ) != $request -> input ( 'confirmpassword' )) { // If new password and new password confirm is not the same, go back with fail message.
return redirect () -> route ( " users.accounteditpass " ) -> with ( 'error#notsamepass' , '<p class="text-center">Der stod ikke det samme i `Nyt Password` & `Bekræft Nyt Password`!</p>' );
} elseif ( ! Hash :: check ( $request -> input ( 'oldpassword' ), $user -> password )) { // If the written current password and current password in DB is not the same, go back with fail message.
return redirect () -> route ( " users.accounteditpass " ) -> with ( 'error#oldpass' , '<p class="text-center">Det indtastede password i `Nuværende Password` er ikke dit nuværende password!</p>' );
2020-07-27 12:01:04 +00:00
} else { // If new password and current password is the same AND current written and current DB password is the same. Then update and logout.
2020-07-27 11:22:45 +00:00
/** @var User $user */
$user -> update ( $data );
Auth :: logout ();
2020-07-28 08:31:44 +00:00
return redirect () -> route ( " users.login " ) -> with ( 'success#passwordchange' , '<p class="text-center">Dit password er hermed ændret!</p>' );
2020-07-27 11:22:45 +00:00
}
2020-07-27 12:01:04 +00:00
} else { // Else if you're not editing the password but anything else (Email, Phone Number). Then update user.
2020-07-27 11:09:51 +00:00
$user -> update ( $data );
}
2020-07-27 11:22:45 +00:00
2020-06-30 11:22:02 +00:00
}
2020-06-29 07:08:49 +00:00
// }
$users = User :: query () -> paginate ( 20 );
return Response :: detect ( " users.index " , [
" users " => $users
2020-06-10 10:30:44 +00:00
]);
2020-06-08 13:08:46 +00:00
}
/**
* Remove the specified resource from storage .
*
* @ param int $id
2020-06-10 10:30:44 +00:00
* @ return \Illuminate\Contracts\Foundation\Application | \Illuminate\Contracts\View\Factory | \Illuminate\View\View
2020-06-08 13:08:46 +00:00
*/
public function destroy ( $id )
{
2020-06-29 07:08:49 +00:00
// if($id === Auth::id()) {
// $user = Auth::user();
// $user->delete();
// }
// else if(Auth::user()->hasPermissionTo("user.delete")) {
2020-06-10 10:30:44 +00:00
$user = User :: find ( $id );
$user -> delete ();
2020-06-29 07:08:49 +00:00
// }
2020-06-10 10:30:44 +00:00
2020-06-29 07:08:49 +00:00
return redirect () -> route ( " users.index " );
2020-06-08 13:08:46 +00:00
}
2020-06-10 06:25:21 +00:00
/*******************************************/
/* Authentication */
/*******************************************/
2020-06-16 06:13:24 +00:00
public function showLogin () {
2020-07-30 06:20:30 +00:00
if ( Auth :: user () == null )
return Response :: detect ( " users.login " );
else
return redirect () -> back ();
2020-06-16 06:13:24 +00:00
}
2020-06-10 06:25:21 +00:00
public function login ( Request $request ) {
$data = $request -> only ( " email " , " password " );
if ( Auth :: attempt ( $data )) {
2020-06-10 10:30:44 +00:00
//TODO: Implement home?
2020-07-29 09:53:37 +00:00
2020-06-29 12:28:09 +00:00
return redirect () -> route ( " root.index " );
2020-06-10 06:25:21 +00:00
}
2020-06-16 06:13:24 +00:00
return redirect () -> back ( 303 );
2020-06-10 10:30:44 +00:00
}
public function logout ( Request $request ) {
Auth :: logout ();
2020-06-30 08:42:10 +00:00
return redirect () -> route ( " users.login " );
2020-06-10 06:25:21 +00:00
}
2020-06-30 08:19:01 +00:00
/*******************************************/
/* Forgot password */
/*******************************************/
public function showForgot (){
return Response :: detect ( 'users.forgot' );
}
2020-06-30 08:35:09 +00:00
public function forgot ( Request $request ){
$user = User :: query () -> where ( 'email' , '=' , $request -> email ) -> first ();
2020-06-30 08:19:01 +00:00
2020-06-30 08:35:09 +00:00
if ( $user == null ){
return redirect () -> back ();
}
//Send email
//TODO: Implement mail.
return redirect () -> route ( 'users.login' );
2020-06-30 08:19:01 +00:00
}
2020-06-30 12:40:46 +00:00
public function account ()
{
return Response :: detect ( " users.account " );
}
public function accountedit ()
{
return Response :: detect ( " users.edit " );
}
2020-07-01 08:13:49 +00:00
public function accounteditpass ()
{
return Response :: detect ( " users.editpass " );
}
2020-07-01 09:46:29 +00:00
2020-07-27 14:03:49 +00:00
public function search ( Request $request ){
if ( $request -> ajax ()){
$output = " <tr> " .
" <th>Fornavn</th> " .
" <th>Efternavn</th> " .
" <th>Email</th> " .
" <th>Tlf nr</th> " .
" <th>Rolle(r)</th> " .
" <th style= \" width: 1em; \" ><img class= \" w-100 \" src= \" http://127.0.0.1:8000/images/icons/pencil.svg \" alt= \" Update \" ></th> " .
" <th style= \" width: 1em; \" ><img class= \" w-100 \" src= \" http://127.0.0.1:8000/images/icons/trashcan.svg \" alt= \" Delete \" ></th> " .
" </tr> " ;
2020-07-29 07:49:54 +00:00
2020-07-29 11:33:11 +00:00
//Join user and roles tables
//$users = User::query()->where('Roles', 'LIKE',$request->search.'%')->with(Spatie\Permission\Models\Role)->get();
2020-07-29 07:49:54 +00:00
//filter search
if ( $request -> isCheck === " navn " )
$users = User :: query () -> where ( 'name_first' , 'LIKE' , $request -> search . '%' ) -> get ();
elseif ( $request -> isCheck === " efternavn " )
$users = User :: query () -> where ( 'name_last' , 'LIKE' , $request -> search . '%' ) -> get ();
elseif ( $request -> isCheck === " email " )
$users = User :: query () -> where ( 'email' , 'LIKE' , $request -> search . '%' ) -> get ();
elseif ( $request -> isCheck === " telefon " )
$users = User :: query () -> where ( 'phone' , 'LIKE' , $request -> search . '%' ) -> get ();
2020-07-29 11:33:11 +00:00
elseif ( $request -> isCheck === " telefon " )
$users = User :: query () -> where ( 'phone' , 'LIKE' , $request -> search . '%' ) -> get ();
2020-07-30 09:02:41 +00:00
elseif ( $request -> isCheck ) {
$roles = Role :: query () -> where ( 'name' , 'LIKE' , $request -> search . '%' ) -> get ();
$usersTEMP = User :: all ();
$users = [];
foreach ( $usersTEMP as $user ) {
foreach ( $roles as $role ) {
if ( $user -> hasRole ( $role )) {
array_push ( $users , $user );
break 2 ;
}
}
}
if ( $request -> search == " " )
$users = User :: all ();
} else {
$usersTEMP = User :: query ()
-> where ( 'name_first' , 'LIKE' , $request -> search . '%' )
-> orWhere ( 'name_last' , 'LIKE' , $request -> search . '%' )
-> orWhere ( 'phone' , 'LIKE' , $request -> search . '%' )
-> orWhere ( 'email' , 'LIKE' , $request -> search . '%' )
-> orWhere ( 'name' , 'LIKE' , $request -> search . '%' )
2020-07-29 11:33:11 +00:00
-> get ();
2020-07-30 09:02:41 +00:00
$roles = Role :: query () -> where ( 'name' , 'LIKE' , $request -> search . '%' ) -> get ();
$users = [];
$allUsers = User :: all ();
//For hver user i systemet, check om han har en af de roller der matcher søgeordet
foreach ( $allUsers as $user ) {
foreach ( $roles as $role ) {
if ( $user -> hasRole ( $role )) {
array_push ( $users , $user );
break 2 ;
}
}
}
//For hver user der har data, der matcher søgeordet, check om useren allerede er i resultatet, hvis ikke så tilføj ham
foreach ( $usersTEMP as $userTEMP ){
$isInUsers = false ;
foreach ( $users as $user ) {
if ( $userTEMP == $user ) {
$isInUsers = true ;
break 2 ;
}
}
if ( $isInUsers == false )
array_push ( $users , $userTEMP );
}
2020-07-27 14:03:49 +00:00
2020-07-30 09:02:41 +00:00
$i = 0 ;
foreach ( $users as $user ){
$i ++ ;
foreach ( $users as $userr ){
if ( $user -> id == $userr -> id ) {
unset ( $users [ $i ]);
break 2 ;
}
}
}
}
2020-07-29 07:49:54 +00:00
//Dont delete
/* elseif ( $request -> isCheck === " rolle " )
$users = User :: query () -> where ( 'rolle' , 'LIKE' , $request -> search . '%' ); */
2020-07-27 14:03:49 +00:00
if ( count ( $users ) !== 0 ){
foreach ( $users as $key => $user ){
2020-07-28 12:23:54 +00:00
2020-07-27 14:03:49 +00:00
$roles = null ;
$rolesString = null ;
foreach ( User :: all () as $usr ) {
if ( $usr -> id == $user -> id )
$roles = $usr -> roles ;
}
for ( $i = 0 ; $i < count ( $roles ); $i ++ ) {
if ( count ( $roles ) - 1 != $i ) {
$rolesString .= $roles [ $i ] -> name . " , " ;
} else {
$rolesString = $roles [ $i ] -> name ;
}
}
$output .= '<tr>' .
'<td>' . $user -> name_first . '</td>' .
'<td>' . $user -> name_last . '</td>' .
'<td>' . $user -> email . '</td>' .
'<td>' . $user -> phone . '</td>' .
2020-07-30 09:02:41 +00:00
'<td>' . $rolesString . '</td>' .
2020-07-27 14:03:49 +00:00
'<td><a href="' . route ( " users.edit " , [ " user " => $user -> id ]) . '"><img class="w-100" src="' . asset ( '/images/icons/pencil-dark.svg' ) . '" alt="Update"></a></td>' .
'<td><form method="post" action="' . route ( " users.destroy " , [ " user " => $user -> id ]) . '" class="w-100 nostyle">' .
csrf_field () .
method_field ( " delete " ) .
'<button class="w-100 nostyle" onclick="return confirm(\'Are you sure you want to delete?\');" type="submit"><img class="w-100 cursor-pointer" src="' . asset ( '/images/icons/trashcan-dark.svg' ) . '" alt="Delete"></button>' .
'</form>' .
'</td>' .
'</tr>' ;
}
2020-07-28 12:23:54 +00:00
} else {
$output .= '<tr>' .
'<td>Intet match</td>' .
'<td></td>' .
'<td></td>' .
'<td></td>' .
'<td></td>' .
'<td></td>' .
'<td></td>' .
'</tr>' ;
2020-07-27 14:03:49 +00:00
}
return Response ( $output );
}
}
2020-06-08 13:08:46 +00:00
}