Major refactoring and cleanup of ACARS/Pirep API

This commit is contained in:
Nabeel Shahzad
2018-01-28 11:12:13 -06:00
parent 77d0d2bcd0
commit 653ff2a104
16 changed files with 387 additions and 231 deletions

View File

@@ -4,8 +4,8 @@ use Faker\Generator as Faker;
$factory->define(App\Models\Acars::class, function (Faker $faker) { $factory->define(App\Models\Acars::class, function (Faker $faker) {
return [ return [
'id' => substr($faker->unique()->sha1, 28, 12), 'id' => null,
'pirep_id' => '', # fill this out by 'pirep_id' => null,
'log' => $faker->text(200), 'log' => $faker->text(200),
'lat' => $faker->latitude, 'lat' => $faker->latitude,
'lon' => $faker->longitude, 'lon' => $faker->longitude,

View File

@@ -11,7 +11,7 @@ $factory->define(App\Models\Pirep::class, function (Faker $faker) {
static $raw_data; static $raw_data;
return [ return [
'id' => substr($faker->unique()->sha1, 28, 12), 'id' => null,
'airline_id' => function () { # OVERRIDE THIS IF NEEDED 'airline_id' => function () { # OVERRIDE THIS IF NEEDED
return factory(App\Models\Airline::class)->create()->id; return factory(App\Models\Airline::class)->create()->id;
}, },

View File

@@ -2,14 +2,20 @@
namespace App\Http\Controllers\Api; namespace App\Http\Controllers\Api;
use App\Models\PirepComment;
use Log;
use Auth; use Auth;
use Illuminate\Database\Eloquent\ModelNotFoundException; use Log;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Requests\Acars\CommentRequest;
use App\Http\Requests\Acars\FileRequest;
use App\Http\Requests\Acars\LogRequest;
use App\Http\Requests\Acars\PositionRequest;
use App\Http\Requests\Acars\PrefileRequest;
use App\Http\Requests\Acars\RouteRequest;
use App\Models\Acars; use App\Models\Acars;
use App\Models\Pirep; use App\Models\Pirep;
use App\Models\PirepComment;
use App\Models\Enums\AcarsType; use App\Models\Enums\AcarsType;
use App\Models\Enums\PirepState; use App\Models\Enums\PirepState;
@@ -52,6 +58,22 @@ class PirepController extends RestController
$this->pirepSvc = $pirepSvc; $this->pirepSvc = $pirepSvc;
} }
/**
* Check if a PIREP is cancelled
* @param $pirep
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
*/
protected function checkCancelled(Pirep $pirep)
{
if (!$pirep->allowedUpdates()) {
throw new BadRequestHttpException('PIREP has been cancelled, comments can\'t be posted');
}
}
/**
* @param $id
* @return PirepResource
*/
public function get($id) public function get($id)
{ {
PirepResource::withoutWrapping(); PirepResource::withoutWrapping();
@@ -63,35 +85,17 @@ class PirepController extends RestController
* Once ACARS updates are being processed, then it can go into an 'ENROUTE' * Once ACARS updates are being processed, then it can go into an 'ENROUTE'
* status, and whatever other statuses may be defined * status, and whatever other statuses may be defined
* *
* TODO: Allow extra fields, etc to be set. Aircraft, etc * @param PrefileRequest $request
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException * @return PirepResource
*/ */
public function prefile(Request $request) public function prefile(PrefileRequest $request)
{ {
Log::info('PIREP Prefile, user '.Auth::user()->id, $request->post()); Log::info('PIREP Prefile, user '.Auth::id(), $request->post());
$prefile_rules = [ $attrs = $request->post();
'airline_id' => 'required|exists:airlines,id', $attrs['user_id'] = Auth::id();
'aircraft_id' => 'required|exists:aircraft,id', $attrs['state'] = PirepState::IN_PROGRESS;
'dpt_airport_id' => 'required', $attrs['status'] = PirepStatus::PREFILE;
'arr_airport_id' => 'required',
'flight_id' => 'nullable',
'flight_number' => 'required',
'route_code' => 'nullable',
'route_leg' => 'nullable',
'flight_time' => ['nullable', 'integer'],
'planned_flight_time' => ['nullable', 'integer'],
'level' => 'required|integer',
'route' => 'nullable',
'notes' => 'nullable',
'created_at' => 'nullable|date',
];
$attrs = $this->getFromReq($request, $prefile_rules, [
'user_id' => Auth::user()->id,
'state' => PirepState::IN_PROGRESS,
'status' => PirepStatus::PREFILE,
]);
$pirep = new Pirep($attrs); $pirep = new Pirep($attrs);
@@ -113,47 +117,22 @@ class PirepController extends RestController
/** /**
* File the PIREP * File the PIREP
* @param $id * @param $id
* @param Request $request * @param FileRequest $request
* @return PirepResource * @return PirepResource
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException * @throws \Illuminate\Database\Eloquent\ModelNotFoundException
*/ */
public function file($id, Request $request) public function file($id, FileRequest $request)
{ {
Log::info('PIREP file, user ' . Auth::user()->id, $request->post()); Log::info('PIREP file, user ' . Auth::id(), $request->post());
$pirep = $this->pirepRepo->find($id);
if (empty($pirep)) {
throw new ModelNotFoundException('PIREP not found');
}
# Check if the status is cancelled... # Check if the status is cancelled...
if($pirep->state === PirepState::CANCELLED) { $pirep = $this->pirepRepo->find($id);
throw new BadRequestHttpException('PIREP has been cancelled, updates can\'t be posted'); $this->checkCancelled($pirep);
}
$file_rules = [ $attrs = $request->post();
# actual flight time is required $attrs['state'] = PirepState::PENDING;
'flight_time' => ['required', 'integer'], $attrs['status'] = PirepStatus::ARRIVED;
'flight_number' => 'nullable',
'dpt_airport_id' => 'nullable',
'arr_airport_id' => 'nullable',
'airline_id' => 'nullable|exists:airlines,id',
'aircraft_id' => 'nullable|exists:aircraft,id',
'flight_id' => 'nullable',
'route_code' => 'nullable',
'route_leg' => 'nullable',
'planned_flight_time' => ['nullable', 'integer'],
'level' => 'nullable',
'route' => 'nullable',
'notes' => 'nullable',
'created_at' => 'nullable|date',
];
$attrs = $this->getFromReq($request, $file_rules, [
'state' => PirepState::PENDING,
'status' => PirepStatus::ARRIVED,
]);
$pirep_fields = []; $pirep_fields = [];
if($request->filled('fields')) { if($request->filled('fields')) {
@@ -176,20 +155,15 @@ class PirepController extends RestController
* @param $id * @param $id
* @param Request $request * @param Request $request
* @return PirepResource * @return PirepResource
* @throws \Prettus\Validator\Exceptions\ValidatorException
*/ */
public function cancel($id, Request $request) public function cancel($id, Request $request)
{ {
Log::info('PIREP Cancel, user ' . Auth::user()->pilot_id, $request->post()); Log::info('PIREP Cancel, user ' . Auth::id(), $request->post());
$attrs = [ $pirep = $this->pirepRepo->update([
'state' => PirepState::CANCELLED, 'state' => PirepState::CANCELLED,
]; ], $id);
try {
$pirep = $this->pirepRepo->update($attrs, $id);
} catch (\Exception $e) {
Log::error($e);
}
PirepResource::withoutWrapping(); PirepResource::withoutWrapping();
return new PirepResource($pirep); return new PirepResource($pirep);
@@ -231,58 +205,32 @@ class PirepController extends RestController
/** /**
* Post ACARS updates for a PIREP * Post ACARS updates for a PIREP
* @param $id * @param $id
* @param Request $request * @param PositionRequest $request
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
*/ */
public function acars_store($id, Request $request) public function acars_store($id, PositionRequest $request)
{ {
$pirep = $this->pirepRepo->find($id);
# Check if the status is cancelled... # Check if the status is cancelled...
if ($pirep->state === PirepState::CANCELLED) { $pirep = $this->pirepRepo->find($id);
throw new BadRequestHttpException('PIREP has been cancelled, updates can\'t be posted'); $this->checkCancelled($pirep);
}
Log::info( Log::info(
'Posting ACARS update (user: '.Auth::user()->pilot_id.', pirep id :'.$id.'): ', 'Posting ACARS update (user: '.Auth::user()->pilot_id.', pirep id :'.$id.'): ',
$request->post() $request->post()
); );
$this->validate($request, ['positions' => 'required']);
$positions = $request->post('positions');
$acars_rules = [
'lat' => 'required|numeric',
'lon' => 'required|numeric',
'altitude' => 'nullable',
'level' => 'nullable',
'heading' => 'nullable',
'vs' => 'nullable',
'gs' => 'nullable',
'transponder' => 'nullable',
'autopilot' => 'nullable',
'fuel_flow' => 'nullable',
'log' => 'nullable',
'created_at' => 'nullable|date',
];
$count = 0; $count = 0;
$positions = $request->post('positions');
foreach($positions as $position) foreach($positions as $position)
{ {
try { $position['pirep_id'] = $id;
$attrs = $this->getFromReq( $position['type'] = AcarsType::FLIGHT_PATH;
$position,
$acars_rules,
['pirep_id' => $id, 'type' => AcarsType::FLIGHT_PATH]
);
$update = Acars::create($attrs); $update = Acars::create($position);
$update->save(); $update->save();
++$count;
} catch (\Exception $e) { ++$count;
Log::error($e);
}
} }
# Change the PIREP status # Change the PIREP status
@@ -296,36 +244,26 @@ class PirepController extends RestController
* Post ACARS LOG update for a PIREP. These updates won't show up on the map * Post ACARS LOG update for a PIREP. These updates won't show up on the map
* But rather in a log file. * But rather in a log file.
* @param $id * @param $id
* @param Request $request * @param LogRequest $request
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
*/ */
public function acars_log($id, Request $request) public function acars_log($id, LogRequest $request)
{ {
$pirep = $this->pirepRepo->find($id);
# Check if the status is cancelled... # Check if the status is cancelled...
if ($pirep->state === PirepState::CANCELLED) { $pirep = $this->pirepRepo->find($id);
throw new BadRequestHttpException('PIREP has been cancelled, updates can\'t be posted'); $this->checkCancelled($pirep);
}
Log::info('Posting ACARS log', $request->toArray()); Log::info('Posting ACARS log, PIREP: '.$id, $request->post());
$this->validate($request, ['logs' => 'required']);
$logs = $request->post('logs');
$rules = [
'log' => 'required',
'lat' => 'nullable',
'lon' => 'nullable',
'created_at' => 'nullable|date',
];
$count = 0; $count = 0;
$logs = $request->post('logs');
foreach($logs as $log) { foreach($logs as $log) {
$attrs = $this->getFromReq($log, $rules, ['pirep_id' => $id, 'type' => AcarsType::LOG]);
$acars = Acars::create($attrs); $log['pirep_id'] = $id;
$log['type'] = AcarsType::LOG;
$acars = Acars::create($log);
$acars->save(); $acars->save();
++$count; ++$count;
} }
@@ -348,24 +286,20 @@ class PirepController extends RestController
/** /**
* Add a new comment * Add a new comment
* @param $id * @param $id
* @param Request $request * @param CommentRequest $request
* @return PirepCommentResource * @return PirepCommentResource
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
*/ */
public function comments_post($id, Request $request) public function comments_post($id, CommentRequest $request)
{ {
$pirep = $this->pirepRepo->find($id); $pirep = $this->pirepRepo->find($id);
if ($pirep->state === PirepState::CANCELLED) { $this->checkCancelled($pirep);
throw new BadRequestHttpException('PIREP has been cancelled, comments can\'t be posted');
}
# validation Log::info('Posting comment, PIREP: '.$id, $request->post());
$this->validate($request, ['comment' => 'required']);
# Add it # Add it
$comment = new PirepComment($request->post()); $comment = new PirepComment($request->post());
$comment->pirep_id = $id; $comment->pirep_id = $id;
$comment->user_id = Auth::user()->id; $comment->user_id = Auth::id();
$comment->save(); $comment->save();
return new PirepCommentResource($comment); return new PirepCommentResource($comment);
@@ -390,52 +324,25 @@ class PirepController extends RestController
/** /**
* Post the ROUTE for a PIREP, can be done from the ACARS log * Post the ROUTE for a PIREP, can be done from the ACARS log
* @param $id * @param $id
* @param Request $request * @param RouteRequest $request
* @return AcarsRouteResource * @return AcarsRouteResource
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
*/ */
public function route_post($id, Request $request) public function route_post($id, RouteRequest $request)
{ {
$pirep = $this->pirepRepo->find($id);
# Check if the status is cancelled... # Check if the status is cancelled...
if ($pirep->state === PirepState::CANCELLED) { $pirep = $this->pirepRepo->find($id);
throw new BadRequestHttpException('PIREP has been cancelled, updates can\'t be posted'); $this->checkCancelled($pirep);
}
Log::info('Posting ACARS ROUTE', $request->toArray()); Log::info('Posting ROUTE, PIREP: '.$id, $request->post());
$this->validate($request, ['route' => 'required']);
$this->validate($request, [
'route.*.name' => 'required',
'route.*.order' => 'required|int',
'route.*.nav_type' => 'nullable|int',
'route.*.lat' => 'required|numeric',
'route.*.lon' => 'required|numeric',
]);
$route = $request->post('route', []); $route = $request->post('route', []);
foreach($route as $position) { foreach($route as $position) {
$attrs = [ $position['pirep_id'] = $id;
'pirep_id' => $id, $position['type'] = AcarsType::ROUTE;
'type' => AcarsType::ROUTE,
'name' => $position['name'],
'order' => $position['order'],
'lat' => $position['lat'],
'lon' => $position['lon'],
];
if(array_key_exists('nav_type', $position)) { $acars = Acars::create($position);
$attrs['nav_type'] = $position['nav_type']; $acars->save();
}
try {
$acars = Acars::create($attrs);
$acars->save();
} catch (\Exception $e) {
Log::error($e);
}
} }
return $this->route_get($id, $request); return $this->route_get($id, $request);

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Http\Requests\Acars;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class FileRequest
* @package App\Http\Requests\Acars
*/
class CommentRequest extends FormRequest
{
public function authorize()
{
return true; # Anyone can comment
}
public function rules()
{
$rules = [
'comment' => 'required',
'created_at' => 'nullable|date',
];
return $rules;
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Http\Requests\Acars;
use Auth;
use App\Models\Pirep;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class FileRequest
* @package App\Http\Requests\Acars
*/
class FileRequest extends FormRequest
{
public function authorize()
{
$pirep = Pirep::findOrFail($this->route('pirep_id'), ['user_id']);
return $pirep->user_id === Auth::id();
}
public function rules()
{
$rules = [
'flight_time' => 'required|integer',
'flight_number' => 'nullable',
'dpt_airport_id' => 'nullable',
'arr_airport_id' => 'nullable',
'airline_id' => 'nullable|exists:airlines,id',
'aircraft_id' => 'nullable|exists:aircraft,id',
'flight_id' => 'nullable',
'route_code' => 'nullable',
'route_leg' => 'nullable',
'planned_flight_time' => 'nullable|integer',
'level' => 'nullable',
'route' => 'nullable',
'notes' => 'nullable',
'created_at' => 'nullable|date',
];
return $rules;
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Http\Requests\Acars;
use Auth;
use App\Models\Pirep;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class LogRequest
* @package App\Http\Requests\Acars
*/
class LogRequest extends FormRequest
{
public function authorize()
{
$pirep = Pirep::findOrFail($this->route('pirep_id'), ['user_id']);
return $pirep->user_id === Auth::id();
}
public function rules()
{
$rules = [
'logs' => 'required|array',
'logs.*.log' => 'required',
'logs.*.lat' => 'nullable|numeric',
'logs.*.lon' => 'nullable|numeric',
'logs.*.created_at' => 'nullable|date',
];
return $rules;
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Http\Requests\Acars;
use Auth;
use App\Models\Pirep;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class PositionRequest
* @package App\Http\Requests\Acars
*/
class PositionRequest extends FormRequest
{
public function authorize()
{
$pirep = Pirep::findOrFail($this->route('pirep_id'), ['user_id']);
return $pirep->user_id === Auth::id();
}
public function rules()
{
$rules = [
'positions' => 'required|array',
'positions.*.lat' => 'required|numeric',
'positions.*.lon' => 'required|numeric',
'positions.*.altitude' => 'nullable|numeric',
'positions.*.heading' => 'nullable|integer|between:0,360',
'positions.*.vs' => 'nullable',
'positions.*.gs' => 'nullable',
'positions.*.transponder' => 'nullable',
'positions.*.autopilot' => 'nullable',
'positions.*.fuel_flow' => 'nullable',
'positions.*.log' => 'nullable',
'positions.*.created_at' => 'nullable|date',
];
return $rules;
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Http\Requests\Acars;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class PrefileRequest
* @package App\Http\Requests\Acars
*/
class PrefileRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
$rules = [
'airline_id' => 'required|exists:airlines,id',
'aircraft_id' => 'required|exists:aircraft,id',
'dpt_airport_id' => 'required',
'arr_airport_id' => 'required',
'flight_id' => 'nullable',
'flight_number' => 'required',
'route_code' => 'nullable',
'route_leg' => 'nullable',
'flight_time' => 'nullable|integer',
'planned_flight_time' => 'nullable|integer',
'level' => 'required|integer',
'route' => 'nullable',
'notes' => 'nullable',
'created_at' => 'nullable|date',
];
return $rules;
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Http\Requests\Acars;
use App\Models\Pirep;
use Auth;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class RouteRequest
* @package App\Http\Requests\Acars
*/
class RouteRequest extends FormRequest
{
public function authorize()
{
$pirep = Pirep::findOrFail($this->route('pirep_id'), ['user_id']);
return $pirep->user_id === Auth::id();
}
public function rules()
{
$rules = [
'route' => 'required|array',
'route.*.name' => 'required',
'route.*.order' => 'required|int',
'route.*.nav_type' => 'nullable|int',
'route.*.lat' => 'required|numeric',
'route.*.lon' => 'required|numeric',
];
return $rules;
}
}

View File

@@ -21,6 +21,12 @@ class Pirep extends Resource
$pirep['arr_airport'] = new Airport($this->arr_airport); $pirep['arr_airport'] = new Airport($this->arr_airport);
$pirep['position'] = new Acars($this->position); $pirep['position'] = new Acars($this->position);
$pirep['comments'] = PirepComment::collection($this->comments); $pirep['comments'] = PirepComment::collection($this->comments);
$pirep['user'] = [
'id' => $this->user->id,
'name' => $this->user->name,
'home_airport_id' => $this->user->home_airport_id,
'curr_airport_id' => $this->user->curr_airport_id,
];
return $pirep; return $pirep;
} }

View File

@@ -37,7 +37,7 @@ class Acars extends BaseModel
'lat' => 'float', 'lat' => 'float',
'lon' => 'float', 'lon' => 'float',
'heading' => 'integer', 'heading' => 'integer',
'altitude' => 'integer', 'altitude' => 'float',
'vs' => 'float', 'vs' => 'float',
'gs' => 'float', 'gs' => 'float',
'transponder' => 'integer', 'transponder' => 'integer',

View File

@@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use App\Models\Enums\AcarsType; use App\Models\Enums\AcarsType;
use App\Models\Enums\PirepState;
use App\Models\Traits\HashId; use App\Models\Traits\HashId;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
@@ -45,6 +46,7 @@ class Pirep extends BaseModel
]; ];
protected $casts = [ protected $casts = [
'user_id' => 'integer',
'flight_time' => 'integer', 'flight_time' => 'integer',
'planned_flight_time' => 'integer', 'planned_flight_time' => 'integer',
'level' => 'integer', 'level' => 'integer',
@@ -86,6 +88,20 @@ class Pirep extends BaseModel
return $flight_id; return $flight_id;
} }
/**
* Check if this PIREP is allowed to be updated
* @return bool
*/
public function allowedUpdates()
{
if ($this->state === PirepState::CANCELLED) {
return false;
}
return true;
}
/** /**
* Foreign Keys * Foreign Keys
*/ */

View File

@@ -22,11 +22,11 @@ Route::group([], function()
Route::get('flights/search', 'FlightController@search'); Route::get('flights/search', 'FlightController@search');
Route::get('flights/{id}', 'FlightController@get'); Route::get('flights/{id}', 'FlightController@get');
Route::get('pireps/{id}', 'PirepController@get'); Route::get('pireps/{pirep_id}', 'PirepController@get');
Route::get('pireps/{id}/route', 'PirepController@route_get'); Route::get('pireps/{pirep_id}/route', 'PirepController@route_get');
Route::get('pireps/{id}/acars/position', 'PirepController@acars_get'); Route::get('pireps/{pirep_id}/acars/position', 'PirepController@acars_get');
Route::get('pireps/{id}/acars/geojson', 'PirepController@acars_geojson'); Route::get('pireps/{pirep_id}/acars/geojson', 'PirepController@acars_geojson');
Route::get('pireps/{id}/comments', 'PirepController@comments_get'); Route::get('pireps/{pirep_id}/comments', 'PirepController@comments_get');
Route::get('status', 'StatusController@status'); Route::get('status', 'StatusController@status');
Route::get('version', 'StatusController@status'); Route::get('version', 'StatusController@status');
@@ -38,19 +38,19 @@ Route::group([], function()
Route::group(['middleware' => ['api.auth']], function () Route::group(['middleware' => ['api.auth']], function ()
{ {
Route::post('pireps/prefile', 'PirepController@prefile'); Route::post('pireps/prefile', 'PirepController@prefile');
Route::post('pireps/{id}/file', 'PirepController@file'); Route::post('pireps/{pirep_id}/file', 'PirepController@file');
Route::delete('pireps/{id}/cancel', 'PirepController@cancel'); Route::delete('pireps/{pirep_id}/cancel', 'PirepController@cancel');
Route::post('pireps/{id}/acars/position', 'PirepController@acars_store'); Route::post('pireps/{pirep_id}/acars/position', 'PirepController@acars_store');
Route::post('pireps/{id}/acars/positions', 'PirepController@acars_store'); Route::post('pireps/{pirep_id}/acars/positions', 'PirepController@acars_store');
Route::post('pireps/{id}/acars/log', 'PirepController@acars_log'); Route::post('pireps/{pirep_id}/acars/log', 'PirepController@acars_log');
Route::post('pireps/{id}/acars/logs', 'PirepController@acars_log'); Route::post('pireps/{pirep_id}/acars/logs', 'PirepController@acars_log');
Route::post('pireps/{id}/comments', 'PirepController@comments_post'); Route::post('pireps/{pirep_id}/comments', 'PirepController@comments_post');
Route::post('pireps/{id}/route', 'PirepController@route_post'); Route::post('pireps/{pirep_id}/route', 'PirepController@route_post');
Route::delete('pireps/{id}/route', 'PirepController@route_delete'); Route::delete('pireps/{pirep_id}/route', 'PirepController@route_delete');
Route::get('settings', 'SettingsController@index'); Route::get('settings', 'SettingsController@index');

View File

@@ -47,7 +47,6 @@ class AcarsTest extends TestCase
protected function getPirep($pirep_id) protected function getPirep($pirep_id)
{ {
$this->user = factory(App\Models\User::class)->create();
$resp = $this ->get('/api/pireps/' . $pirep_id); $resp = $this ->get('/api/pireps/' . $pirep_id);
$resp->assertStatus(200); $resp->assertStatus(200);
return $resp->json(); return $resp->json();
@@ -116,6 +115,7 @@ class AcarsTest extends TestCase
$this->assertHasKeys($body, ['airline', 'arr_airport', 'dpt_airport', 'position']); $this->assertHasKeys($body, ['airline', 'arr_airport', 'dpt_airport', 'position']);
$this->assertNotNull($pirep_id); $this->assertNotNull($pirep_id);
$this->assertEquals($body['user_id'], $this->user->id);
# Check the PIREP state and status # Check the PIREP state and status
$pirep = $this->getPirep($pirep_id); $pirep = $this->getPirep($pirep_id);
@@ -131,13 +131,20 @@ class AcarsTest extends TestCase
$response->assertStatus(400); $response->assertStatus(400);
# Post an ACARS update # Post an ACARS update
$acars = factory(App\Models\Acars::class)->make()->toArray(); $acars = factory(App\Models\Acars::class)->make([
unset($acars['id']); 'id' => null
])->toArray();
$update = ['positions' => [$acars]]; $update = ['positions' => [$acars]];
$response = $this->post($uri, $update); $response = $this->post($uri, $update);
$response->assertStatus(200)->assertJson(['count' => 1]); $response->assertStatus(200)->assertJson(['count' => 1]);
# Read that if the ACARS record posted
$acars_data = $this->get($uri)->json()[0];
$this->assertEquals($acars['lat'], $acars_data['lat']);
$this->assertEquals($acars['lon'], $acars_data['lon']);
$this->assertEquals($acars['log'], $acars_data['log']);
# Make sure PIREP state moved into ENROUTE # Make sure PIREP state moved into ENROUTE
$pirep = $this->getPirep($pirep_id); $pirep = $this->getPirep($pirep_id);
$this->assertEquals(PirepState::IN_PROGRESS, $pirep['state']); $this->assertEquals(PirepState::IN_PROGRESS, $pirep['state']);
@@ -161,7 +168,7 @@ class AcarsTest extends TestCase
$response->assertStatus(400); // invalid flight time $response->assertStatus(400); // invalid flight time
$response = $this->post($uri, ['flight_time' => '130']); $response = $this->post($uri, ['flight_time' => '130']);
$response->assertStatus(200); // invalid flight time $response->assertStatus(200);
# Add a comment # Add a comment
$uri = '/api/pireps/'.$pirep_id.'/comments'; $uri = '/api/pireps/'.$pirep_id.'/comments';

View File

@@ -199,6 +199,9 @@ class PIREPTest extends TestCase
$this->assertFalse($dupe_pirep); $this->assertFalse($dupe_pirep);
} }
/**
*
*/
public function testCancelViaAPI() public function testCancelViaAPI()
{ {
$this->user = factory(App\Models\User::class)->create(); $this->user = factory(App\Models\User::class)->create();
@@ -223,7 +226,10 @@ class PIREPTest extends TestCase
# Should get a 400 when posting an ACARS update # Should get a 400 when posting an ACARS update
$uri = '/api/pireps/' . $pirep_id . '/acars/position'; $uri = '/api/pireps/' . $pirep_id . '/acars/position';
$acars = factory(App\Models\Acars::class)->make()->toArray(); $acars = factory(App\Models\Acars::class)->make([
'pirep_id' => null
])->toArray();
$response = $this->post($uri, $acars); $response = $this->post($uri, $acars);
$response->assertStatus(400); $response->assertStatus(400);
} }

View File

@@ -1,13 +1,11 @@
<?php <?php
use App\Models\User; use App\Services\DatabaseService;
use Carbon\Carbon;
use Illuminate\Support\Facades\Mail;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
/**
* Class TestCase
*/
abstract class TestCase extends Illuminate\Foundation\Testing\TestCase abstract class TestCase extends Illuminate\Foundation\Testing\TestCase
{ {
/** /**
@@ -32,11 +30,22 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase
return self::$auth_headers; return self::$auth_headers;
} }
public function headers($user) /**
* @param $user
* @param array $headers
* @return array
*/
public function headers($user=null, array $headers = []): array
{ {
return [ if($user !== null) {
'x-api-key' => $user->api_key, $headers['x-api-key'] = $user->api_key;
]; } else {
if($this->user !== null) {
$headers['x-api-key'] = $this->user->api_key;
}
}
return $headers;
} }
/** /**
@@ -81,7 +90,7 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase
public function addData($file) public function addData($file)
{ {
$svc = app('\App\Services\DatabaseService'); $svc = app(DatabaseService::class);
$file_path = base_path('tests/data/' . $file . '.yml'); $file_path = base_path('tests/data/' . $file . '.yml');
try { try {
$svc->seed_from_yaml_file($file_path); $svc->seed_from_yaml_file($file_path);
@@ -91,7 +100,6 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase
public function fillableFields(\Illuminate\Database\Eloquent\Model $model) public function fillableFields(\Illuminate\Database\Eloquent\Model $model)
{ {
//$klass = new $model();
return $model->fillable; return $model->fillable;
} }
@@ -116,18 +124,9 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase
*/ */
public function get($uri, array $headers=[], $user=null): \Illuminate\Foundation\Testing\TestResponse public function get($uri, array $headers=[], $user=null): \Illuminate\Foundation\Testing\TestResponse
{ {
if($this->user !== null) { $req = parent::get($uri, $this->headers($user, $headers));
$headers = $this->headers($this->user);
}
if($user !== null) {
$headers['x-api-key'] = $user->api_key;
}
$req = parent::get($uri, $headers);
if($req->isClientError() || $req->isServerError()) { if($req->isClientError() || $req->isServerError()) {
Log::error('Error on '.$uri); Log::error('GET Error: ' . $uri, $req->json());
Log::error($req->json());
} }
return $req; return $req;
@@ -138,17 +137,17 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase
* @param string $uri * @param string $uri
* @param array $data * @param array $data
* @param array $headers * @param array $headers
* @param null $user
* @return \Illuminate\Foundation\Testing\TestResponse * @return \Illuminate\Foundation\Testing\TestResponse
*/ */
public function post($uri, array $data = [], array $headers = []) public function post($uri, array $data = [], array $headers = [], $user=null)
{ {
if (empty($headers)) { $req = parent::post($uri, $data, $this->headers($user, $headers));
if ($this->user !== null) { if ($req->isClientError() || $req->isServerError()) {
$headers = $this->headers($this->user); Log::error('POST Error: ' . $uri, $req->json());
}
} }
return parent::post($uri, $data, $headers); return $req;
} }
/** /**
@@ -156,16 +155,16 @@ abstract class TestCase extends Illuminate\Foundation\Testing\TestCase
* @param string $uri * @param string $uri
* @param array $data * @param array $data
* @param array $headers * @param array $headers
* @param null $user
* @return \Illuminate\Foundation\Testing\TestResponse * @return \Illuminate\Foundation\Testing\TestResponse
*/ */
public function delete($uri, array $data = [], array $headers = []) public function delete($uri, array $data = [], array $headers = [], $user=null)
{ {
if (empty($headers)) { $req = parent::delete($uri, $data, $this->headers($user, $headers));
if ($this->user !== null) { if ($req->isClientError() || $req->isServerError()) {
$headers = $this->headers($this->user); Log::error('DELETE Error: ' . $uri, $req->json());
}
} }
return parent::delete($uri, $data, $headers); return $req;
} }
} }