Files
FlightsAPI/database/migrations/2026_04_20_093204_add_new_tables.php

143 lines
5.7 KiB
PHP

<?php
use App\Models\FlightClass;
use App\Models\FlightReason;
use App\Models\UserFlight;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
// ---------------------------------------------------------------------
// Crew Types
// ---------------------------------------------------------------------
Schema::create('crew_types', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('internal_name')->unique();
});
DB::table('crew_types')->insert([
['name' => 'Unspecified', 'internal_name' => 'unspecified'],
['name' => 'Cabin Crew', 'internal_name' => 'cabin_crew'],
['name' => 'Purser / CSM', 'internal_name' => 'purser'],
['name' => 'Captain', 'internal_name' => 'captain'],
['name' => 'First Officer', 'internal_name' => 'first_officer'],
['name' => 'Second Officer', 'internal_name' => 'second_officer'],
['name' => 'Deadhead', 'internal_name' => 'deadhead'],
['name' => 'Marshal / Security', 'internal_name' => 'marshal'],
]);
// ---------------------------------------------------------------------
// Followees
// ---------------------------------------------------------------------
Schema::create('followees', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->foreignId('followee_id')->constrained('users')->cascadeOnDelete();
$table->timestamps();
$table->unique(['user_id', 'followee_id']);
});
// ---------------------------------------------------------------------
// User Actions
// ---------------------------------------------------------------------
Schema::create('user_actions', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->unsignedBigInteger('user_flight_id');
$table->text('message');
$table->timestamps();
});
// ---------------------------------------------------------------------
// Achievements
// ---------------------------------------------------------------------
Schema::create('achievements', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('internal_name')->unique();
$table->text('description');
$table->string('icon');
});
// ---------------------------------------------------------------------
// User Achievements
// ---------------------------------------------------------------------
Schema::create('user_achievements', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->foreignId('achievement_id')->constrained('achievements')->cascadeOnDelete();
$table->timestamps();
$table->unique(['user_id', 'achievement_id']);
});
DB::statement('ALTER TABLE flight_classes ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY');
DB::statement('ALTER TABLE flight_reasons ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY');
DB::statement("
SELECT setval(
pg_get_serial_sequence('flight_classes', 'id'),
(SELECT MAX(id) FROM flight_classes)
)
");
DB::statement("
SELECT setval(
pg_get_serial_sequence('flight_reasons', 'id'),
(SELECT MAX(id) FROM flight_reasons)
)
");
DB::table('flight_classes')->insert([
['name' => 'General Aviation'],
['name' => 'Crew'],
]);
DB::table('flight_reasons')->insert([
['name' => 'Visiting Friends / Relatives'],
]);
Schema::table('flight_classes', function (Blueprint $table) {
$table->string('internal_name')->nullable();
});
DB::table('flight_classes')->get()->each(function ($row) {
DB::table('flight_classes')
->where('id', $row->id)
->update(['internal_name' => Str::slug($row->name, '_')]);
});
Schema::table('flight_classes', function (Blueprint $table) {
$table->string('internal_name')->nullable(false)->unique()->change();
});
Schema::table('user_flights', function (Blueprint $table) {
$table->foreignId('crew_type_id')->nullable()->constrained('crew_types')->nullOnDelete();
});
$economy = FlightClass::where('internal_name', 'economy')->first();
$unspecified = FlightClass::where('internal_name', 'unspecified')->first();
UserFlight::where('flight_class_id', $unspecified->id)->update(['flight_class_id' => $economy->id]);
FlightReason::where('name', 'Other')->update(['id' => 999]);
}
public function down(): void
{
Schema::dropIfExists('user_achievements');
Schema::dropIfExists('achievements');
Schema::dropIfExists('user_actions');
Schema::dropIfExists('followees');
Schema::dropIfExists('crew_types');
DB::table('flight_classes')->whereIn('name', ['General Aviation', 'Crew'])->delete();
DB::table('flight_reasons')->where('name', 'Crew')->delete();
}
};