From a0a3732c6f88fef8b4ddb897529d80e9173d02ea Mon Sep 17 00:00:00 2001 From: Liesel Downes Date: Wed, 23 Oct 2024 21:45:59 +1030 Subject: [PATCH] Relevant code changes for DB Dl authorities --- .../Controllers/ClxMessagesController.php | 23 ++++++------ .../Livewire/Controllers/CreateManualClx.php | 13 ++++--- app/Models/ClxMessage.php | 24 ++++++++++--- app/Models/CpdlcMessage.php | 20 +++++++---- app/Models/DatalinkAuthority.php | 24 +++++++++++++ app/Models/RclMessage.php | 4 +++ app/Services/CpdlcService.php | 5 +-- app/Services/VatsimDataService.php | 9 +++-- ...ment_database_dl_authorities_on_models.php | 31 ++++++++++++++++ ...16_implement_dl_authority_foreign_keys.php | 35 +++++++++++++++++++ .../clx/rcl-messages/show.blade.php | 2 +- 11 files changed, 156 insertions(+), 34 deletions(-) create mode 100644 database/migrations/2024_10_23_104818_implement_database_dl_authorities_on_models.php create mode 100644 database/migrations/2024_10_23_105816_implement_dl_authority_foreign_keys.php diff --git a/app/Http/Controllers/ClxMessagesController.php b/app/Http/Controllers/ClxMessagesController.php index 840bea7..8dfe9e1 100644 --- a/app/Http/Controllers/ClxMessagesController.php +++ b/app/Http/Controllers/ClxMessagesController.php @@ -8,6 +8,7 @@ use App\Events\ClxIssuedEvent; use App\Http\Requests\ClxMessageRequest; use App\Models\ClxMessage; +use App\Models\DatalinkAuthority; use App\Models\RclMessage; use App\Models\Track; use App\Services\CpdlcService; @@ -99,9 +100,9 @@ public function showRclMessage(RclMessage $rclMessage) return view('controllers.clx.rcl-messages.show', [ 'message' => $rclMessage, - 'dlAuthorities' => DatalinkAuthorities::cases(), + 'dlAuthorities' => DatalinkAuthority::whereSystem(false)->get(), 'tracks' => $rclMessage->is_concorde ? Track::concorde()->get() : Track::active()->get(), - 'activeDlAuthority' => $this->dataService->getActiveControllerAuthority(Auth::user()) ?? DatalinkAuthorities::NAT, + 'activeDlAuthority' => $this->dataService->getActiveControllerAuthority(Auth::user()) ?? DatalinkAuthority::whereId('NAT')->first(), '_pageTitle' => $rclMessage->callsign, ]); } @@ -160,7 +161,7 @@ public function transmit(RclMessage $rclMessage, ClxMessageRequest $request) 'entry_time_restriction' => $entryRequirement ?? null, 'raw_entry_time_restriction' => $request->get('entry_time_requirement'), 'free_text' => $isReclearance ? '** RECLEARANCE '.now()->format('Hi').' ** '.$request->get('free_text') : $request->get('free_text'), - 'datalink_authority' => DatalinkAuthorities::from($request->get('datalink_authority')), + 'datalink_authority_id' => DatalinkAuthority::whereId($request->get('datalink_authority'))->first()->id, 'is_concorde' => $rclMessage->is_concorde, ]); @@ -179,7 +180,7 @@ public function transmit(RclMessage $rclMessage, ClxMessageRequest $request) * Create datalink messages */ $array = [ - 'CLX '.now()->format('Hi dmy').' '.$clxMessage->datalink_authority->name.' CLRNCE '.$clxMessage->id, + 'CLX '.now()->format('Hi dmy').' '.$clxMessage->datalinkAuthority->id.' CLRNCE '.$clxMessage->id, $rclMessage->callsign.' CLRD TO '.$rclMessage->destination.' VIA '.$clxMessage->entry_fix, $clxMessage->track ? 'NAT '.$clxMessage->track->identifier : 'RANDOM ROUTE', $clxMessage->track ? $clxMessage->track->last_routeing : $clxMessage->random_routeing, @@ -213,9 +214,9 @@ public function transmit(RclMessage $rclMessage, ClxMessageRequest $request) $clxMessage->datalink_message = $array; $msg = ''; if ($clxMessage->track) { - $msg = "{$clxMessage->datalink_authority->name} clears {$rclMessage->callsign} to {$rclMessage->destination} via {$clxMessage->entry_fix}, track {$clxMessage->track->identifier}. From {$clxMessage->entry_fix} maintain Flight Level {$clxMessage->flight_level}, Mach {$clxMessage->mach}."; + $msg = "{$clxMessage->datalinkAuthority->name} clears {$rclMessage->callsign} to {$rclMessage->destination} via {$clxMessage->entry_fix}, track {$clxMessage->track->identifier}. From {$clxMessage->entry_fix} maintain Flight Level {$clxMessage->flight_level}, Mach {$clxMessage->mach}."; } else { - $msg = "{$clxMessage->datalink_authority->name} clears {$rclMessage->callsign} to {$rclMessage->destination} via {$clxMessage->entry_fix}, random routeing {$clxMessage->random_routeing}. From {$clxMessage->entry_fix} maintain Flight Level {$clxMessage->flight_level}, Mach {$clxMessage->mach}."; + $msg = "{$clxMessage->datalinkAuthority->name} clears {$rclMessage->callsign} to {$rclMessage->destination} via {$clxMessage->entry_fix}, random routeing {$clxMessage->random_routeing}. From {$clxMessage->entry_fix} maintain Flight Level {$clxMessage->flight_level}, Mach {$clxMessage->mach}."; } // Only show crossing restriction if entry time =/= the restriction due to the bodge if ($clxMessage->entry_time_restriction && ($clxMessage->raw_entry_time_restriction != $rclMessage->entry_time)) { @@ -259,7 +260,7 @@ public function transmit(RclMessage $rclMessage, ClxMessageRequest $request) ->causedBy($clxMessage->vatsimAccount) ->performedOn($rclMessage) ->withProperties(['datalink' => $clxMessage->data_link_message]) - ->log('CLX Message Transmitted By '.$clxMessage->datalink_authority->name); + ->log('CLX Message Transmitted By '.$clxMessage->datalinkAuthority->id); flashAlert(type: 'success', title: null, message: 'Clearance transmitted.', toast: true, timer: true); @@ -280,7 +281,7 @@ public function deleteRclMessage(Request $request, RclMessage $rclMessage) public function revertToVoice(Request $request, RclMessage $rclMessage) { - $datalinkAuthority = $this->dataService->getActiveControllerAuthority ?? DatalinkAuthorities::NAT; + $datalinkAuthority = $this->dataService->getActiveControllerAuthority ?? DatalinkAuthority::whereId('NAT')->first(); $this->cpdlcService->sendMessage( author: $datalinkAuthority, recipient: $rclMessage->callsign, @@ -296,7 +297,7 @@ public function revertToVoice(Request $request, RclMessage $rclMessage) public function moveToProcessed(Request $request, RclMessage $rclMessage) { - $datalinkAuthority = $this->dataService->getActiveControllerAuthority ?? DatalinkAuthorities::NAT; + $datalinkAuthority = $this->dataService->getActiveControllerAuthority ?? DatalinkAuthority::whereId('NAT')->first(); $this->cpdlcService->sendMessage( author: $datalinkAuthority, recipient: $rclMessage->callsign, @@ -349,7 +350,7 @@ public function moveToProcessed(Request $request, RclMessage $rclMessage) ->causedBy($clxMessage->vatsimAccount) ->performedOn($rclMessage) ->withProperties(['datalink' => $clxMessage->data_link_message]) - ->log('CLX Message Transmitted By '.$clxMessage->datalink_authority->name); + ->log('CLX Message Transmitted By '.$clxMessage->datalinkAuthority->name); flashAlert(type: 'success', title: null, message: 'Clearance moved.', toast: true, timer: true); @@ -361,7 +362,7 @@ public function create() return view('controllers.clx.rcl-messages.create', [ 'dlAuthorities' => DatalinkAuthorities::cases(), 'tracks' => Track::where('active', true)->orWhere('concorde', true)->get(), - 'activeDlAuthority' => $this->dataService->getActiveControllerAuthority(Auth::user()) ?? DatalinkAuthorities::NAT, + 'activeDlAuthority' => $this->dataService->getActiveControllerAuthority(Auth::user()) ?? DatalinkAuthority::whereId('NAT')->first(), '_pageTitle' => 'Create Manual Clearance', ]); } diff --git a/app/Http/Livewire/Controllers/CreateManualClx.php b/app/Http/Livewire/Controllers/CreateManualClx.php index c68e342..bac2561 100644 --- a/app/Http/Livewire/Controllers/CreateManualClx.php +++ b/app/Http/Livewire/Controllers/CreateManualClx.php @@ -7,6 +7,7 @@ use App\Enums\RclResponsesEnum; use App\Events\ClxIssuedEvent; use App\Models\ClxMessage; +use App\Models\DatalinkAuthority; use App\Models\RclMessage; use App\Models\Track; use App\Models\VatsimAccount; @@ -36,6 +37,8 @@ class CreateManualClx extends Component public function mount() { + $dataService = new VatsimDataService(); + $this->activeDlAuthority = $dataService->getActiveControllerAuthority(Auth::user()) ?? DatalinkAuthority::whereId('NAT')->first(); $this->tmi = current_tmi(); } public function render() @@ -164,7 +167,7 @@ public function submit() 'entry_time_restriction' => null, //TODO implement 'raw_entry_time_restriction' => $rclMessage->entry_time, 'free_text' => '** RCL/CLX MANUALLY ENTERED BY ATC **', - 'datalink_authority' => $this->activeDlAuthority, + 'datalink_authority_id' => $this->activeDlAuthority->id, 'is_concorde' => $rclMessage->is_concorde, ]); if ($rclMessage->trac) { @@ -176,7 +179,7 @@ public function submit() } $array = [ - 'CLX '.now()->format('Hi dmy').' '.$clxMessage->datalink_authority->name.' CLRNCE '.$clxMessage->id, + 'CLX '.now()->format('Hi dmy').' '.$clxMessage->datalinkAuthority->id.' CLRNCE '.$clxMessage->id, $rclMessage->callsign.' CLRD TO '.$rclMessage->destination.' VIA '.$clxMessage->entry_fix, $clxMessage->track ? 'NAT '.$clxMessage->track->identifier : 'RANDOM ROUTE', $clxMessage->track ? $clxMessage->track->last_routeing : $clxMessage->random_routeing, @@ -210,9 +213,9 @@ public function submit() $clxMessage->datalink_message = $array; $msg = ''; if ($clxMessage->track) { - $msg = "{$clxMessage->datalink_authority->name} clears {$rclMessage->callsign} to {$rclMessage->destination} via {$clxMessage->entry_fix}, track {$clxMessage->track->identifier}. From {$clxMessage->entry_fix} maintain Flight Level {$clxMessage->flight_level}, Mach {$clxMessage->mach}."; + $msg = "{$clxMessage->datalinkAuthority->name} clears {$rclMessage->callsign} to {$rclMessage->destination} via {$clxMessage->entry_fix}, track {$clxMessage->track->identifier}. From {$clxMessage->entry_fix} maintain Flight Level {$clxMessage->flight_level}, Mach {$clxMessage->mach}."; } else { - $msg = "{$clxMessage->datalink_authority->name} clears {$rclMessage->callsign} to {$rclMessage->destination} via {$clxMessage->entry_fix}, random routeing {$clxMessage->random_routeing}. From {$clxMessage->entry_fix} maintain Flight Level {$clxMessage->flight_level}, Mach {$clxMessage->mach}."; + $msg = "{$clxMessage->datalinkAuthority->name} clears {$rclMessage->callsign} to {$rclMessage->destination} via {$clxMessage->entry_fix}, random routeing {$clxMessage->random_routeing}. From {$clxMessage->entry_fix} maintain Flight Level {$clxMessage->flight_level}, Mach {$clxMessage->mach}."; } // Only show crossing restriction if entry time =/= the restriction due to the bodge if ($clxMessage->entry_time_restriction && ($clxMessage->raw_entry_time_restriction != $rclMessage->entry_time)) { @@ -256,7 +259,7 @@ public function submit() ->causedBy($clxMessage->vatsimAccount) ->performedOn($rclMessage) ->withProperties(['datalink' => $clxMessage->data_link_message]) - ->log('CLX Message Transmitted By '.$clxMessage->datalink_authority->name); + ->log('CLX Message Transmitted By '.$clxMessage->datalinkAuthority->name); flashAlert(type: 'success', title: null, message: 'Clearance transmitted.', toast: true, timer: true); diff --git a/app/Models/ClxMessage.php b/app/Models/ClxMessage.php index 3f612c6..69a93a8 100644 --- a/app/Models/ClxMessage.php +++ b/app/Models/ClxMessage.php @@ -69,6 +69,13 @@ * @property string|null $cancellation_reason * @method static Builder|ClxMessage whereCancellationReason($value) * @method static Builder|ClxMessage whereCancelled($value) + * @property string $datalink_authority_id + * @property string|null $entry_time_restriction_interval_callsign + * @property int|null $entry_time_restriction_interval_minutes + * @property-read \App\Models\DatalinkAuthority $datalinkAuthority + * @method static Builder|ClxMessage whereDatalinkAuthorityId($value) + * @method static Builder|ClxMessage whereEntryTimeRestrictionIntervalCallsign($value) + * @method static Builder|ClxMessage whereEntryTimeRestrictionIntervalMinutes($value) * @mixin \Eloquent */ class ClxMessage extends Model @@ -92,7 +99,7 @@ public function prunable(): Builder * @var array */ protected $fillable = [ - 'vatsim_account_id', 'rcl_message_id', 'flight_level', 'mach', 'track_id', 'random_routeing', 'entry_fix', 'entry_time_restriction', 'free_text', 'datalink_authority', 'simple_datalink_message', 'datalink_message', 'upper_flight_level', 'raw_entry_time_restriction', 'overwritten_by_clx_message_id', 'overwritten', 'is_concorde', 'cancelled', 'cancellation_reason' + 'vatsim_account_id', 'rcl_message_id', 'flight_level', 'mach', 'track_id', 'random_routeing', 'entry_fix', 'entry_time_restriction', 'free_text', 'datalink_authority_id', 'simple_datalink_message', 'datalink_message', 'upper_flight_level', 'raw_entry_time_restriction', 'overwritten_by_clx_message_id', 'overwritten', 'is_concorde', 'cancelled', 'cancellation_reason' ]; /** @@ -111,7 +118,6 @@ public function getActivitylogOptions(): LogOptions * @var string[] */ protected $casts = [ - 'datalink_authority' => DatalinkAuthorities::class, 'datalink_message' => 'array', 'cancellation_reason' => ClxCancellationReasons::class, ]; @@ -126,6 +132,16 @@ public function rclMessage(): BelongsTo return $this->belongsTo(RclMessage::class); } + /** + * Returns the authority that issued the message. + * + * @return BelongsTo + */ + public function datalinkAuthority(): BelongsTo + { + return $this->belongsTo(DatalinkAuthority::class); + } + /** * Returns the track the CLX was for. * @@ -184,8 +200,8 @@ public function toMessageHistoryFormat(): array 'simple_datalink_message' => $this->simple_datalink_message, 'datalink_message' => $this->datalink_message, 'datalink_authority' => [ - 'id' => $this->datalink_authority->name, - 'description' => $this->datalink_authority->description(), + 'id' => $this->datalinkAuthority->id, + 'description' => $this->datalinkAuthority->name, ], 'cancelled' => $this->cancelled, 'cancellation_reason' => $this->cancellation_reason?->text(), diff --git a/app/Models/CpdlcMessage.php b/app/Models/CpdlcMessage.php index 9f2d922..32b5ef9 100644 --- a/app/Models/CpdlcMessage.php +++ b/app/Models/CpdlcMessage.php @@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Prunable; +use Illuminate\Database\Eloquent\Relations\BelongsTo; /** * App\Models\CpdlcMessage @@ -33,6 +34,9 @@ * @property string|null $caption * @method static Builder|CpdlcMessage whereCaption($value) * @method static Builder|CpdlcMessage whereMessage($value) + * @property string $datalink_authority_id + * @property-read \App\Models\DatalinkAuthority $datalinkAuthority + * @method static Builder|CpdlcMessage whereDatalinkAuthorityId($value) * @mixin \Eloquent */ class CpdlcMessage extends Model @@ -50,25 +54,29 @@ public function prunable(): Builder } protected $fillable = [ - 'pilot_id', 'pilot_callsign', 'datalink_authority', 'message', 'caption', + 'pilot_id', 'pilot_callsign', 'datalink_authority_id', 'message', 'caption', ]; - protected $casts = [ - 'datalink_authority' => DatalinkAuthorities::class, - ]; +// protected $casts = [ +// ]; public function pilot() { return $this->belongsTo(VatsimAccount::class, 'pilot_id'); } + public function datalinkAuthority(): BelongsTo + { + return $this->belongsTo(DatalinkAuthority::class); + } + public function toMessageHistoryFormat(): array { return [ 'id' => $this->id, 'datalink_authority' => [ - 'id' => $this->datalink_authority->name, - 'description' => $this->datalink_authority->description(), + 'id' => $this->datalinkAuthority->id, + 'description' => $this->datalinkAuthority->name, ], 'message' => $this->message, 'caption' => $this->caption, diff --git a/app/Models/DatalinkAuthority.php b/app/Models/DatalinkAuthority.php index edb3ee4..e13c8da 100644 --- a/app/Models/DatalinkAuthority.php +++ b/app/Models/DatalinkAuthority.php @@ -4,6 +4,30 @@ use Illuminate\Database\Eloquent\Model; +/** + * App\Models\DatalinkAuthority + * + * @property string $id + * @property string $name + * @property string $prefix + * @property bool $auto_acknowledge_participant + * @property bool $valid_rcl_target + * @property bool $system + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Illuminate\Database\Eloquent\Builder|DatalinkAuthority newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|DatalinkAuthority newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|DatalinkAuthority query() + * @method static \Illuminate\Database\Eloquent\Builder|DatalinkAuthority whereAutoAcknowledgeParticipant($value) + * @method static \Illuminate\Database\Eloquent\Builder|DatalinkAuthority whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|DatalinkAuthority whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|DatalinkAuthority whereName($value) + * @method static \Illuminate\Database\Eloquent\Builder|DatalinkAuthority wherePrefix($value) + * @method static \Illuminate\Database\Eloquent\Builder|DatalinkAuthority whereSystem($value) + * @method static \Illuminate\Database\Eloquent\Builder|DatalinkAuthority whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|DatalinkAuthority whereValidRclTarget($value) + * @mixin \Eloquent + */ class DatalinkAuthority extends Model { protected $fillable = [ diff --git a/app/Models/RclMessage.php b/app/Models/RclMessage.php index 67c5236..0812b94 100644 --- a/app/Models/RclMessage.php +++ b/app/Models/RclMessage.php @@ -99,6 +99,10 @@ * @property string|null $acknowledged_at * @method static Builder|RclMessage whereAcknowledgedAt($value) * @method static Builder|RclMessage whereIsAcknowledged($value) + * @property string $target_datalink_authority + * @method static Builder|RclMessage acknowledged() + * @method static Builder|RclMessage notAcknowledged() + * @method static Builder|RclMessage whereTargetDatalinkAuthority($value) * @mixin \Eloquent */ class RclMessage extends Model diff --git a/app/Services/CpdlcService.php b/app/Services/CpdlcService.php index 49ddb9b..74a8931 100644 --- a/app/Services/CpdlcService.php +++ b/app/Services/CpdlcService.php @@ -4,6 +4,7 @@ use App\Enums\DatalinkAuthorities; use App\Models\CpdlcMessage; +use App\Models\DatalinkAuthority; use App\Models\VatsimAccount; class CpdlcService @@ -15,10 +16,10 @@ class CpdlcService * @param string $message * @return CpdlcMessage */ - public function sendMessage(DatalinkAuthorities $author, string $recipient, VatsimAccount $recipientAccount, string $message, ?string $caption): CpdlcMessage + public function sendMessage(DatalinkAuthority $author, string $recipient, VatsimAccount $recipientAccount, string $message, ?string $caption): CpdlcMessage { return CpdlcMessage::create([ - 'datalink_authority' => $author, + 'datalink_authority_id' => $author->id, 'pilot_id' => $recipientAccount->id, 'pilot_callsign' => $recipient, 'message' => $message, diff --git a/app/Services/VatsimDataService.php b/app/Services/VatsimDataService.php index 9b07167..579c418 100644 --- a/app/Services/VatsimDataService.php +++ b/app/Services/VatsimDataService.php @@ -5,6 +5,7 @@ use App\Enums\AccessLevelEnum; use App\Enums\DatalinkAuthorities; use App\Enums\DomesticAuthorities; +use App\Models\DatalinkAuthority; use App\Models\VatsimAccount; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http; @@ -128,12 +129,10 @@ public function getActiveControllerAuthority(VatsimAccount $vatsimAccount) $callsignPrefix = strtok($this->getActiveControllerData($vatsimAccount)->callsign, '_'); - foreach (DatalinkAuthorities::cases() as $authority) { - if ($callsignPrefix == $authority->value) { - return $authority; - } + $authority = DatalinkAuthority::wherePrefix($callsignPrefix)->first(); + if ($authority) { + return $authority; } - return null; } diff --git a/database/migrations/2024_10_23_104818_implement_database_dl_authorities_on_models.php b/database/migrations/2024_10_23_104818_implement_database_dl_authorities_on_models.php new file mode 100644 index 0000000..a783159 --- /dev/null +++ b/database/migrations/2024_10_23_104818_implement_database_dl_authorities_on_models.php @@ -0,0 +1,31 @@ +renameColumn('datalink_authority', 'datalink_authority_id'); + }); + + Schema::table('cpdlc_messages', function (Blueprint $table) { + $table->renameColumn('datalink_authority', 'datalink_authority_id'); + }); + } + + public function down(): void + { + Schema::table('clx_messages', function (Blueprint $table) { + Schema::table('clx_messages', function (Blueprint $table) { + $table->renameColumn('datalink_authority_id', 'datalink_authority'); + }); + + Schema::table('cpdlc_messages', function (Blueprint $table) { + $table->renameColumn('datalink_authority_id', 'datalink_authority'); + }); + }); + } +}; diff --git a/database/migrations/2024_10_23_105816_implement_dl_authority_foreign_keys.php b/database/migrations/2024_10_23_105816_implement_dl_authority_foreign_keys.php new file mode 100644 index 0000000..9c462f9 --- /dev/null +++ b/database/migrations/2024_10_23_105816_implement_dl_authority_foreign_keys.php @@ -0,0 +1,35 @@ +string('datalink_authority_id')->default(null)->change(); + $table->foreign('datalink_authority_id')->references('id')->on('datalink_authorities'); + }); + + Schema::table('cpdlc_messages', function (Blueprint $table) { + $table->string('datalink_authority_id')->default(null)->change(); + $table->foreign('datalink_authority_id')->references('id')->on('datalink_authorities'); + }); + } + + public function down(): void + { + Schema::table('clx_messages', function (Blueprint $table) { + Schema::table('clx_messages', function (Blueprint $table) { + $table->dropForeign('clx_messages_datalink_authority_id_foreign'); + $table->string('datalink_authority', 4)->default('NATX')->change(); + }); + + Schema::table('cpdlc_messages', function (Blueprint $table) { + $table->dropForeign('cpdlc_messages_datalink_authority_id_foreign'); + $table->string('datalink_authority', 4)->default(null)->change(); + }); + }); + } +}; diff --git a/resources/views/controllers/clx/rcl-messages/show.blade.php b/resources/views/controllers/clx/rcl-messages/show.blade.php index ed63f15..c66f9d0 100644 --- a/resources/views/controllers/clx/rcl-messages/show.blade.php +++ b/resources/views/controllers/clx/rcl-messages/show.blade.php @@ -146,7 +146,7 @@