From 9ed07da9c31b68bf94652bcadb8a265a4eb65ede Mon Sep 17 00:00:00 2001 From: Nabeel S Date: Sat, 22 Feb 2020 16:03:01 -0500 Subject: [PATCH] Upsert on ACARS positions #572 (#573) --- app/Http/Controllers/Api/AcarsController.php | 48 +++++++++++++++----- app/Http/Controllers/Api/PirepController.php | 8 +++- app/Models/Traits/HashIdTrait.php | 7 +-- app/Support/Utils.php | 20 ++++++++ config/themes.php | 2 +- tests/AcarsTest.php | 34 ++++++++++---- 6 files changed, 91 insertions(+), 28 deletions(-) diff --git a/app/Http/Controllers/Api/AcarsController.php b/app/Http/Controllers/Api/AcarsController.php index dba30e43..048f607e 100644 --- a/app/Http/Controllers/Api/AcarsController.php +++ b/app/Http/Controllers/Api/AcarsController.php @@ -154,7 +154,7 @@ class AcarsController extends Controller $position['pirep_id'] = $id; $position['type'] = AcarsType::FLIGHT_PATH; - if (array_key_exists('sim_time', $position)) { + if (isset($position['sim_time'])) { if ($position['sim_time'] instanceof \DateTime) { $position['sim_time'] = Carbon::instance($position['sim_time']); } else { @@ -162,7 +162,7 @@ class AcarsController extends Controller } } - if (array_key_exists('created_at', $position)) { + if (isset($position['created_at'])) { if ($position['created_at'] instanceof \DateTime) { $position['created_at'] = Carbon::instance($position['created_at']); } else { @@ -171,8 +171,16 @@ class AcarsController extends Controller } try { - $update = Acars::create($position); - $update->save(); + 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()); @@ -215,17 +223,25 @@ class AcarsController extends Controller $log['pirep_id'] = $id; $log['type'] = AcarsType::LOG; - if (array_key_exists('sim_time', $log)) { + if (isset($log['sim_time'])) { $log['sim_time'] = Carbon::createFromTimeString($log['sim_time']); } - if (array_key_exists('created_at', $log)) { + if (isset($log['created_at'])) { $log['created_at'] = Carbon::createFromTimeString($log['created_at']); } try { - $acars = Acars::create($log); - $acars->save(); + 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()); @@ -262,17 +278,25 @@ class AcarsController extends Controller $log['type'] = AcarsType::LOG; $log['log'] = $log['event']; - if (array_key_exists('sim_time', $log)) { + if (isset($log['sim_time'])) { $log['sim_time'] = Carbon::createFromTimeString($log['sim_time']); } - if (array_key_exists('created_at', $log)) { + if (isset($log['created_at'])) { $log['created_at'] = Carbon::createFromTimeString($log['created_at']); } try { - $acars = Acars::create($log); - $acars->save(); + 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()); diff --git a/app/Http/Controllers/Api/PirepController.php b/app/Http/Controllers/Api/PirepController.php index f0b12916..0b9d2c11 100644 --- a/app/Http/Controllers/Api/PirepController.php +++ b/app/Http/Controllers/Api/PirepController.php @@ -542,8 +542,12 @@ class PirepController extends Controller $position['pirep_id'] = $id; $position['type'] = AcarsType::ROUTE; - $acars = Acars::create($position); - $acars->save(); + if (isset($position['id'])) { + Acars::updateOrInsert(['id' => $position['id']], $position); + } else { + $acars = Acars::create($position); + $acars->save(); + } $count++; } diff --git a/app/Models/Traits/HashIdTrait.php b/app/Models/Traits/HashIdTrait.php index 71ab4848..d24d8ea6 100644 --- a/app/Models/Traits/HashIdTrait.php +++ b/app/Models/Traits/HashIdTrait.php @@ -2,8 +2,7 @@ namespace App\Models\Traits; -use App\Contracts\Model; -use Hashids\Hashids; +use App\Support\Utils; trait HashIdTrait { @@ -14,9 +13,7 @@ trait HashIdTrait */ final protected static function createNewHashId(): string { - $hashids = new Hashids('', Model::ID_MAX_LENGTH); - $mt = str_replace('.', '', microtime(true)); - return $hashids->encode($mt); + return Utils::generateNewId(); } /** diff --git a/app/Support/Utils.php b/app/Support/Utils.php index f21b98d3..fc11a1d5 100644 --- a/app/Support/Utils.php +++ b/app/Support/Utils.php @@ -2,6 +2,8 @@ namespace App\Support; +use App\Contracts\Model; +use Hashids\Hashids; use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Support\Str; use Nwidart\Modules\Facades\Module; @@ -11,6 +13,24 @@ use Nwidart\Modules\Facades\Module; */ class Utils { + /** + * Generate a new ID with a given length + * + * @param int [$length] + * + * @return string + */ + public static function generateNewId(int $length = null) + { + if (!$length) { + $length = Model::ID_MAX_LENGTH; + } + + $hashids = new Hashids('', $length); + $mt = str_replace('.', '', microtime(true)); + return $hashids->encode($mt); + } + /** * Returns a 40 character API key that a user can use * diff --git a/config/themes.php b/config/themes.php index bb1ad37a..8a639499 100644 --- a/config/themes.php +++ b/config/themes.php @@ -4,7 +4,7 @@ return [ 'themes_path' => resource_path('views/layouts'), // eg: base_path('resources/themes') 'asset_not_found' => 'LOG_ERROR', 'default' => 'default', - 'cache' => true, + 'cache' => false, /* |-------------------------------------------------------------------------- diff --git a/tests/AcarsTest.php b/tests/AcarsTest.php index e9b1ac80..9eec1ab4 100644 --- a/tests/AcarsTest.php +++ b/tests/AcarsTest.php @@ -4,6 +4,7 @@ use App\Models\Enums\PirepState; use App\Models\Enums\PirepStatus; use App\Models\PirepFare; use App\Repositories\SettingRepository; +use App\Support\Utils; /** * Test API calls and authentication, etc @@ -660,13 +661,22 @@ class AcarsTest extends TestCase $uri = '/api/pireps/'.$pirep_id.'/acars/position'; // Post an ACARS update - $acars_count = \random_int(2, 10); - $acars = factory(App\Models\Acars::class, $acars_count)->make(['id' => ''])->toArray(); + $acars_count = \random_int(5, 10); + $acars = factory(App\Models\Acars::class, $acars_count)->make(['id' => '']) + ->map(function ($point) { + $point['id'] = Utils::generateNewId(); + return $point; + }) + ->toArray(); $update = ['positions' => $acars]; $response = $this->post($uri, $update); $response->assertStatus(200)->assertJson(['count' => $acars_count]); + // Try posting again, should be ignored/not throw any sql errors + $response = $this->post($uri, $update); + $response->assertStatus(200)->assertJson(['count' => $acars_count]); + $response = $this->get($uri); $response->assertStatus(200)->assertJsonCount($acars_count, 'data'); } @@ -700,11 +710,9 @@ class AcarsTest extends TestCase $dt = date('c'); $uri = '/api/pireps/'.$pirep_id.'/acars/position'; - $acars = factory(App\Models\Acars::class)->make( - [ - 'sim_time' => $dt, - ] - )->toArray(); + $acars = factory(App\Models\Acars::class)->make([ + 'sim_time' => $dt, + ])->toArray(); $update = ['positions' => [$acars]]; $response = $this->post($uri, $update); @@ -729,7 +737,13 @@ class AcarsTest extends TestCase $response->assertStatus(400); $post_route = [ - ['order' => 1, 'name' => 'NAVPOINT', 'lat' => 'notanumber', 'lon' => 34.11], + [ + 'id' => 'NAVPOINT', + 'order' => 1, + 'name' => 'NAVPOINT', + 'lat' => 'notanumber', + 'lon' => 34.11, + ], ]; $uri = '/api/pireps/'.$pirep_id.'/route'; @@ -803,6 +817,10 @@ class AcarsTest extends TestCase $response = $this->post($uri, ['route' => $post_route]); $response->assertStatus(200)->assertJson(['count' => $route_count]); + // Try double post to ignore SQL update + $response = $this->post($uri, ['route' => $post_route]); + $response->assertStatus(200)->assertJson(['count' => $route_count]); + /** * Get */