Cleanup user edit page and show their pireps; log last IP address #110

This commit is contained in:
Nabeel Shahzad
2018-01-07 15:09:22 -06:00
parent ab7fa3b293
commit 247310b4e7
32 changed files with 131 additions and 56 deletions

View File

@@ -31,6 +31,7 @@ class CreateUsersTable extends Migration
$table->unsignedTinyInteger('status')->default(0);
$table->unsignedTinyInteger('state')->default(0);
$table->boolean('active')->nullable();
$table->ipAddress('last_ip')->nullable();
$table->rememberToken();
$table->timestamps();
$table->softDeletes();

View File

@@ -2,16 +2,22 @@
namespace App\Http\Controllers\Admin;
use App\Facades\Utils;
use App\Models\User;
use DB;
use Hash;
use Illuminate\Support\Facades\Auth;
use Log;
use Flash;
use Prettus\Repository\Exceptions\RepositoryException;
use Response;
use Jackiedo\Timezonelist\Facades\Timezonelist;
use Illuminate\Http\Request;
use App\Http\Requests\CreateUserRequest;
use App\Http\Requests\UpdateUserRequest;
use App\Repositories\PirepRepository;
use App\Repositories\UserRepository;
use App\Services\UserService;
@@ -22,8 +28,8 @@ use App\Models\Role;
class UserController extends BaseController
{
/** @var UserRepository */
private $userRepo,
private $pirepRepo,
$userRepo,
$userSvc;
/**
@@ -32,18 +38,23 @@ class UserController extends BaseController
* @param UserRepository $userRepo
*/
public function __construct(
PirepRepository $pirepRepo,
UserRepository $userRepo,
UserService $userSvc
) {
$this->pirepRepo = $pirepRepo;
$this->userSvc = $userSvc;
$this->userRepo = $userRepo;
}
public function index(Request $request)
{
$users = $this->userRepo->searchCriteria($request, false)
->orderBy('created_at', 'desc')
->paginate();
try {
$users = $this->userRepo->searchCriteria($request, false)
->orderBy('created_at', 'desc')
->paginate();
} catch (RepositoryException $e) {
}
return view('admin.users.index', [
'users' => $users,
@@ -52,7 +63,6 @@ class UserController extends BaseController
/**
* Show the form for creating a new User.
*
* @return Response
*/
public function create()
@@ -64,10 +74,9 @@ class UserController extends BaseController
/**
* Store a newly created User in storage.
*
* @param CreateUserRequest $request
*
* @return Response
* @throws \Prettus\Validator\Exceptions\ValidatorException
*/
public function store(CreateUserRequest $request)
{
@@ -80,9 +89,7 @@ class UserController extends BaseController
/**
* Display the specified User.
*
* @param int $id
*
* @return Response
*/
public function show($id)
@@ -94,8 +101,13 @@ class UserController extends BaseController
return redirect(route('admin.users.index'));
}
$pireps = $this->pirepRepo
->whereOrder(['user_id' => $id], 'created_at', 'desc')
->paginate();
return view('admin.users.show', [
'user' => $user,
'pireps' => $pireps,
'airlines' => Airline::all(),
'timezones' => Timezonelist::toArray(),
'airports' => Airport::all()->pluck('icao', 'id'),
@@ -120,8 +132,13 @@ class UserController extends BaseController
return redirect(route('admin.users.index'));
}
$pireps = $this->pirepRepo
->whereOrder(['user_id' => $id], 'created_at', 'desc')
->paginate();
return view('admin.users.edit', [
'user' => $user,
'pireps' => $pireps,
'timezones' => Timezonelist::toArray(),
'airports' => Airport::all()->pluck('icao', 'id'),
'airlines' => Airline::all()->pluck('name', 'id'),
@@ -193,4 +210,19 @@ class UserController extends BaseController
Flash::success('User deleted successfully.');
return redirect(route('admin.users.index'));
}
/**
* Regenerate the user's API key
*/
public function regen_apikey($id, Request $request)
{
$user = User::find($id);
Log::info('Regenerating API key "' . $user->pilot_id . '"');
$user->api_key = Utils::generateApiKey();
$user->save();
flash('New API key generated!')->success();
return redirect(route('admin.users.edit', ['id' => $id]));
}
}

View File

@@ -34,6 +34,9 @@ class LoginController extends Controller
{
$user = Auth::user();
$user->last_ip = $request->ip();
$user->save();
// TODO: How to handle ON_LEAVE?
if($user->state !== UserState::ACTIVE) {

View File

@@ -44,6 +44,8 @@ Route::group([
Route::resource('pirepfields', 'PirepFieldController');
Route::resource('users', 'UserController');
Route::get('users/{id}/regen_apikey',
'UserController@regen_apikey')->name('users.regen_apikey');
# defaults
Route::get('', ['uses' => 'DashboardController@index']);

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::open(['route' => 'admin.aircraft.store']) !!}
@include('admin.aircraft.fields')
{!! Form::close() !!}

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::model($aircraft, ['route' => ['admin.aircraft.update', $aircraft->id], 'method' => 'patch']) !!}
@include('admin.aircraft.fields')
{!! Form::close() !!}

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::open(['route' => 'admin.airlines.store']) !!}
@include('admin.airlines.fields')
{!! Form::close() !!}

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::model($airline, ['route' => ['admin.airlines.update', $airline->id], 'method' => 'patch']) !!}
@include('admin.airlines.fields')
{!! Form::close() !!}

View File

@@ -1,9 +1,9 @@
@extends('admin.app')
@section('title', 'Add Airport')
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::open(['route' => 'admin.airports.store', 'id' => 'airportForm']) !!}
@include('admin.airports.fields')
{!! Form::close() !!}

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::model($airport, ['route' => ['admin.airports.update', $airport->id], 'method' => 'patch', 'id' => 'airportForm']) !!}
@include('admin.airports.fields')
{!! Form::close() !!}

View File

@@ -63,7 +63,7 @@
<div class="container-fluid">
<div class="row">
<div class="col-12">
@include('flash::message')
@include('admin.flash.message')
@yield('content')
</div>
</div>

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::open(['route' => 'admin.fares.store']) !!}
@include('admin.fares.fields')
{!! Form::close() !!}

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::model($fare, ['route' => ['admin.fares.update', $fare->id], 'method' => 'patch']) !!}
@include('admin.fares.fields')
{!! Form::close() !!}

View File

@@ -1,19 +1,9 @@
@extends('admin.app')
@section('content')
<section class="content-header">
<h1>
Fare
</h1>
</section>
<div class="card border-blue-bottom">
<div class="content">
<div class="box box-primary">
<div class="box-body">
<div class="row" style="padding-left: 20px">
@include('admin.fares.show_fields')
<a href="{!! route('admin.fares.index') !!}" class="btn btn-default">Back</a>
</div>
</div>
</div>
@include('admin.fares.show_fields')
</div>
</div>
@endsection

View File

@@ -8,4 +8,23 @@
</div>
</div>
@endforeach
@if (session()->has('flash_notification.message'))
<div class="alert
alert-{{ session('flash_notification.level') }}
{{ session()->has('flash_notification.important') ? 'alert-important' : '' }}">
@if(session()->has('flash_notification.important'))
<button type="button" class="close" data-dismiss="alert">&times;</button>
@endif
<div class="alert alert-danger" role="alert">
<div class="container">
<div class="alert-icon">
<i class="now-ui-icons ui-2_like"></i>
</div>
{!! session('flash_notification.message') !!}
</div>
</div>
</div>
</div>
@endif
{{ session()->forget('flash_notification') }}

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::model($flight, ['route' => ['admin.flights.store']]) !!}
@include('admin.flights.fields')
{!! Form::close() !!}

View File

@@ -3,7 +3,6 @@
@section('title', 'Edit Flight')
@section('content')
<div class="card border-blue-bottom">
@include('admin.flash.message')
<div class="content">
{!! Form::model($flight, ['route' => ['admin.flights.update', $flight->id], 'method' => 'patch']) !!}
@include('admin.flights.fields')

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::open(['route' => 'admin.pirepfields.store']) !!}
@include('admin.pirepfields.fields')
{!! Form::close() !!}

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::model($field, ['route' => ['admin.pirepfields.update', $field->id], 'method' => 'patch']) !!}
@include('admin.pirepfields.fields')
{!! Form::close() !!}

View File

@@ -7,7 +7,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
@include('admin.pirepfields.table')
</div>
</div>

View File

@@ -7,7 +7,6 @@
</h1>
</section>
<div class="content">
@include('admin.flash.message')
<div class="box box-primary">
<div class="box-body">

View File

@@ -3,7 +3,6 @@
@section('title', 'Edit ' . $pirep->ident )
@section('content')
<div class="content">
@include('admin.flash.message')
<div class="card border-blue-bottom">
<div class="content">
{!! Form::model($pirep, ['route' => ['admin.pireps.update', $pirep->id], 'method' => 'patch']) !!}

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::open(['route' => 'admin.ranks.store', 'class' => 'add_rank', 'method'=>'POST']) !!}
@include('admin.ranks.fields')
{!! Form::close() !!}

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::model($rank, ['route' => ['admin.ranks.update', $rank->id], 'method' => 'patch']) !!}
@include('admin.ranks.fields')
{!! Form::close() !!}

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::open(['route' => 'admin.subfleets.store']) !!}
@include('admin.subfleets.fields')
{!! Form::close() !!}

View File

@@ -2,7 +2,6 @@
@section('title', "Edit $subfleet->name")
@section('content')
@include('admin.flash.message')
<div class="card border-blue-bottom">
<div class="content">
{!! Form::model($subfleet, ['route' => ['admin.subfleets.update', $subfleet->id], 'method' => 'patch']) !!}

View File

@@ -1,12 +1,13 @@
@extends('admin.app')
@section('title', 'Subfleets')
@section('actions')
<li>
<a href="{!! route('admin.subfleets.create') !!}">
<i class="ti-plus"></i>Add New</a>
</li>
@endsection
@section('content')
<div class="card border-blue-bottom">
<div class="content">

View File

@@ -3,7 +3,6 @@
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::open(['route' => 'admin.airlines.store']) !!}
@include('admin.airlines.fields')
{!! Form::close() !!}

View File

@@ -1,13 +1,27 @@
@extends('admin.app')
@section('title', "Edit \"$user->name\"")
@section('title', 'Edit '. $user->name)
@section('content')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.flash.message')
{!! Form::model($user, ['route' => ['admin.users.update', $user->id], 'method' => 'patch']) !!}
@include('admin.users.fields')
{!! Form::close() !!}
</div>
</div>
<div class="card border-blue-bottom">
<div class="content">
<div class="header">
<h3>PIREPs</h3>
</div>
@include('admin.pireps.table')
<div class="row">
<div class="col-12 text-center">
{{ $pireps->links('admin.pagination.default') }}
</div>
</div>
</div>
</div>
@endsection

View File

@@ -57,10 +57,42 @@
</div>
<!-- Submit Field -->
<div class="form-group col-sm-6">
<div class="pull-right">
{!! Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-success']) !!}
<a href="{!! route('admin.users.index') !!}" class="btn btn-default">Cancel</a>
</div>
<div class="form-group col-sm-6 text-right">
<a href="{!! route('admin.users.regen_apikey', ['id' => $user->id]) !!}" class="btn btn-warning"
onclick="return confirm('Are you sure? This will reset this user\'s API key.')">new api key</a>
&nbsp;
{!! Form::button('Save', ['type' => 'submit', 'class' => 'btn btn-success']) !!}
<a href="{!! route('admin.users.index') !!}" class="btn btn-default">Cancel</a>
</div>
</div>
<div class="row">
<div class="form-group col-sm-12">
<table class="table table-hover">
<tr>
<td>API Key</td>
<td>{!! $user->api_key !!}</td>
</tr>
<tr>
<td>Total Flights</td>
<td>{!! $user->flights !!}</td>
</tr>
<tr>
<td>Flight Time</td>
<td>{!! Utils::minutesToTimeString($user->flight_time) !!}</td>
</tr>
<tr>
<td>IP Address</td>
<td>{!! $user->last_ip !!}</td>
</tr>
<tr>
<td>Registered On</td>
<td>{!! show_datetime($user->created_at) !!}</td>
</tr>
<tr>
<td>Last Login</td>
<td>{!! show_datetime($user->updated_at) !!}</td>
</tr>
</table>
</div>
</div>

View File

@@ -1,5 +1,5 @@
@extends('admin.app')
@section('title', 'Edit '. $user->name)
@section('content')
<div class="card">
<div class="content">

View File

@@ -9,13 +9,13 @@
<tbody>
@foreach($users as $user)
<tr>
<td><a href="{!! route('admin.users.show', [$user->id]) !!}">{!! $user->name !!}</a></td>
<td><a href="{!! route('admin.users.edit', [$user->id]) !!}">{!! $user->name !!}</a></td>
<td>{!! $user->email !!}</td>
<td>{!! show_date($user->created_at) !!}</td>
<td class="text-center">
@if($user->state == UserState::ACTIVE)
@if($user->state === UserState::ACTIVE)
<span class="label label-success">
@elseif($user->state == UserState::PENDING)
@elseif($user->state === UserState::PENDING)
<span class="label label-warning">
@else
<span class="label label-default">