feat: refactor cart and purchase handling to support polymorphic buyable types and improve code readability

This commit is contained in:
2026-07-16 09:55:38 -03:00
parent c05206cc51
commit 6fc6ed1fac
14 changed files with 196 additions and 79 deletions

View File

@@ -2,6 +2,7 @@
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
@@ -14,17 +15,23 @@ return new class extends Migration
Schema::table('carrito_items', function (Blueprint $table) {
$table->string('buyable_type')->nullable();
$table->unsignedBigInteger('buyable_id')->nullable();
$table->index('cart_id');
});
// Copy existing data
\Illuminate\Support\Facades\DB::table('carrito_items')->update([
DB::table('carrito_items')->update([
'buyable_type' => 'App\Domains\Catalog\Models\ProductVariant',
'buyable_id' => \Illuminate\Support\Facades\DB::raw('producto_variante_id'),
'buyable_id' => DB::raw('producto_variante_id'),
]);
Schema::table('carrito_items', function (Blueprint $table) {
$table->dropForeign(['producto_variante_id']);
});
Schema::table('carrito_items', function (Blueprint $table) {
$table->dropUnique(['cart_id', 'producto_variante_id']);
$table->dropColumn('producto_variante_id');
$table->unique(['cart_id', 'buyable_type', 'buyable_id']);
});
}
@@ -34,15 +41,18 @@ return new class extends Migration
public function down(): void
{
Schema::table('carrito_items', function (Blueprint $table) {
$table->dropUnique(['cart_id', 'buyable_type', 'buyable_id']);
$table->foreignId('producto_variante_id')->nullable()->constrained('productos_variantes')->onDelete('cascade');
});
\Illuminate\Support\Facades\DB::table('carrito_items')->update([
'producto_variante_id' => \Illuminate\Support\Facades\DB::raw('buyable_id'),
DB::table('carrito_items')->update([
'producto_variante_id' => DB::raw('buyable_id'),
]);
Schema::table('carrito_items', function (Blueprint $table) {
$table->dropColumn(['buyable_type', 'buyable_id']);
$table->dropIndex(['cart_id']);
$table->unique(['cart_id', 'producto_variante_id']);
});
}
};