From 238d30de912c5b67c70e9678bbc6e1c795182659 Mon Sep 17 00:00:00 2001 From: Twyco Date: Wed, 15 Apr 2026 11:10:46 +0200 Subject: [PATCH 1/2] migrations fix --- ...2026_03_25_004100_create_tickets_table.php | 2 +- ...14_005330_create_ticket_statuses_table.php | 13 -- ...ticket_board_column_with_ticket_status.php | 112 ------------------ ...eate_ticket_statuses__transitionstable.php | 34 ++++++ 4 files changed, 35 insertions(+), 126 deletions(-) delete mode 100644 database/migrations/2026_04_14_005330_replace_ticket_board_column_with_ticket_status.php create mode 100644 database/migrations/2026_04_14_005331_create_ticket_statuses__transitionstable.php diff --git a/database/migrations/2026_03_25_004100_create_tickets_table.php b/database/migrations/2026_03_25_004100_create_tickets_table.php index 332f192..52b1cff 100644 --- a/database/migrations/2026_03_25_004100_create_tickets_table.php +++ b/database/migrations/2026_03_25_004100_create_tickets_table.php @@ -18,7 +18,7 @@ return new class extends Migration $table->foreignId('ticket_priority_id')->constrained()->cascadeOnDelete(); $table->foreignId('assignee_user_id')->nullable()->constrained('users')->nullOnDelete(); $table->foreignId('author_user_id')->nullable()->constrained('users')->nullOnDelete(); - $table->foreignId('board_column_id')->nullable()->constrained()->nullOnDelete(); + $table->foreignId('ticket_status_id')->nullable()->constrained()->nullOnDelete(); $table->unsignedInteger('sequence_number'); $table->string('ticket_key')->unique(); $table->string('title'); diff --git a/database/migrations/2026_04_14_005330_create_ticket_statuses_table.php b/database/migrations/2026_04_14_005330_create_ticket_statuses_table.php index 339f51b..9b0f14b 100644 --- a/database/migrations/2026_04_14_005330_create_ticket_statuses_table.php +++ b/database/migrations/2026_04_14_005330_create_ticket_statuses_table.php @@ -23,18 +23,6 @@ return new class extends Migration $table->index(['project_id', 'board_column_id', 'position']); $table->index(['project_id', 'slug']); }); - - Schema::create('ticket_status_transitions', function (Blueprint $table) { - $table->id(); - $table->foreignId('from_ticket_status_id')->constrained('ticket_statuses')->cascadeOnDelete(); - $table->foreignId('to_ticket_status_id')->constrained('ticket_statuses')->cascadeOnDelete(); - $table->timestamps(); - - $table->unique( - ['from_ticket_status_id', 'to_ticket_status_id'], - 'ticket_status_transitions_unique', - ); - }); } /** @@ -42,7 +30,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('ticket_status_transitions'); Schema::dropIfExists('ticket_statuses'); } }; diff --git a/database/migrations/2026_04_14_005330_replace_ticket_board_column_with_ticket_status.php b/database/migrations/2026_04_14_005330_replace_ticket_board_column_with_ticket_status.php deleted file mode 100644 index 6ea3261..0000000 --- a/database/migrations/2026_04_14_005330_replace_ticket_board_column_with_ticket_status.php +++ /dev/null @@ -1,112 +0,0 @@ -foreignId('ticket_status_id') - ->nullable() - ->after('board_column_id') - ->constrained() - ->nullOnDelete(); - }); - - $this->backfillTicketStatuses(); - - Schema::table('tickets', function (Blueprint $table) { - $table->dropConstrainedForeignId('board_column_id'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('tickets', function (Blueprint $table) { - $table->foreignId('board_column_id') - ->nullable() - ->after('author_user_id') - ->constrained() - ->nullOnDelete(); - }); - - DB::table('tickets') - ->leftJoin('ticket_statuses', 'tickets.ticket_status_id', '=', 'ticket_statuses.id') - ->update([ - 'tickets.board_column_id' => DB::raw('ticket_statuses.board_column_id'), - ]); - - Schema::table('tickets', function (Blueprint $table) { - $table->dropConstrainedForeignId('ticket_status_id'); - }); - } - - private function backfillTicketStatuses(): void - { - DB::table('projects') - ->orderBy('id') - ->get() - ->each(function (object $project): void { - $backlogStatusId = $this->createTicketStatus( - (int) $project->id, - null, - 'Backlog', - 1, - ); - - DB::table('tickets') - ->where('project_id', $project->id) - ->whereNull('board_column_id') - ->update(['ticket_status_id' => $backlogStatusId]); - - DB::table('board_columns') - ->where('project_id', $project->id) - ->orderBy('position') - ->get() - ->each(function (object $boardColumn) use ($project): void { - $ticketStatusId = $this->createTicketStatus( - (int) $project->id, - (int) $boardColumn->id, - (string) $boardColumn->name, - 1, - ); - - DB::table('tickets') - ->where('project_id', $project->id) - ->where('board_column_id', $boardColumn->id) - ->update(['ticket_status_id' => $ticketStatusId]); - }); - - }); - } - - private function createTicketStatus( - int $projectId, - ?int $boardColumnId, - string $name, - int $position, - ): int { - $now = now(); - - return (int) DB::table('ticket_statuses')->insertGetId([ - 'board_column_id' => $boardColumnId, - 'created_at' => $now, - 'name' => $name, - 'position' => $position, - 'project_id' => $projectId, - 'slug' => Str::slug($name), - 'updated_at' => $now, - ]); - } -}; diff --git a/database/migrations/2026_04_14_005331_create_ticket_statuses__transitionstable.php b/database/migrations/2026_04_14_005331_create_ticket_statuses__transitionstable.php new file mode 100644 index 0000000..ca9f972 --- /dev/null +++ b/database/migrations/2026_04_14_005331_create_ticket_statuses__transitionstable.php @@ -0,0 +1,34 @@ +id(); + $table->foreignId('from_ticket_status_id')->constrained('ticket_statuses')->cascadeOnDelete(); + $table->foreignId('to_ticket_status_id')->constrained('ticket_statuses')->cascadeOnDelete(); + $table->timestamps(); + + $table->unique( + ['from_ticket_status_id', 'to_ticket_status_id'], + 'ticket_status_transitions_unique', + ); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('ticket_status_transitions'); + } +}; From 55ef22c65ec03d043980215845056984bb61e338 Mon Sep 17 00:00:00 2001 From: Twyco Date: Wed, 15 Apr 2026 15:35:52 +0200 Subject: [PATCH 2/2] migrations fix --- ...5_004098_create_ticket_statuses_table.php} | 0 ...eate_ticket_statuses_transitionstable.php} | 0 ...2026_03_25_004100_create_tickets_table.php | 3 ++ ..._add_parent_ticket_id_to_tickets_table.php | 32 ------------------ ...5_add_blocking_fields_to_tickets_table.php | 33 ------------------- 5 files changed, 3 insertions(+), 65 deletions(-) rename database/migrations/{2026_04_14_005330_create_ticket_statuses_table.php => 2026_03_25_004098_create_ticket_statuses_table.php} (100%) rename database/migrations/{2026_04_14_005331_create_ticket_statuses__transitionstable.php => 2026_03_25_004099_create_ticket_statuses_transitionstable.php} (100%) delete mode 100644 database/migrations/2026_03_25_072501_add_parent_ticket_id_to_tickets_table.php delete mode 100644 database/migrations/2026_03_25_073715_add_blocking_fields_to_tickets_table.php diff --git a/database/migrations/2026_04_14_005330_create_ticket_statuses_table.php b/database/migrations/2026_03_25_004098_create_ticket_statuses_table.php similarity index 100% rename from database/migrations/2026_04_14_005330_create_ticket_statuses_table.php rename to database/migrations/2026_03_25_004098_create_ticket_statuses_table.php diff --git a/database/migrations/2026_04_14_005331_create_ticket_statuses__transitionstable.php b/database/migrations/2026_03_25_004099_create_ticket_statuses_transitionstable.php similarity index 100% rename from database/migrations/2026_04_14_005331_create_ticket_statuses__transitionstable.php rename to database/migrations/2026_03_25_004099_create_ticket_statuses_transitionstable.php diff --git a/database/migrations/2026_03_25_004100_create_tickets_table.php b/database/migrations/2026_03_25_004100_create_tickets_table.php index 52b1cff..6965278 100644 --- a/database/migrations/2026_03_25_004100_create_tickets_table.php +++ b/database/migrations/2026_03_25_004100_create_tickets_table.php @@ -19,6 +19,9 @@ return new class extends Migration $table->foreignId('assignee_user_id')->nullable()->constrained('users')->nullOnDelete(); $table->foreignId('author_user_id')->nullable()->constrained('users')->nullOnDelete(); $table->foreignId('ticket_status_id')->nullable()->constrained()->nullOnDelete(); + $table->foreignId('parent_ticket_id')->nullable()->constrained('tickets')->nullOnDelete(); + $table->boolean('is_blocked')->default(false); + $table->text('blocked_comment')->nullable(); $table->unsignedInteger('sequence_number'); $table->string('ticket_key')->unique(); $table->string('title'); diff --git a/database/migrations/2026_03_25_072501_add_parent_ticket_id_to_tickets_table.php b/database/migrations/2026_03_25_072501_add_parent_ticket_id_to_tickets_table.php deleted file mode 100644 index f04dfe8..0000000 --- a/database/migrations/2026_03_25_072501_add_parent_ticket_id_to_tickets_table.php +++ /dev/null @@ -1,32 +0,0 @@ -foreignId('parent_ticket_id') - ->nullable() - ->after('board_column_id') - ->constrained('tickets') - ->nullOnDelete(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('tickets', function (Blueprint $table) { - $table->dropConstrainedForeignId('parent_ticket_id'); - }); - } -}; diff --git a/database/migrations/2026_03_25_073715_add_blocking_fields_to_tickets_table.php b/database/migrations/2026_03_25_073715_add_blocking_fields_to_tickets_table.php deleted file mode 100644 index 790b389..0000000 --- a/database/migrations/2026_03_25_073715_add_blocking_fields_to_tickets_table.php +++ /dev/null @@ -1,33 +0,0 @@ -boolean('is_blocked') - ->default(false) - ->after('parent_ticket_id'); - $table->text('blocked_comment') - ->nullable() - ->after('is_blocked'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('tickets', function (Blueprint $table) { - $table->dropColumn(['blocked_comment', 'is_blocked']); - }); - } -};