From 1ee9041058b10f163c9cc6ce37775f83867568e5 Mon Sep 17 00:00:00 2001 From: Nabeel Shahzad Date: Fri, 5 Jan 2018 10:45:34 -0600 Subject: [PATCH] Add /api/fleet to get subfleets and all the aircraft #120 --- app/Database/factories/AircraftFactory.php | 2 +- app/Database/factories/RankFactory.php | 21 ++++++++++++ app/Http/Controllers/Api/AcarsController.php | 5 +-- .../Controllers/Api/AirportController.php | 3 +- app/Http/Controllers/Api/FleetController.php | 34 +++++++++++++++++++ app/Http/Controllers/Api/FlightController.php | 4 +-- app/Http/Controllers/Api/StatusController.php | 4 +-- app/Http/Controllers/Api/UserController.php | 5 +-- app/Models/Subfleet.php | 10 +++--- app/Routes/api.php | 10 +++--- tests/ApiTest.php | 34 +++++++++++++++++++ 11 files changed, 105 insertions(+), 27 deletions(-) create mode 100644 app/Database/factories/RankFactory.php create mode 100644 app/Http/Controllers/Api/FleetController.php diff --git a/app/Database/factories/AircraftFactory.php b/app/Database/factories/AircraftFactory.php index b3346721..b8742541 100644 --- a/app/Database/factories/AircraftFactory.php +++ b/app/Database/factories/AircraftFactory.php @@ -4,7 +4,7 @@ use Faker\Generator as Faker; $factory->define(App\Models\Aircraft::class, function (Faker $faker) { return [ - 'id' => $faker->unique()->numberBetween(10, 10000), + 'id' => $faker->unique()->numberBetween(10, 100000), 'subfleet_id' => function() { return factory(App\Models\Subfleet::class)->create()->id; }, diff --git a/app/Database/factories/RankFactory.php b/app/Database/factories/RankFactory.php new file mode 100644 index 00000000..f63b628a --- /dev/null +++ b/app/Database/factories/RankFactory.php @@ -0,0 +1,21 @@ +define(App\Models\Rank::class, function (Faker $faker) { + return [ + 'id' => $faker->unique()->numberBetween(10, 10000), + 'name' => $faker->unique()->text(50), + 'hours' => $faker->numberBetween(10, 50), + 'auto_approve_acars' => 0, + 'auto_approve_manual' => 0, + 'auto_promote' => 0, + ]; +}); diff --git a/app/Http/Controllers/Api/AcarsController.php b/app/Http/Controllers/Api/AcarsController.php index 30e50587..5faaf3f2 100644 --- a/app/Http/Controllers/Api/AcarsController.php +++ b/app/Http/Controllers/Api/AcarsController.php @@ -2,17 +2,14 @@ namespace App\Http\Controllers\Api; -use Log; use Illuminate\Http\Request; -use App\Http\Controllers\AppBaseController; -use App\Models\Acars; use App\Services\GeoService; use App\Repositories\AcarsRepository; use App\Repositories\PirepRepository; -class AcarsController extends AppBaseController +class AcarsController extends RestController { protected $acarsRepo, $geoSvc, $pirepRepo; diff --git a/app/Http/Controllers/Api/AirportController.php b/app/Http/Controllers/Api/AirportController.php index 52c8cfbe..a56b1316 100644 --- a/app/Http/Controllers/Api/AirportController.php +++ b/app/Http/Controllers/Api/AirportController.php @@ -3,13 +3,12 @@ namespace App\Http\Controllers\Api; use App\Repositories\AirportRepository; -use App\Http\Controllers\AppBaseController; use App\Http\Resources\Airport as AirportResource; use Illuminate\Support\Facades\Cache; use VaCentral\Airport as AirportLookup; -class AirportController extends AppBaseController +class AirportController extends RestController { protected $airportRepo; diff --git a/app/Http/Controllers/Api/FleetController.php b/app/Http/Controllers/Api/FleetController.php new file mode 100644 index 00000000..4d4bbfdd --- /dev/null +++ b/app/Http/Controllers/Api/FleetController.php @@ -0,0 +1,34 @@ +aircraftRepo = $airportRepo; + $this->subfleetRepo = $airportRepo; + } + + /** + * Return all the subfleets and the aircraft and any other associated data + * Paginated + */ + public function index() + { + $airports = $this->subfleetRepo + ->with(['aircraft', 'airline', 'fares', 'ranks']) + ->paginate(50); + + return SubfleetResource::collection($airports); + } +} diff --git a/app/Http/Controllers/Api/FlightController.php b/app/Http/Controllers/Api/FlightController.php index 0dbd4e19..e5d8d122 100644 --- a/app/Http/Controllers/Api/FlightController.php +++ b/app/Http/Controllers/Api/FlightController.php @@ -2,16 +2,14 @@ namespace App\Http\Controllers\Api; -use Log; use Illuminate\Http\Request; -use App\Http\Controllers\AppBaseController; use App\Repositories\FlightRepository; use App\Http\Resources\Flight as FlightResource; use Prettus\Repository\Exceptions\RepositoryException; -class FlightController extends AppBaseController +class FlightController extends RestController { protected $flightRepo; diff --git a/app/Http/Controllers/Api/StatusController.php b/app/Http/Controllers/Api/StatusController.php index a8f1d9fd..fae2f9cd 100644 --- a/app/Http/Controllers/Api/StatusController.php +++ b/app/Http/Controllers/Api/StatusController.php @@ -3,10 +3,8 @@ namespace App\Http\Controllers\Api; use PragmaRX\Version\Package\Facade as Version; -use App\Http\Controllers\AppBaseController; - -class StatusController extends AppBaseController +class StatusController extends RestController { public function status() { diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php index 4372493c..e1bb2dc1 100644 --- a/app/Http/Controllers/Api/UserController.php +++ b/app/Http/Controllers/Api/UserController.php @@ -5,18 +5,15 @@ namespace App\Http\Controllers\Api; use Auth; use Illuminate\Http\Request; -use App\Http\Controllers\AppBaseController; use App\Repositories\UserRepository; -use App\Models\User; use App\Models\UserBid; use App\Http\Resources\Flight as FlightResource; use App\Http\Resources\User as UserResource; -use App\Http\Resources\UserBid as UserBidResource; -class UserController extends AppBaseController +class UserController extends RestController { protected $userRepo; diff --git a/app/Models/Subfleet.php b/app/Models/Subfleet.php index 0430208c..41294e6f 100644 --- a/app/Models/Subfleet.php +++ b/app/Models/Subfleet.php @@ -41,31 +41,31 @@ class Subfleet extends BaseModel public function aircraft() { - return $this->hasMany('App\Models\Aircraft', 'subfleet_id'); + return $this->hasMany(Aircraft::class, 'subfleet_id'); } public function airline() { - return $this->belongsTo('App\Models\Airline', 'airline_id'); + return $this->belongsTo(Airline::class, 'airline_id'); } public function fares() { return $this->belongsToMany( - 'App\Models\Fare', + Fare::class, 'subfleet_fare' )->withPivot('price', 'cost', 'capacity'); } public function flights() { - return $this->belongsToMany('App\Models\Flight', 'subfleet_flight'); + return $this->belongsToMany(Flight::class, 'subfleet_flight'); } public function ranks() { return $this->belongsToMany( - 'App\Models\Ranks', + Rank::class, 'subfleet_rank' )->withPivot('acars_pay', 'manual_pay'); } diff --git a/app/Routes/api.php b/app/Routes/api.php index 9bf8fb87..20a4dbec 100755 --- a/app/Routes/api.php +++ b/app/Routes/api.php @@ -11,11 +11,14 @@ Route::group([], function() Route::get('airports/{id}', 'AirportController@get'); Route::get('airports/{id}/lookup', 'AirportController@lookup'); + Route::get('fleet', 'FleetController@index'); + Route::get('flights/search', 'FlightController@search'); Route::get('flights/{id}', 'FlightController@get'); - Route::get('pireps/{id}/acars', 'PirepController@acars_get'); - Route::get('pireps/{id}/geojson', 'PirepController@acars_get'); + Route::get('pireps/{id}/route', 'PirepController@route_get'); + Route::get('pireps/{id}/acars/positions', 'PirepController@acars_get'); + Route::get('pireps/{id}/acars/geojson', 'PirepController@acars_geojson'); Route::get('status', 'StatusController@status'); }); @@ -32,16 +35,13 @@ Route::group(['middleware' => ['api.auth']], function () Route::delete('pireps/{id}/cancel', 'PirepController@cancel'); Route::get('pireps/{id}/acars/geojson', 'PirepController@acars_geojson'); - Route::get('pireps/{id}/acars/position', 'PirepController@acars_get'); Route::post('pireps/{id}/acars/position', 'PirepController@acars_store'); - Route::get('pireps/{id}/acars/positions', 'PirepController@acars_get'); Route::post('pireps/{id}/acars/positions', 'PirepController@acars_store'); Route::post('pireps/{id}/acars/log', 'PirepController@acars_log'); Route::post('pireps/{id}/acars/logs', 'PirepController@acars_log'); - Route::get('pireps/{id}/route', 'PirepController@route_get'); Route::post('pireps/{id}/route', 'PirepController@route_post'); Route::delete('pireps/{id}/route', 'PirepController@route_delete'); diff --git a/tests/ApiTest.php b/tests/ApiTest.php index b64bf8c9..103b998b 100644 --- a/tests/ApiTest.php +++ b/tests/ApiTest.php @@ -105,4 +105,38 @@ class ApiTest extends TestCase ->assertStatus(200) ->assertJsonCount(20, 'data'); } + + /** + * Test getting the subfleets + */ + public function testGetSubfleets() + { + $user = factory(App\Models\User::class)->create(); + $subfleetA = factory(App\Models\Subfleet::class)->create(); + $subfleetB = factory(App\Models\Subfleet::class)->create(); + + $subfleetA_size = \random_int(2, 10); + $subfleetB_size = \random_int(2, 10); + factory(App\Models\Aircraft::class, $subfleetA_size)->create([ + 'subfleet_id' => $subfleetA->id + ]); + + factory(App\Models\Aircraft::class, $subfleetB_size)->create([ + 'subfleet_id' => $subfleetB->id + ]); + + $response = $this->user_get($user, '/api/fleet'); + $response->assertStatus(200); + $body = $response->json(); + + foreach($body['data'] as $subfleet) { + if($subfleet['id'] === $subfleetA->id) { + $size = $subfleetA_size; + } else { + $size = $subfleetB_size; + } + + $this->assertCount($size, $subfleet['aircraft']); + } + } }