diff --git a/app/Http/Controllers/Api/FlightController.php b/app/Http/Controllers/Api/FlightController.php index ae720eb3..070d8176 100644 --- a/app/Http/Controllers/Api/FlightController.php +++ b/app/Http/Controllers/Api/FlightController.php @@ -93,6 +93,7 @@ class FlightController extends Controller return response($e, 503); } + // TODO: Remove any flights here that a user doesn't have permissions to foreach ($flights as $flight) { $this->flightSvc->filterSubfleets(Auth::user(), $flight); } diff --git a/app/Http/Controllers/Frontend/FlightController.php b/app/Http/Controllers/Frontend/FlightController.php index 2533d7b6..4fe34a4c 100644 --- a/app/Http/Controllers/Frontend/FlightController.php +++ b/app/Http/Controllers/Frontend/FlightController.php @@ -8,50 +8,68 @@ use App\Repositories\AirlineRepository; use App\Repositories\AirportRepository; use App\Repositories\Criteria\WhereCriteria; use App\Repositories\FlightRepository; +use App\Repositories\SubfleetRepository; use App\Services\GeoService; use Flash; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; -use Log; +use Illuminate\Support\Facades\Log; use Prettus\Repository\Criteria\RequestCriteria; use Prettus\Repository\Exceptions\RepositoryException; -/** - * Class FlightController - */ class FlightController extends Controller { private $airlineRepo; private $airportRepo; private $flightRepo; + private $subfleetRepo; private $geoSvc; /** * FlightController constructor. * - * @param AirlineRepository $airlineRepo - * @param AirportRepository $airportRepo - * @param FlightRepository $flightRepo - * @param GeoService $geoSvc + * @param AirlineRepository $airlineRepo + * @param AirportRepository $airportRepo + * @param FlightRepository $flightRepo + * @param GeoService $geoSvc + * @param SubfleetRepository $subfleetRepo */ public function __construct( AirlineRepository $airlineRepo, AirportRepository $airportRepo, FlightRepository $flightRepo, - GeoService $geoSvc + GeoService $geoSvc, + SubfleetRepository $subfleetRepo ) { $this->airlineRepo = $airlineRepo; $this->airportRepo = $airportRepo; $this->flightRepo = $flightRepo; $this->geoSvc = $geoSvc; + $this->subfleetRepo = $subfleetRepo; } /** * @param Request $request * + * @throws \Prettus\Repository\Exceptions\RepositoryException + * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function index(Request $request) + { + return $this->search($request); + } + + /** + * Make a search request using the Repository search + * + * @param Request $request + * + * @throws \Prettus\Repository\Exceptions\RepositoryException + * + * @return mixed + */ + public function search(Request $request) { $where = [ 'active' => true, @@ -67,14 +85,17 @@ class FlightController extends Controller $where['dpt_airport_id'] = Auth::user()->curr_airport_id; } + $this->flightRepo->resetCriteria(); + try { + $this->flightRepo->searchCriteria($request); $this->flightRepo->pushCriteria(new WhereCriteria($request, $where)); $this->flightRepo->pushCriteria(new RequestCriteria($request)); } catch (RepositoryException $e) { Log::emergency($e); } - $flights = $this->flightRepo + $flights = $this->flightRepo->searchCriteria($request) ->with(['dpt_airport', 'arr_airport', 'airline']) ->orderBy('flight_number', 'asc') ->orderBy('route_leg', 'asc') @@ -84,10 +105,15 @@ class FlightController extends Controller ->pluck('flight_id')->toArray(); return view('flights.index', [ - 'airlines' => $this->airlineRepo->selectBoxList(true), - 'airports' => $this->airportRepo->selectBoxList(true), - 'flights' => $flights, - 'saved' => $saved_flights, + 'airlines' => $this->airlineRepo->selectBoxList(true), + 'airports' => $this->airportRepo->selectBoxList(true), + 'flights' => $flights, + 'saved' => $saved_flights, + 'subfleets' => $this->subfleetRepo->selectBoxList(true), + 'flight_number' => $request->input('flight_number'), + 'arr_icao' => $request->input('arr_icao'), + 'dep_icao' => $request->input('dep_icao'), + 'subfleet_id' => $request->input('subfleet_id'), ]); } @@ -114,62 +140,12 @@ class FlightController extends Controller ]); } - /** - * Make a search request using the Repository search - * - * @param Request $request - * - * @throws \Prettus\Repository\Exceptions\RepositoryException - * - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View - */ - public function search(Request $request) - { - $where = [ - 'active' => true, - 'visible' => true, - ]; - - if (setting('pilots.restrict_to_company')) { - $where['airline_id'] = Auth::user()->airline_id; - } - - // default restrictions on the flights shown. Handle search differently - if (setting('pilots.only_flights_from_current')) { - $where['dpt_airport_id'] = Auth::user()->curr_airport_id; - } - - $this->flightRepo->resetCriteria(); - - try { - $this->flightRepo->pushCriteria(new WhereCriteria($request, $where)); - } catch (RepositoryException $e) { - Log::emergency($e); - } - - $flights = $this->flightRepo->searchCriteria($request) - ->with(['dpt_airport', 'arr_airport', 'airline']) - ->orderBy('flight_number', 'asc') - ->orderBy('route_leg', 'asc') - ->paginate(); - - $saved_flights = Bid::where('user_id', Auth::id()) - ->pluck('flight_id')->toArray(); - - return view('flights.index', [ - 'airlines' => $this->airlineRepo->selectBoxList(true), - 'airports' => $this->airportRepo->selectBoxList(true), - 'flights' => $flights, - 'saved' => $saved_flights, - ]); - } - /** * Show the flight information page * * @param $id * - * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View + * @return mixed */ public function show($id) { diff --git a/app/Repositories/Criteria/WhereCriteria.php b/app/Repositories/Criteria/WhereCriteria.php index 906b4f99..5c63a41f 100644 --- a/app/Repositories/Criteria/WhereCriteria.php +++ b/app/Repositories/Criteria/WhereCriteria.php @@ -4,6 +4,7 @@ namespace App\Repositories\Criteria; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; +use Illuminate\Http\Request; use Prettus\Repository\Contracts\CriteriaInterface; use Prettus\Repository\Contracts\RepositoryInterface; @@ -17,17 +18,20 @@ class WhereCriteria implements CriteriaInterface */ protected $request; protected $where; + protected $relations; /** * Create a new Where search. * - * @param $request - * @param $where + * @param Request $request + * @param array $where + * @param array [$relations] Any whereHas (key = table name, value = array of criterea */ - public function __construct($request, $where) + public function __construct(Request $request, $where, $relations = []) { $this->request = $request; $this->where = $where; + $this->relations = $relations; } /** @@ -46,6 +50,17 @@ class WhereCriteria implements CriteriaInterface $model = $model->where($this->where); } + // See if any relationships need to be included in this WHERE + if ($this->relations) { + foreach ($this->relations as $relation => $criterea) { + $model = $model + ->with($relation) + ->whereHas($relation, function (Builder $query) use ($criterea) { + $query->where($criterea); + }); + } + } + return $model; } } diff --git a/app/Repositories/FlightRepository.php b/app/Repositories/FlightRepository.php index 45a9ab60..36a7f62b 100644 --- a/app/Repositories/FlightRepository.php +++ b/app/Repositories/FlightRepository.php @@ -74,6 +74,7 @@ class FlightRepository extends Repository implements CacheableInterface public function searchCriteria(Request $request, bool $only_active = true): self { $where = []; + $relations = []; if ($only_active === true) { $where['active'] = $only_active; @@ -81,48 +82,55 @@ class FlightRepository extends Repository implements CacheableInterface } if ($request->filled('flight_id')) { - $where['id'] = $request->flight_id; + $where['id'] = $request->input('flight_id'); } if ($request->filled('airline_id')) { - $where['airline_id'] = $request->airline_id; + $where['airline_id'] = $request->input('airline_id'); } if ($request->filled('flight_number')) { - $where['flight_number'] = $request->flight_number; + $where['flight_number'] = $request->input('flight_number'); } if ($request->filled('route_code')) { - $where['route_code'] = $request->route_code; + $where['route_code'] = $request->input('route_code'); } if ($request->filled('dpt_airport_id')) { - $where['dpt_airport_id'] = strtoupper($request->dpt_airport_id); + $where['dpt_airport_id'] = strtoupper($request->input('dpt_airport_id')); } if ($request->filled('dep_icao')) { - $where['dpt_airport_id'] = strtoupper($request->dep_icao); + $where['dpt_airport_id'] = strtoupper($request->input('dep_icao')); } if ($request->filled('arr_airport_id')) { - $where['arr_airport_id'] = strtoupper($request->arr_airport_id); + $where['arr_airport_id'] = strtoupper($request->input('arr_airport_id')); } if ($request->filled('arr_icao')) { - $where['arr_airport_id'] = strtoupper($request->arr_icao); + $where['arr_airport_id'] = strtoupper($request->input('arr_icao')); } // Distance, greater than if ($request->filled('dgt')) { - $where[] = ['distance', '>=', $request->dgt]; + $where[] = ['distance', '>=', $request->input('dgt')]; } // Distance, less than if ($request->filled('dlt')) { - $where[] = ['distance', '<=', $request->dlt]; + $where[] = ['distance', '<=', $request->input('dlt')]; } - $this->pushCriteria(new WhereCriteria($request, $where)); + // Do a special query for finding the child subfleets + if ($request->filled('subfleet_id')) { + $relations['subfleets'] = [ + 'subfleets.id' => $request->input('subfleet_id'), + ]; + } + + $this->pushCriteria(new WhereCriteria($request, $where, $relations)); return $this; } diff --git a/app/Repositories/SubfleetRepository.php b/app/Repositories/SubfleetRepository.php index 774e4a17..16a9d210 100644 --- a/app/Repositories/SubfleetRepository.php +++ b/app/Repositories/SubfleetRepository.php @@ -7,9 +7,6 @@ use App\Models\Subfleet; use Prettus\Repository\Contracts\CacheableInterface; use Prettus\Repository\Traits\CacheableRepository; -/** - * Class SubfleetRepository - */ class SubfleetRepository extends Repository implements CacheableInterface { use CacheableRepository; @@ -26,4 +23,27 @@ class SubfleetRepository extends Repository implements CacheableInterface { return Subfleet::class; } + + /** + * Return the list of aircraft formatted for a select box + * + * @param bool $add_blank + * + * @return array + */ + public function selectBoxList($add_blank = false): array + { + $retval = []; + $items = $this->all(); + + if ($add_blank) { + $retval[''] = ''; + } + + foreach ($items as $i) { + $retval[$i->id] = $i->name; + } + + return $retval; + } } diff --git a/resources/lang/en/common.php b/resources/lang/en/common.php index 12f128b1..04120738 100644 --- a/resources/lang/en/common.php +++ b/resources/lang/en/common.php @@ -24,6 +24,7 @@ return [ 'arrival' => 'Arrival', 'aircraft' => 'Aircraft', 'airline' => 'Airline', + 'subfleet' => 'Subfleet', 'distance' => 'Distance', 'fuel' => 'Fuel', 'metar' => 'METAR', diff --git a/resources/lang/es/common.php b/resources/lang/es/common.php index 787edca9..5d49f711 100644 --- a/resources/lang/es/common.php +++ b/resources/lang/es/common.php @@ -24,6 +24,7 @@ return [ 'arrival' => 'Llegada', 'aircraft' => 'Aeronave', 'airline' => 'AerolĂnea', + 'subfleet' => 'Subfleet', 'distance' => 'DistancĂa', 'fuel' => 'Combustible', 'metar' => 'METAR', diff --git a/resources/lang/it/common.php b/resources/lang/it/common.php index 61e77bb5..a58f9f6f 100644 --- a/resources/lang/it/common.php +++ b/resources/lang/it/common.php @@ -24,6 +24,7 @@ return [ 'arrival' => 'Arrivo', 'aircraft' => 'Aereomobile', 'airline' => 'Compagnia Aerea', + 'subfleet' => 'Subfleet', 'distance' => 'Distanza', 'fuel' => 'Carburante', 'metar' => 'METAR', diff --git a/resources/views/layouts/default/flights/search.blade.php b/resources/views/layouts/default/flights/search.blade.php index b85eca92..d69c43ca 100644 --- a/resources/views/layouts/default/flights/search.blade.php +++ b/resources/views/layouts/default/flights/search.blade.php @@ -22,6 +22,11 @@ {{ Form::select('arr_icao', $airports, null , ['class' => 'form-control select2']) }} +
@lang('common.subfleet')
+ {{ Form::select('subfleet_id', $subfleets, null , ['class' => 'form-control select2']) }} +