fix: idempotent migrations with hasTable guards, fix install retry

This commit is contained in:
2026-06-11 20:42:58 -05:00
parent a5e3915be5
commit 4fe9daf55c
4 changed files with 108 additions and 83 deletions

View File

@@ -15,6 +15,7 @@ return new class extends Migration
{ {
public function up(): void public function up(): void
{ {
if (!Schema::hasTable('addon_network_metrics')) {
Schema::create('addon_network_metrics', function (Blueprint $table) { Schema::create('addon_network_metrics', function (Blueprint $table) {
$table->bigIncrements('id'); $table->bigIncrements('id');
$table->unsignedInteger('server_id')->index(); $table->unsignedInteger('server_id')->index();
@@ -35,7 +36,9 @@ return new class extends Migration
->references('id')->on('nodes') ->references('id')->on('nodes')
->onDelete('cascade'); ->onDelete('cascade');
}); });
} // end hasTable check
if (!Schema::hasTable('addon_network_port_metrics')) {
Schema::create('addon_network_port_metrics', function (Blueprint $table) { Schema::create('addon_network_port_metrics', function (Blueprint $table) {
$table->bigIncrements('id'); $table->bigIncrements('id');
$table->unsignedInteger('server_id')->index(); $table->unsignedInteger('server_id')->index();
@@ -53,7 +56,9 @@ return new class extends Migration
->references('id')->on('servers') ->references('id')->on('servers')
->onDelete('cascade'); ->onDelete('cascade');
}); });
} // end hasTable check
if (!Schema::hasTable('addon_network_flows')) {
Schema::create('addon_network_flows', function (Blueprint $table) { Schema::create('addon_network_flows', function (Blueprint $table) {
$table->bigIncrements('id'); $table->bigIncrements('id');
$table->unsignedInteger('src_server_id')->nullable()->index(); $table->unsignedInteger('src_server_id')->nullable()->index();
@@ -75,6 +80,7 @@ return new class extends Migration
->references('id')->on('servers') ->references('id')->on('servers')
->onDelete('set null'); ->onDelete('set null');
}); });
} // end hasTable check
} }
public function down(): void public function down(): void

View File

@@ -15,11 +15,12 @@ return new class extends Migration
{ {
public function up(): void public function up(): void
{ {
if (!Schema::hasTable('addon_roles')) {
Schema::create('addon_roles', function (Blueprint $table) { Schema::create('addon_roles', function (Blueprint $table) {
$table->increments('id'); $table->increments('id');
$table->string('name', 100); $table->string('name', 100);
$table->text('description')->nullable(); $table->text('description')->nullable();
$table->string('color', 7)->default('#6366f1'); // indigo $table->string('color', 7)->default('#6366f1');
$table->unsignedInteger('priority')->default(0); $table->unsignedInteger('priority')->default(0);
$table->boolean('is_default')->default(false); $table->boolean('is_default')->default(false);
$table->unsignedInteger('created_by')->nullable(); $table->unsignedInteger('created_by')->nullable();
@@ -29,7 +30,9 @@ return new class extends Migration
->references('id')->on('users') ->references('id')->on('users')
->onDelete('set null'); ->onDelete('set null');
}); });
}
if (!Schema::hasTable('addon_role_permissions')) {
Schema::create('addon_role_permissions', function (Blueprint $table) { Schema::create('addon_role_permissions', function (Blueprint $table) {
$table->bigIncrements('id'); $table->bigIncrements('id');
$table->unsignedInteger('role_id'); $table->unsignedInteger('role_id');
@@ -44,7 +47,9 @@ return new class extends Migration
->references('id')->on('addon_roles') ->references('id')->on('addon_roles')
->onDelete('cascade'); ->onDelete('cascade');
}); });
}
if (!Schema::hasTable('addon_server_role_assignments')) {
Schema::create('addon_server_role_assignments', function (Blueprint $table) { Schema::create('addon_server_role_assignments', function (Blueprint $table) {
$table->bigIncrements('id'); $table->bigIncrements('id');
$table->unsignedInteger('server_id'); $table->unsignedInteger('server_id');
@@ -69,7 +74,9 @@ return new class extends Migration
->references('id')->on('users') ->references('id')->on('users')
->onDelete('set null'); ->onDelete('set null');
}); });
}
if (!Schema::hasTable('addon_server_permission_overrides')) {
Schema::create('addon_server_permission_overrides', function (Blueprint $table) { Schema::create('addon_server_permission_overrides', function (Blueprint $table) {
$table->bigIncrements('id'); $table->bigIncrements('id');
$table->unsignedInteger('server_id'); $table->unsignedInteger('server_id');
@@ -89,7 +96,9 @@ return new class extends Migration
->references('id')->on('users') ->references('id')->on('users')
->onDelete('cascade'); ->onDelete('cascade');
}); });
}
if (!Schema::hasTable('addon_role_audit_log')) {
Schema::create('addon_role_audit_log', function (Blueprint $table) { Schema::create('addon_role_audit_log', function (Blueprint $table) {
$table->bigIncrements('id'); $table->bigIncrements('id');
$table->unsignedInteger('actor_id')->nullable(); $table->unsignedInteger('actor_id')->nullable();
@@ -108,6 +117,7 @@ return new class extends Migration
->onDelete('set null'); ->onDelete('set null');
}); });
} }
}
public function down(): void public function down(): void
{ {
@@ -118,3 +128,4 @@ return new class extends Migration
Schema::dropIfExists('addon_roles'); Schema::dropIfExists('addon_roles');
} }
}; };

View File

@@ -15,6 +15,7 @@ return new class extends Migration
{ {
public function up(): void public function up(): void
{ {
if (!Schema::hasTable('addon_file_revisions')) {
Schema::create('addon_file_revisions', function (Blueprint $table) { Schema::create('addon_file_revisions', function (Blueprint $table) {
$table->bigIncrements('id'); $table->bigIncrements('id');
$table->unsignedInteger('server_id'); $table->unsignedInteger('server_id');
@@ -41,7 +42,9 @@ return new class extends Migration
->references('id')->on('users') ->references('id')->on('users')
->onDelete('set null'); ->onDelete('set null');
}); });
} // end hasTable addon_file_revisions
if (!Schema::hasTable('addon_file_revision_storage_usage')) {
Schema::create('addon_file_revision_storage_usage', function (Blueprint $table) { Schema::create('addon_file_revision_storage_usage', function (Blueprint $table) {
$table->unsignedInteger('server_id')->primary(); $table->unsignedInteger('server_id')->primary();
$table->unsignedBigInteger('total_bytes')->default(0); $table->unsignedBigInteger('total_bytes')->default(0);
@@ -51,6 +54,7 @@ return new class extends Migration
->references('id')->on('servers') ->references('id')->on('servers')
->onDelete('cascade'); ->onDelete('cascade');
}); });
} // end hasTable addon_file_revision_storage_usage
} }
public function down(): void public function down(): void

View File

@@ -15,6 +15,7 @@ return new class extends Migration
{ {
public function up(): void public function up(): void
{ {
if (!Schema::hasTable('addon_command_definitions')) {
Schema::create('addon_command_definitions', function (Blueprint $table) { Schema::create('addon_command_definitions', function (Blueprint $table) {
$table->increments('id'); $table->increments('id');
$table->unsignedInteger('server_id')->nullable()->index(); $table->unsignedInteger('server_id')->nullable()->index();
@@ -33,7 +34,9 @@ return new class extends Migration
->references('id')->on('nodes') ->references('id')->on('nodes')
->onDelete('cascade'); ->onDelete('cascade');
}); });
} // end hasTable addon_command_definitions
if (!Schema::hasTable('addon_console_player_cache')) {
Schema::create('addon_console_player_cache', function (Blueprint $table) { Schema::create('addon_console_player_cache', function (Blueprint $table) {
$table->unsignedInteger('server_id'); $table->unsignedInteger('server_id');
$table->string('player_name', 64); $table->string('player_name', 64);
@@ -46,6 +49,7 @@ return new class extends Migration
->references('id')->on('servers') ->references('id')->on('servers')
->onDelete('cascade'); ->onDelete('cascade');
}); });
} // end hasTable addon_console_player_cache
} }
public function down(): void public function down(): void