phpvms/app/Http/Controllers/Api/AcarsController.php

309 lines
8.8 KiB
PHP
Raw Normal View History

<?php
namespace App\Http\Controllers\Api;
2019-07-16 03:51:35 +08:00
use App\Contracts\Controller;
use App\Exceptions\PirepCancelled;
use App\Http\Requests\Acars\EventRequest;
use App\Http\Requests\Acars\LogRequest;
use App\Http\Requests\Acars\PositionRequest;
use App\Http\Resources\AcarsRoute as AcarsRouteResource;
use App\Http\Resources\Pirep as PirepResource;
use App\Models\Acars;
use App\Models\Enums\AcarsType;
use App\Models\Enums\PirepStatus;
use App\Models\Pirep;
use App\Repositories\AcarsRepository;
use App\Repositories\PirepRepository;
2018-02-21 12:33:09 +08:00
use App\Services\GeoService;
use Carbon\Carbon;
use Illuminate\Database\QueryException;
2018-02-21 12:33:09 +08:00
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
class AcarsController extends Controller
{
2018-08-27 00:40:04 +08:00
private $acarsRepo;
private $geoSvc;
private $pirepRepo;
2018-02-21 12:33:09 +08:00
/**
* AcarsController constructor.
2018-08-27 00:40:04 +08:00
*
2018-02-21 12:33:09 +08:00
* @param AcarsRepository $acarsRepo
* @param GeoService $geoSvc
* @param PirepRepository $pirepRepo
2018-02-21 12:33:09 +08:00
*/
public function __construct(
AcarsRepository $acarsRepo,
GeoService $geoSvc,
2018-08-27 02:50:08 +08:00
PirepRepository $pirepRepo
) {
$this->geoSvc = $geoSvc;
$this->acarsRepo = $acarsRepo;
$this->pirepRepo = $pirepRepo;
}
/**
* Check if a PIREP is cancelled
2018-08-27 00:40:04 +08:00
*
* @param $pirep
2018-08-27 00:40:04 +08:00
*
* @throws \App\Exceptions\PirepCancelled
*/
protected function checkCancelled(Pirep $pirep)
{
2018-05-12 01:08:55 +08:00
if ($pirep->cancelled) {
throw new PirepCancelled($pirep);
}
}
/**
* Get all the active PIREPs
*
* @return mixed
*/
public function live_flights()
{
$pireps = $this->acarsRepo->getPositions(setting('acars.live_time'))->filter(function ($pirep) {
return $pirep->position !== null;
});
return PirepResource::collection($pireps);
}
/**
* Return all of the flights (as points) in GeoJSON format
2018-08-27 00:40:04 +08:00
*
2018-02-21 12:33:09 +08:00
* @param Request $request
2018-08-27 00:40:04 +08:00
*
2018-02-21 12:33:09 +08:00
* @return mixed
*/
public function pireps_geojson(Request $request)
{
$pireps = $this->acarsRepo->getPositions(setting('acars.live_time'));
$positions = $this->geoSvc->getFeatureForLiveFlights($pireps);
return response()->json([
'data' => $positions,
]);
}
/**
* Return the GeoJSON for the ACARS line
2018-08-27 00:40:04 +08:00
*
* @param $pirep_id
* @param Request $request
2018-08-27 00:40:04 +08:00
*
* @return \Illuminate\Http\JsonResponse
*/
public function acars_geojson($pirep_id, Request $request)
{
$pirep = Pirep::find($pirep_id);
$geodata = $this->geoSvc->getFeatureFromAcars($pirep);
return response()->json([
'data' => $geodata,
]);
}
/**
* Return the routes for the ACARS line
2018-08-27 00:40:04 +08:00
*
* @param $id
* @param Request $request
2018-08-27 00:40:04 +08:00
*
* @return AcarsRouteResource
*/
public function acars_get($id, Request $request)
{
$this->pirepRepo->find($id);
return new AcarsRouteResource(Acars::where([
'pirep_id' => $id,
2018-08-27 00:40:04 +08:00
'type' => AcarsType::FLIGHT_PATH,
2018-05-29 07:15:51 +08:00
])->orderBy('sim_time', 'asc')->get());
}
/**
* Post ACARS updates for a PIREP
2018-08-27 00:40:04 +08:00
*
* @param $id
* @param PositionRequest $request
2018-08-27 00:40:04 +08:00
*
* @throws \App\Exceptions\PirepCancelled
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
2018-08-27 00:40:04 +08:00
*
* @return \Illuminate\Http\JsonResponse
*/
public function acars_store($id, PositionRequest $request)
{
2018-08-27 00:40:04 +08:00
// Check if the status is cancelled...
$pirep = Pirep::find($id);
$this->checkCancelled($pirep);
Log::debug(
'Posting ACARS update (user: '.Auth::user()->ident.', pirep id :'.$id.'): ',
$request->post()
);
$count = 0;
$positions = $request->post('positions');
foreach ($positions as $position) {
$position['pirep_id'] = $id;
$position['type'] = AcarsType::FLIGHT_PATH;
2020-02-23 05:03:01 +08:00
if (isset($position['sim_time'])) {
2018-08-27 01:25:51 +08:00
if ($position['sim_time'] instanceof \DateTime) {
$position['sim_time'] = Carbon::instance($position['sim_time']);
} else {
$position['sim_time'] = Carbon::createFromTimeString($position['sim_time']);
}
}
2020-02-23 05:03:01 +08:00
if (isset($position['created_at'])) {
2018-08-27 01:25:51 +08:00
if ($position['created_at'] instanceof \DateTime) {
$position['created_at'] = Carbon::instance($position['created_at']);
} else {
$position['created_at'] = Carbon::createFromTimeString($position['created_at']);
}
}
try {
2020-02-23 05:03:01 +08:00
if (isset($position['id'])) {
Acars::updateOrInsert(
['id' => $position['id']],
$position
);
} else {
$update = Acars::create($position);
$update->save();
}
$count++;
} catch (QueryException $ex) {
Log::info('Error on adding ACARS position: '.$ex->getMessage());
}
}
2018-08-27 00:40:04 +08:00
// Change the PIREP status if it's as SCHEDULED before
if ($pirep->status === PirepStatus::INITIATED) {
$pirep->status = PirepStatus::AIRBORNE;
}
$pirep->save();
return $this->message($count.' positions added', $count);
}
/**
* Post ACARS LOG update for a PIREP. These updates won't show up on the map
* But rather in a log file.
2018-08-27 00:40:04 +08:00
*
* @param $id
* @param LogRequest $request
2018-08-27 00:40:04 +08:00
*
* @throws \App\Exceptions\PirepCancelled
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
2018-08-27 00:40:04 +08:00
*
* @return \Illuminate\Http\JsonResponse
*/
public function acars_logs($id, LogRequest $request)
{
2018-08-27 00:40:04 +08:00
// Check if the status is cancelled...
$pirep = Pirep::find($id);
$this->checkCancelled($pirep);
Log::debug('Posting ACARS log, PIREP: '.$id, $request->post());
$count = 0;
$logs = $request->post('logs');
foreach ($logs as $log) {
$log['pirep_id'] = $id;
$log['type'] = AcarsType::LOG;
2020-02-23 05:03:01 +08:00
if (isset($log['sim_time'])) {
2018-05-11 04:28:42 +08:00
$log['sim_time'] = Carbon::createFromTimeString($log['sim_time']);
}
2020-02-23 05:03:01 +08:00
if (isset($log['created_at'])) {
2018-05-11 04:28:42 +08:00
$log['created_at'] = Carbon::createFromTimeString($log['created_at']);
}
try {
2020-02-23 05:03:01 +08:00
if (isset($log['id'])) {
Acars::updateOrInsert(
['id' => $log['id']],
$log
);
} else {
$acars = Acars::create($log);
$acars->save();
}
$count++;
} catch (QueryException $ex) {
Log::info('Error on adding ACARS position: '.$ex->getMessage());
}
}
return $this->message($count.' logs added', $count);
}
/**
* Post ACARS LOG update for a PIREP. These updates won't show up on the map
* But rather in a log file.
2018-08-27 00:40:04 +08:00
*
* @param $id
* @param EventRequest $request
2018-08-27 00:40:04 +08:00
*
* @throws \App\Exceptions\PirepCancelled
* @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException
2018-08-27 00:40:04 +08:00
*
* @return \Illuminate\Http\JsonResponse
*/
public function acars_events($id, EventRequest $request)
{
2018-08-27 00:40:04 +08:00
// Check if the status is cancelled...
$pirep = Pirep::find($id);
$this->checkCancelled($pirep);
Log::debug('Posting ACARS event, PIREP: '.$id, $request->post());
$count = 0;
$logs = $request->post('events');
foreach ($logs as $log) {
$log['pirep_id'] = $id;
$log['type'] = AcarsType::LOG;
$log['log'] = $log['event'];
2020-02-23 05:03:01 +08:00
if (isset($log['sim_time'])) {
2018-05-11 04:28:42 +08:00
$log['sim_time'] = Carbon::createFromTimeString($log['sim_time']);
}
2020-02-23 05:03:01 +08:00
if (isset($log['created_at'])) {
2018-05-11 04:28:42 +08:00
$log['created_at'] = Carbon::createFromTimeString($log['created_at']);
}
try {
2020-02-23 05:03:01 +08:00
if (isset($log['id'])) {
Acars::updateOrInsert(
['id' => $log['id']],
$log
);
} else {
$acars = Acars::create($log);
$acars->save();
}
$count++;
} catch (QueryException $ex) {
Log::info('Error on adding ACARS position: '.$ex->getMessage());
}
}
return $this->message($count.' logs added', $count);
}
}