Stricter checks on ACARS API data (#451)
* Stricter checks on ACARS API data * More checks
This commit is contained in:
@@ -10,7 +10,7 @@ class CommentRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
$rules = [
|
$rules = [
|
||||||
'comment' => 'required',
|
'comment' => 'required',
|
||||||
'created_at' => 'nullable|date',
|
'created_at' => 'sometimes|date',
|
||||||
];
|
];
|
||||||
|
|
||||||
return $rules;
|
return $rules;
|
||||||
|
|||||||
@@ -19,9 +19,9 @@ class EventRequest extends FormRequest
|
|||||||
$rules = [
|
$rules = [
|
||||||
'events' => 'required|array',
|
'events' => 'required|array',
|
||||||
'events.*.event' => 'required',
|
'events.*.event' => 'required',
|
||||||
'events.*.lat' => 'nullable|numeric',
|
'events.*.lat' => 'sometimes|numeric',
|
||||||
'events.*.lon' => 'nullable|numeric',
|
'events.*.lon' => 'sometimes|numeric',
|
||||||
'events.*.created_at' => 'nullable|date',
|
'events.*.created_at' => 'sometimes|date',
|
||||||
];
|
];
|
||||||
|
|
||||||
return $rules;
|
return $rules;
|
||||||
|
|||||||
@@ -20,28 +20,28 @@ class FileRequest extends FormRequest
|
|||||||
'distance' => 'required|numeric',
|
'distance' => 'required|numeric',
|
||||||
'flight_time' => 'required|integer',
|
'flight_time' => 'required|integer',
|
||||||
'fuel_used' => 'required|numeric',
|
'fuel_used' => 'required|numeric',
|
||||||
'block_time' => 'nullable|integer',
|
'block_time' => 'sometimes|integer',
|
||||||
'airline_id' => 'nullable|exists:airlines,id',
|
'airline_id' => 'sometimes|exists:airlines,id',
|
||||||
'aircraft_id' => 'nullable|exists:aircraft,id',
|
'aircraft_id' => 'sometimes|exists:aircraft,id',
|
||||||
'flight_number' => 'nullable',
|
'flight_number' => 'sometimes',
|
||||||
'flight_type' => 'nullable',
|
'flight_type' => 'sometimes',
|
||||||
'dpt_airport_id' => 'nullable',
|
'dpt_airport_id' => 'sometimes|size:4',
|
||||||
'arr_airport_id' => 'nullable',
|
'arr_airport_id' => 'sometimes|size:4',
|
||||||
'route_code' => 'nullable',
|
'route_code' => 'sometimes',
|
||||||
'route_leg' => 'nullable',
|
'route_leg' => 'sometimes',
|
||||||
'planned_distance' => 'nullable|numeric',
|
'planned_distance' => 'sometimes|numeric',
|
||||||
'planned_flight_time' => 'nullable|integer',
|
'planned_flight_time' => 'sometimes|integer',
|
||||||
'level' => 'nullable|numeric',
|
'level' => 'sometimes|numeric',
|
||||||
'zfw' => 'nullable|numeric',
|
'zfw' => 'sometimes|numeric',
|
||||||
'block_fuel' => 'nullable|numeric',
|
'block_fuel' => 'sometimes|numeric',
|
||||||
'route' => 'nullable',
|
'route' => 'sometimes',
|
||||||
'notes' => 'nullable',
|
'notes' => 'sometimes',
|
||||||
'source_name' => 'nullable',
|
'source_name' => 'sometimes',
|
||||||
'score' => 'nullable|integer',
|
'score' => 'sometimes|integer',
|
||||||
'landing_rate' => 'nullable|numeric',
|
'landing_rate' => 'sometimes|numeric',
|
||||||
'block_off_time' => 'nullable|date',
|
'block_off_time' => 'sometimes|date',
|
||||||
'block_on_time' => 'nullable|date',
|
'block_on_time' => 'sometimes|date',
|
||||||
'created_at' => 'nullable|date',
|
'created_at' => 'sometimes|date',
|
||||||
|
|
||||||
// See if the fare objects are included and formatted properly
|
// See if the fare objects are included and formatted properly
|
||||||
'fares' => 'nullable|array',
|
'fares' => 'nullable|array',
|
||||||
|
|||||||
@@ -19,9 +19,9 @@ class LogRequest extends FormRequest
|
|||||||
$rules = [
|
$rules = [
|
||||||
'logs' => 'required|array',
|
'logs' => 'required|array',
|
||||||
'logs.*.log' => 'required',
|
'logs.*.log' => 'required',
|
||||||
'logs.*.lat' => 'nullable|numeric',
|
'logs.*.lat' => 'sometimes|numeric',
|
||||||
'logs.*.lon' => 'nullable|numeric',
|
'logs.*.lon' => 'sometimes|numeric',
|
||||||
'logs.*.created_at' => 'nullable|date',
|
'logs.*.created_at' => 'sometimes|date',
|
||||||
];
|
];
|
||||||
|
|
||||||
return $rules;
|
return $rules;
|
||||||
|
|||||||
@@ -23,18 +23,18 @@ class PositionRequest extends FormRequest
|
|||||||
'positions' => 'required|array',
|
'positions' => 'required|array',
|
||||||
'positions.*.lat' => 'required|numeric',
|
'positions.*.lat' => 'required|numeric',
|
||||||
'positions.*.lon' => 'required|numeric',
|
'positions.*.lon' => 'required|numeric',
|
||||||
'positions.*.status' => 'nullable',
|
'positions.*.status' => 'sometimes',
|
||||||
'positions.*.altitude' => 'nullable|numeric',
|
'positions.*.altitude' => 'sometimes|numeric',
|
||||||
'positions.*.heading' => 'nullable|numeric|between:0,360',
|
'positions.*.heading' => 'sometimes|numeric|between:0,360',
|
||||||
'positions.*.vs' => 'nullable',
|
'positions.*.vs' => 'sometimes',
|
||||||
'positions.*.gs' => 'nullable',
|
'positions.*.gs' => 'sometimes',
|
||||||
'positions.*.transponder' => 'nullable',
|
'positions.*.transponder' => 'sometimes',
|
||||||
'positions.*.autopilot' => 'nullable',
|
'positions.*.autopilot' => 'sometimes',
|
||||||
'positions.*.fuel' => 'nullable|numeric',
|
'positions.*.fuel' => 'sometimes|numeric',
|
||||||
'positions.*.fuel_flow' => 'nullable|numeric',
|
'positions.*.fuel_flow' => 'sometimes|numeric',
|
||||||
'positions.*.log' => 'nullable',
|
'positions.*.log' => 'sometimes|nullable',
|
||||||
'positions.*.sim_time' => 'nullable|date',
|
'positions.*.sim_time' => 'sometimes|date',
|
||||||
'positions.*.created_at' => 'nullable|date',
|
'positions.*.created_at' => 'sometimes|date',
|
||||||
];
|
];
|
||||||
|
|
||||||
return $rules;
|
return $rules;
|
||||||
|
|||||||
@@ -12,29 +12,29 @@ class PrefileRequest extends FormRequest
|
|||||||
'airline_id' => 'required|exists:airlines,id',
|
'airline_id' => 'required|exists:airlines,id',
|
||||||
'aircraft_id' => 'required|exists:aircraft,id',
|
'aircraft_id' => 'required|exists:aircraft,id',
|
||||||
'flight_number' => 'required',
|
'flight_number' => 'required',
|
||||||
'dpt_airport_id' => 'required',
|
'dpt_airport_id' => 'required|size:4',
|
||||||
'arr_airport_id' => 'required',
|
'arr_airport_id' => 'required|size:4',
|
||||||
'flight_id' => 'nullable',
|
'flight_id' => 'sometimes|exists:flights,id',
|
||||||
'source_name' => 'required',
|
'source_name' => 'required',
|
||||||
'alt_airport_id' => 'nullable',
|
'alt_airport_id' => 'sometimes|size:4',
|
||||||
'status' => 'nullable',
|
'status' => 'sometimes',
|
||||||
'level' => 'nullable|numeric',
|
'level' => 'nullable|numeric',
|
||||||
'flight_type' => 'nullable',
|
'flight_type' => 'sometimes',
|
||||||
'route_code' => 'nullable',
|
'route_code' => 'sometimes',
|
||||||
'route_leg' => 'nullable',
|
'route_leg' => 'sometimes',
|
||||||
'distance' => 'nullable|numeric',
|
'distance' => 'sometimes|numeric',
|
||||||
'block_time' => 'nullable|integer',
|
'block_time' => 'sometimes|integer',
|
||||||
'flight_time' => 'nullable|integer',
|
'flight_time' => 'sometimes|integer',
|
||||||
'planned_distance' => 'nullable|numeric',
|
'planned_distance' => 'sometimes|numeric',
|
||||||
'planned_flight_time' => 'nullable|integer',
|
'planned_flight_time' => 'sometimes|integer',
|
||||||
'zfw' => 'nullable|numeric',
|
'zfw' => 'sometimes|numeric',
|
||||||
'block_fuel' => 'nullable|numeric',
|
'block_fuel' => 'sometimes|numeric',
|
||||||
'route' => 'nullable',
|
'route' => 'nullable',
|
||||||
'notes' => 'nullable',
|
'notes' => 'nullable',
|
||||||
'score' => 'nullable|integer',
|
'score' => 'sometimes|integer',
|
||||||
'block_off_time' => 'nullable|date',
|
'block_off_time' => 'sometimes|date',
|
||||||
'block_on_time' => 'nullable|date',
|
'block_on_time' => 'sometimes|date',
|
||||||
'created_at' => 'nullable|date',
|
'created_at' => 'sometimes|date',
|
||||||
|
|
||||||
// See if the fare objects are included and formatted properly
|
// See if the fare objects are included and formatted properly
|
||||||
'fares' => 'nullable|array',
|
'fares' => 'nullable|array',
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class RouteRequest extends FormRequest
|
|||||||
'route' => 'required|array',
|
'route' => 'required|array',
|
||||||
'route.*.name' => 'required',
|
'route.*.name' => 'required',
|
||||||
'route.*.order' => 'required|int',
|
'route.*.order' => 'required|int',
|
||||||
'route.*.nav_type' => 'nullable|int',
|
'route.*.nav_type' => 'sometimes|int',
|
||||||
'route.*.lat' => 'required|numeric',
|
'route.*.lat' => 'required|numeric',
|
||||||
'route.*.lon' => 'required|numeric',
|
'route.*.lon' => 'required|numeric',
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -19,29 +19,29 @@ class UpdateRequest extends FormRequest
|
|||||||
$rules = [
|
$rules = [
|
||||||
'airline_id' => 'nullable|exists:airlines,id',
|
'airline_id' => 'nullable|exists:airlines,id',
|
||||||
'aircraft_id' => 'nullable|exists:aircraft,id',
|
'aircraft_id' => 'nullable|exists:aircraft,id',
|
||||||
'flight_number' => 'nullable',
|
'flight_number' => 'sometimes|required|exists:flights,id',
|
||||||
'dpt_airport_id' => 'nullable',
|
'dpt_airport_id' => 'sometimes|required|size:4',
|
||||||
'arr_airport_id' => 'nullable',
|
'arr_airport_id' => 'sometimes|required|size:4',
|
||||||
'route_code' => 'nullable',
|
'route_code' => 'nullable',
|
||||||
'route_leg' => 'nullable',
|
'route_leg' => 'nullable',
|
||||||
'distance' => 'nullable|numeric',
|
'distance' => 'sometimes|numeric',
|
||||||
'planned_distance' => 'nullable|numeric',
|
'planned_distance' => 'sometimes|numeric',
|
||||||
'block_time' => 'nullable|integer',
|
'block_time' => 'sometimes|integer',
|
||||||
'flight_time' => 'nullable|integer',
|
'flight_time' => 'sometimes|integer',
|
||||||
'flight_type' => 'nullable',
|
'flight_type' => 'nullable',
|
||||||
'planned_flight_time' => 'nullable|integer',
|
'planned_flight_time' => 'sometimes|integer',
|
||||||
'level' => 'nullable|numeric',
|
'level' => 'sometimes|numeric',
|
||||||
'zfw' => 'nullable|numeric',
|
'zfw' => 'sometimes|numeric',
|
||||||
'fuel_used' => 'nullable|numeric',
|
'fuel_used' => 'sometimes|numeric',
|
||||||
'block_fuel' => 'nullable|numeric',
|
'block_fuel' => 'sometimes|numeric',
|
||||||
'route' => 'nullable',
|
'route' => 'sometimes|nullable',
|
||||||
'notes' => 'nullable',
|
'notes' => 'sometimes|nullable',
|
||||||
'source_name' => 'nullable|max:25',
|
'source_name' => 'sometimes|max:25',
|
||||||
'landing_rate' => 'nullable|numeric',
|
'landing_rate' => 'sometimes|numeric',
|
||||||
'block_off_time' => 'nullable',
|
'block_off_time' => 'sometimes|date',
|
||||||
'block_on_time' => 'nullable',
|
'block_on_time' => 'sometimes|date',
|
||||||
'created_at' => 'nullable',
|
'created_at' => 'sometimes|date',
|
||||||
'status' => 'nullable',
|
'status' => 'sometimes',
|
||||||
'score' => 'nullable|integer',
|
'score' => 'nullable|integer',
|
||||||
|
|
||||||
// See if the fare objects are included and formatted properly
|
// See if the fare objects are included and formatted properly
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ Route::group(['middleware' => ['api.auth']], function () {
|
|||||||
* ACARS related
|
* ACARS related
|
||||||
*/
|
*/
|
||||||
Route::post('pireps/prefile', 'PirepController@prefile');
|
Route::post('pireps/prefile', 'PirepController@prefile');
|
||||||
|
Route::post('pireps/{pirep_id}', 'PirepController@update');
|
||||||
|
Route::patch('pireps/{pirep_id}', 'PirepController@update');
|
||||||
Route::post('pireps/{pirep_id}/update', 'PirepController@update');
|
Route::post('pireps/{pirep_id}/update', 'PirepController@update');
|
||||||
Route::post('pireps/{pirep_id}/file', 'PirepController@file');
|
Route::post('pireps/{pirep_id}/file', 'PirepController@file');
|
||||||
Route::post('pireps/{pirep_id}/comments', 'PirepController@comments_post');
|
Route::post('pireps/{pirep_id}/comments', 'PirepController@comments_post');
|
||||||
|
|||||||
@@ -66,10 +66,10 @@ class Airport extends Model
|
|||||||
* Validation rules
|
* Validation rules
|
||||||
*/
|
*/
|
||||||
public static $rules = [
|
public static $rules = [
|
||||||
'icao' => 'required',
|
'icao' => 'required|size:4',
|
||||||
'iata' => 'nullable',
|
'iata' => 'sometimes|nullable',
|
||||||
'name' => 'required',
|
'name' => 'required',
|
||||||
'location' => 'nullable',
|
'location' => 'sometimes',
|
||||||
'lat' => 'required|numeric',
|
'lat' => 'required|numeric',
|
||||||
'lon' => 'required|numeric',
|
'lon' => 'required|numeric',
|
||||||
'ground_handling_cost' => 'nullable|numeric',
|
'ground_handling_cost' => 'nullable|numeric',
|
||||||
|
|||||||
@@ -93,8 +93,8 @@ class Flight extends Model
|
|||||||
'flight_number' => 'required',
|
'flight_number' => 'required',
|
||||||
'route_code' => 'nullable',
|
'route_code' => 'nullable',
|
||||||
'route_leg' => 'nullable',
|
'route_leg' => 'nullable',
|
||||||
'dpt_airport_id' => 'required',
|
'dpt_airport_id' => 'required|size:4|exists:airports,id',
|
||||||
'arr_airport_id' => 'required',
|
'arr_airport_id' => 'required|size:4|exists:airports,id',
|
||||||
'level' => 'nullable',
|
'level' => 'nullable',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,38 @@ class AcarsTest extends TestCase
|
|||||||
$response->assertStatus(400);
|
$response->assertStatus(400);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testBlankAirport()
|
||||||
|
{
|
||||||
|
$this->user = factory(App\Models\User::class)->create();
|
||||||
|
|
||||||
|
$airline = factory(App\Models\Airline::class)->create();
|
||||||
|
$aircraft = factory(App\Models\Aircraft::class)->create();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* INVALID AIRLINE_ID FIELD
|
||||||
|
*/
|
||||||
|
$uri = '/api/pireps/prefile';
|
||||||
|
$pirep = [
|
||||||
|
'airline_id' => $airline->id,
|
||||||
|
'aircraft_id' => $aircraft->id,
|
||||||
|
'dpt_airport_id' => null,
|
||||||
|
'arr_airport_id' => null,
|
||||||
|
'flight_number' => '6000',
|
||||||
|
'level' => 38000,
|
||||||
|
'planned_flight_time' => 120,
|
||||||
|
'source_name' => 'ACARSTESTS',
|
||||||
|
'route' => 'POINTA POINTB',
|
||||||
|
];
|
||||||
|
|
||||||
|
$response = $this->post($uri, $pirep);
|
||||||
|
$response->assertStatus(400);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
'A departure airport is required, An arrival airport is required',
|
||||||
|
$response->json('details')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make sure an error is thrown if the pilot is not at the current airport
|
* Make sure an error is thrown if the pilot is not at the current airport
|
||||||
*/
|
*/
|
||||||
@@ -273,6 +305,52 @@ class AcarsTest extends TestCase
|
|||||||
$this->assertEquals($body['state'], PirepState::CANCELLED);
|
$this->assertEquals($body['state'], PirepState::CANCELLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testPrefileAndInvalidUpdates()
|
||||||
|
{
|
||||||
|
$subfleet = $this->createSubfleetWithAircraft(2);
|
||||||
|
$rank = $this->createRank(10, [$subfleet['subfleet']->id]);
|
||||||
|
|
||||||
|
$this->user = factory(App\Models\User::class)->create([
|
||||||
|
'rank_id' => $rank->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$airport = factory(App\Models\Airport::class)->create();
|
||||||
|
$airline = factory(App\Models\Airline::class)->create();
|
||||||
|
$aircraft = $subfleet['aircraft']->random();
|
||||||
|
|
||||||
|
$uri = '/api/pireps/prefile';
|
||||||
|
$pirep = [
|
||||||
|
'airline_id' => $airline->id,
|
||||||
|
'aircraft_id' => $aircraft->id,
|
||||||
|
'dpt_airport_id' => $airport->icao,
|
||||||
|
'arr_airport_id' => $airport->icao,
|
||||||
|
'flight_number' => '6000',
|
||||||
|
'level' => 38000,
|
||||||
|
'planned_distance' => 400,
|
||||||
|
'planned_flight_time' => 120,
|
||||||
|
'route' => 'POINTA POINTB',
|
||||||
|
'source_name' => 'UnitTest',
|
||||||
|
];
|
||||||
|
|
||||||
|
$response = $this->post($uri, $pirep);
|
||||||
|
$response->assertStatus(201);
|
||||||
|
$pirep = $response->json('data');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to update fields
|
||||||
|
*/
|
||||||
|
$uri = '/api/pireps/'.$pirep['id'].'/update';
|
||||||
|
$update = [
|
||||||
|
'dpt_airport_id' => '',
|
||||||
|
];
|
||||||
|
|
||||||
|
$response = $this->post($uri, $update);
|
||||||
|
$response->assertStatus(400);
|
||||||
|
$detail = $response->json('details');
|
||||||
|
|
||||||
|
$this->assertEquals('A departure airport is required', $detail);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Post a PIREP into a PREFILE state and post ACARS
|
* Post a PIREP into a PREFILE state and post ACARS
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user