Cleanup user edit page and show their pireps; log last IP address #110
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
|
||||
@@ -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']);
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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">×</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') }}
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
</h1>
|
||||
</section>
|
||||
<div class="content">
|
||||
@include('admin.flash.message')
|
||||
<div class="box box-primary">
|
||||
|
||||
<div class="box-body">
|
||||
|
||||
@@ -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']) !!}
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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']) !!}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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() !!}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
{!! 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>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
@extends('admin.app')
|
||||
|
||||
@section('title', 'Edit '. $user->name)
|
||||
@section('content')
|
||||
<div class="card">
|
||||
<div class="content">
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user