From 500cbb8e061719a51e1c81974972e6d97fce0e61 Mon Sep 17 00:00:00 2001 From: Nabeel Shahzad Date: Fri, 5 Jan 2018 13:00:45 -0600 Subject: [PATCH] Add lookup for aircraft as /fleet/aircraft/{id} #120 --- app/Database/factories/AircraftFactory.php | 3 +- app/Database/factories/AirlineFactory.php | 11 +++-- app/Database/factories/FareFactory.php | 2 +- app/Database/factories/RankFactory.php | 2 +- app/Database/factories/SubfleetFactory.php | 2 +- app/Database/factories/UserFactory.php | 2 +- app/Http/Controllers/Api/FleetController.php | 43 ++++++++++++++++---- app/Routes/api.php | 1 + tests/ApiTest.php | 34 ++++++++++++++++ 9 files changed, 85 insertions(+), 15 deletions(-) diff --git a/app/Database/factories/AircraftFactory.php b/app/Database/factories/AircraftFactory.php index b8742541..3e6caa37 100644 --- a/app/Database/factories/AircraftFactory.php +++ b/app/Database/factories/AircraftFactory.php @@ -4,13 +4,14 @@ use Faker\Generator as Faker; $factory->define(App\Models\Aircraft::class, function (Faker $faker) { return [ - 'id' => $faker->unique()->numberBetween(10, 100000), + #'id' => $faker->unique()->numberBetween(10, 100000), 'subfleet_id' => function() { return factory(App\Models\Subfleet::class)->create()->id; }, 'airport_id' => function () { return factory(App\Models\Airport::class)->create()->id; }, + 'icao' => $faker->unique()->text(5), 'name' => $faker->unique()->text(50), 'registration' => $faker->unique()->text(10), 'tail_number' => $faker->unique()->text(10), diff --git a/app/Database/factories/AirlineFactory.php b/app/Database/factories/AirlineFactory.php index 4dbac59e..19f5ee32 100644 --- a/app/Database/factories/AirlineFactory.php +++ b/app/Database/factories/AirlineFactory.php @@ -1,15 +1,20 @@ define(App\Models\Airline::class, function (Faker $faker) { return [ - 'id' => $faker->unique()->numberBetween(10, 10000), - 'icao' => function(array $apt) { return substr($apt['id'],0, 4); }, - 'iata' => function (array $apt) { return $apt['id']; }, + #'id' => $faker->unique()->numberBetween(10, 10000), + 'icao' => function (array $apt) use ($faker) { + $hashids = new Hashids(microtime(), 5); + $mt = str_replace('.', '', microtime(true)); + return $hashids->encode($mt); + }, + 'iata' => function (array $apt) { return $apt['icao']; }, 'name' => $faker->sentence(3), 'country' => $faker->country, 'active' => 1 diff --git a/app/Database/factories/FareFactory.php b/app/Database/factories/FareFactory.php index 43cdd3ce..d3fb3a38 100644 --- a/app/Database/factories/FareFactory.php +++ b/app/Database/factories/FareFactory.php @@ -4,7 +4,7 @@ use Faker\Generator as Faker; $factory->define(App\Models\Fare::class, function (Faker $faker) { return [ - 'id' => $faker->unique()->numberBetween(10, 10000), + #'id' => $faker->unique()->numberBetween(10, 10000), 'code' => $faker->text(5), 'name' => $faker->text(20), 'price' => $faker->randomFloat(2, 100, 1000), diff --git a/app/Database/factories/RankFactory.php b/app/Database/factories/RankFactory.php index f63b628a..7237a7b0 100644 --- a/app/Database/factories/RankFactory.php +++ b/app/Database/factories/RankFactory.php @@ -11,7 +11,7 @@ use Faker\Generator as Faker; */ $factory->define(App\Models\Rank::class, function (Faker $faker) { return [ - 'id' => $faker->unique()->numberBetween(10, 10000), + #'id' => $faker->unique()->numberBetween(10, 10000), 'name' => $faker->unique()->text(50), 'hours' => $faker->numberBetween(10, 50), 'auto_approve_acars' => 0, diff --git a/app/Database/factories/SubfleetFactory.php b/app/Database/factories/SubfleetFactory.php index fe85d702..2bfd9fae 100644 --- a/app/Database/factories/SubfleetFactory.php +++ b/app/Database/factories/SubfleetFactory.php @@ -4,7 +4,7 @@ use Faker\Generator as Faker; $factory->define(App\Models\Subfleet::class, function (Faker $faker) { return [ - 'id' => $faker->unique()->numberBetween(10, 10000), + #'id' => $faker->unique()->numberBetween(10, 10000), 'airline_id' => 1, 'name' => $faker->unique()->text(50), 'type' => $faker->unique()->text(7), diff --git a/app/Database/factories/UserFactory.php b/app/Database/factories/UserFactory.php index 498dd266..3ead240c 100644 --- a/app/Database/factories/UserFactory.php +++ b/app/Database/factories/UserFactory.php @@ -7,7 +7,7 @@ $factory->define(App\Models\User::class, function (Faker $faker) static $password; return [ - 'id' => $faker->unique()->numberBetween(10, 10000), + #'id' => $faker->unique()->numberBetween(10, 10000), 'name' => $faker->name, 'email' => $faker->safeEmail, 'password' => $password ?: $password = Hash::make('secret'), diff --git a/app/Http/Controllers/Api/FleetController.php b/app/Http/Controllers/Api/FleetController.php index 4d4bbfdd..be950893 100644 --- a/app/Http/Controllers/Api/FleetController.php +++ b/app/Http/Controllers/Api/FleetController.php @@ -2,9 +2,12 @@ namespace App\Http\Controllers\Api; +use Illuminate\Http\Request; + use App\Repositories\AircraftRepository; use App\Repositories\SubfleetRepository; +use App\Http\Resources\Aircraft as AircraftResource; use App\Http\Resources\Subfleet as SubfleetResource; class FleetController extends RestController @@ -13,10 +16,10 @@ class FleetController extends RestController public function __construct( AircraftRepository $aircraftRepo, - SubfleetRepository $airportRepo + SubfleetRepository $subfleetRepo ) { - $this->aircraftRepo = $airportRepo; - $this->subfleetRepo = $airportRepo; + $this->aircraftRepo = $aircraftRepo; + $this->subfleetRepo = $subfleetRepo; } /** @@ -25,10 +28,36 @@ class FleetController extends RestController */ public function index() { - $airports = $this->subfleetRepo - ->with(['aircraft', 'airline', 'fares', 'ranks']) - ->paginate(50); + $subfleets = $this->subfleetRepo + ->with(['aircraft', 'airline', 'fares', 'ranks']) + ->paginate(50); - return SubfleetResource::collection($airports); + return SubfleetResource::collection($subfleets); + } + + /** + * Get a specific aircraft. Query string required to specify the tail + * /api/aircraft/XYZ?type=registration + * @param $id + * @param Request $request + * @return AircraftResource + */ + public function get_aircraft($id, Request $request) + { + $where = []; + if($request->filled('type')) { + $where[$request->get('type')] = $id; + } else { + $where['id'] = $id; + } + + $all_aircraft = $this->aircraftRepo->all(); + $aircraft = $this->aircraftRepo + ->with(['subfleet']) + ->findWhere($where) + ->first(); + + AircraftResource::withoutWrapping(); + return new AircraftResource($aircraft); } } diff --git a/app/Routes/api.php b/app/Routes/api.php index 20a4dbec..64701c22 100755 --- a/app/Routes/api.php +++ b/app/Routes/api.php @@ -12,6 +12,7 @@ Route::group([], function() Route::get('airports/{id}/lookup', 'AirportController@lookup'); Route::get('fleet', 'FleetController@index'); + Route::get('fleet/aircraft/{id}', 'FleetController@get_aircraft'); Route::get('flights/search', 'FlightController@search'); Route::get('flights/{id}', 'FlightController@get'); diff --git a/tests/ApiTest.php b/tests/ApiTest.php index 103b998b..6527c4e5 100644 --- a/tests/ApiTest.php +++ b/tests/ApiTest.php @@ -139,4 +139,38 @@ class ApiTest extends TestCase $this->assertCount($size, $subfleet['aircraft']); } } + + /** + * Test getting an aircraft + */ + public function testGetAircraft() + { + $user = factory(App\Models\User::class)->create(); + $subfleet = factory(App\Models\Subfleet::class)->create(); + $aircraft = factory(App\Models\Aircraft::class)->create([ + 'subfleet_id' => $subfleet->id + ]); + + /** + * Just try retrieving by ID + */ + $resp = $this->user_get($user, '/api/fleet/aircraft/'. $aircraft->id); + $body = $resp->json(); + $this->assertEquals($body['id'], $aircraft->id); + + $resp = $this->user_get($user, + '/api/fleet/aircraft/'.$aircraft->id.'?registration='.$aircraft->registration); + $body = $resp->json(); + $this->assertEquals($body['id'], $aircraft->id); + + $resp = $this->user_get($user, + '/api/fleet/aircraft/' . $aircraft->id . '?tail_number=' . $aircraft->registration); + $body = $resp->json(); + $this->assertEquals($body['id'], $aircraft->id); + + $resp = $this->user_get($user, + '/api/fleet/aircraft/' . $aircraft->id . '?icao=' . $aircraft->icao); + $body = $resp->json(); + $this->assertEquals($body['id'], $aircraft->id); + } }