Overhaul of ACARS/PIREP APIs

This commit is contained in:
Nabeel Shahzad
2018-01-04 19:33:23 -06:00
parent f4e3964f9d
commit b62fa7757c
10 changed files with 491 additions and 86 deletions

View File

@@ -21,18 +21,29 @@ use App\Repositories\PirepRepository;
use App\Http\Resources\Acars as AcarsResource;
use App\Http\Resources\Pirep as PirepResource;
use App\Http\Resources\AcarsLog as AcarsLogResource;
use App\Http\Resources\AcarsRoute as AcarsRouteResource;
use App\Http\Controllers\AppBaseController;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
class PirepController extends AppBaseController
class PirepController extends RestController
{
protected $acarsRepo,
$geoSvc,
$pirepRepo,
$pirepSvc;
public static $acars_rules = [
'altitude',
'level',
'heading',
'vs',
'gs',
'transponder',
'autopilot',
'fuel_flow',
'log',
'lat',
'lon',
'created_at',
];
protected $check_attrs = [
public static $pirep_rules = [
'airline_id',
'aircraft_id',
'dpt_airport_id',
@@ -48,6 +59,18 @@ class PirepController extends AppBaseController
'notes',
];
protected $acarsRepo,
$geoSvc,
$pirepRepo,
$pirepSvc;
/**
* PirepController constructor.
* @param AcarsRepository $acarsRepo
* @param GeoService $geoSvc
* @param PirepRepository $pirepRepo
* @param PIREPService $pirepSvc
*/
public function __construct(
AcarsRepository $acarsRepo,
GeoService $geoSvc,
@@ -72,22 +95,17 @@ class PirepController extends AppBaseController
* status, and whatever other statuses may be defined
*
* TODO: Allow extra fields, etc to be set. Aircraft, etc
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
*/
public function prefile(Request $request)
{
Log::info('PIREP Prefile, user '.Auth::user()->id, $request->toArray());
$attrs = [
'user_id' => Auth::user()->id,
'state' => PirepState::IN_PROGRESS,
'status' => PirepStatus::PREFILE,
];
foreach ($this->check_attrs as $attr) {
if ($request->filled($attr)) {
$attrs[$attr] = $request->get($attr);
}
}
$attrs = $this->getFromReq($request, self::$pirep_rules, [
'user_id' => Auth::user()->id,
'state' => PirepState::IN_PROGRESS,
'status' => PirepStatus::PREFILE,
]);
$pirep = new Pirep($attrs);
@@ -130,16 +148,10 @@ class PirepController extends AppBaseController
throw new BadRequestHttpException('PIREP has been cancelled, updates can\'t be posted');
}
$attrs = [
'state' => PirepState::PENDING,
'status' => PirepStatus::ARRIVED,
];
foreach($this->check_attrs as $attr) {
if($request->filled($attr)) {
$attrs[$attr] = $request->get($attr);
}
}
$attrs = $this->getFromReq($request, self::$pirep_rules, [
'state' => PirepState::PENDING,
'status' => PirepStatus::ARRIVED,
]);
$pirep_fields = [];
if($request->filled('fields')) {
@@ -187,7 +199,7 @@ class PirepController extends AppBaseController
* @param Request $request
* @return \Illuminate\Contracts\Routing\ResponseFactory
*/
public function acars_get($id, Request $request)
public function acars_geojson($id, Request $request)
{
$pirep = $this->pirepRepo->find($id);
$geodata = $this->geoSvc->getFeatureFromAcars($pirep);
@@ -197,11 +209,28 @@ class PirepController extends AppBaseController
]);
}
/**
* Return the GeoJSON for the ACARS line
* @param $id
* @param Request $request
* @return AcarsRouteResource
*/
public function acars_get($id, Request $request)
{
$pirep = $this->pirepRepo->find($id);
AcarsRouteResource::withoutWrapping();
return new AcarsRouteResource(Acars::where([
'pirep_id' => $id,
'type' => AcarsType::FLIGHT_PATH
])->orderBy('created_at', 'asc')->get());
}
/**
* Post ACARS updates for a PIREP
* @param $id
* @param Request $request
* @return AcarsResource
* @return AcarsRouteResource
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
*/
public function acars_store($id, Request $request)
@@ -214,20 +243,31 @@ class PirepController extends AppBaseController
}
Log::info('Posting ACARS update', $request->toArray());
$attrs = $request->toArray();
$attrs['pirep_id'] = $id;
$attrs['type'] = AcarsType::FLIGHT_PATH;
$this->validate($request, ['positions' => 'required']);
$positions = $request->post()['positions'];
$update = Acars::create($attrs);
$update->save();
foreach($positions as $position)
{
try {
$attrs = $this->getFromReq(
$position,
self::$acars_rules,
['pirep_id' => $id, 'type' => AcarsType::FLIGHT_PATH]
);
$update = Acars::create($attrs);
$update->save();
} catch (\Exception $e) {
Log::error($e);
}
}
# Change the PIREP status
$pirep->status = PirepStatus::ENROUTE;
$pirep->save();
AcarsResource::withoutWrapping();
return new AcarsResource($update);
return $this->acars_get($id, $request);
}
/**
@@ -235,7 +275,7 @@ class PirepController extends AppBaseController
* But rather in a log file.
* @param $id
* @param Request $request
* @return AcarsResource
* @return AcarsLogResource
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
*/
public function acars_log($id, Request $request)
@@ -247,20 +287,103 @@ class PirepController extends AppBaseController
throw new BadRequestHttpException('PIREP has been cancelled, updates can\'t be posted');
}
Log::info('Posting ACARS update', $request->toArray());
$attrs = $request->toArray();
Log::info('Posting ACARS log', $request->toArray());
$attrs['pirep_id'] = $id;
$attrs['type'] = AcarsType::LOG;
$attrs = $this->getFromReq($request, [
'log' => 'required',
'lat' => 'nullable',
'lon' => 'nullable',
], ['pirep_id' => $id, 'type' => AcarsType::LOG]);
$update = Acars::create($attrs);
$update->save();
$acars = Acars::create($attrs);
$acars->save();
# Change the PIREP status
$pirep->status = PirepStatus::ENROUTE;
$pirep->save();
AcarsLogResource::withoutWrapping();
return new AcarsLogResource($acars);
}
AcarsResource::withoutWrapping();
return new AcarsResource($update);
/**
* @param $id
* @param Request $request
* @return AcarsRouteResource
*/
public function route_get($id, Request $request)
{
$this->pirepRepo->find($id);
AcarsRouteResource::withoutWrapping();
return new AcarsRouteResource(Acars::where([
'pirep_id' => $id,
'type' => AcarsType::ROUTE
])->orderBy('order', 'asc')->get());
}
/**
* Post the ROUTE for a PIREP, can be done from the ACARS log
* @param $id
* @param Request $request
* @return AcarsRouteResource
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
*/
public function route_post($id, Request $request)
{
$pirep = $this->pirepRepo->find($id);
# Check if the status is cancelled...
if ($pirep->state === PirepState::CANCELLED) {
throw new BadRequestHttpException('PIREP has been cancelled, updates can\'t be posted');
}
Log::info('Posting ACARS ROUTE', $request->toArray());
$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->all()['route'];
foreach($route as $position) {
$attrs = [
'pirep_id' => $id,
'type' => AcarsType::ROUTE,
'name' => $position['name'],
'order' => $position['order'],
'lat' => $position['lat'],
'lon' => $position['lon'],
];
if(array_key_exists('nav_type', $position)) {
$attrs['nav_type'] = $position['nav_type'];
}
try {
$acars = Acars::create($attrs);
$acars->save();
} catch (\Exception $e) {
Log::error($e);
}
}
return $this->route_get($id, $request);
}
/**
* @param $id
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function route_delete($id, Request $request)
{
$this->pirepRepo->find($id);
Acars::where([
'pirep_id' => $id,
'type' => AcarsType::ROUTE
])->delete();
return $this->message('Route deleted');
}
}