Merge branch 'master' into customer
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Lunar\Base\Migration;
|
||||
|
||||
/**
|
||||
* First-party copy of lunarphp/stripe's own create_stripe_payment_intents_table
|
||||
* migration (package removed in favour of depending on stripe/stripe-php
|
||||
* directly — see Modules\Core\Payment\Support\StripeManager and
|
||||
* Modules\Core\Payment\Models\StripePaymentIntent, which replace the
|
||||
* package's own classes over this same table). Timestamped to run just
|
||||
* before this app's own add_context_to_stripe_payment_intents migration,
|
||||
* which already alters this table.
|
||||
*
|
||||
* Guarded with hasTable(): on any environment that already ran
|
||||
* lunarphp/stripe's own copy of this migration before the package was
|
||||
* removed, the table already exists — this migration is only the one that
|
||||
* actually creates it on a fresh install/database from now on.
|
||||
*/
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
if (Schema::hasTable($this->prefix.'stripe_payment_intents')) {
|
||||
return;
|
||||
}
|
||||
|
||||
Schema::create($this->prefix.'stripe_payment_intents', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignId('cart_id')->constrained($this->prefix.'carts');
|
||||
$table->foreignId('order_id')->nullable()->constrained($this->prefix.'orders');
|
||||
$table->string('intent_id')->index();
|
||||
$table->string('status')->nullable();
|
||||
$table->string('event_id')->index()->nullable();
|
||||
$table->timestamp('processing_at')->nullable();
|
||||
$table->timestamp('processed_at')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists($this->prefix.'stripe_payment_intents');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Lunar\Models\Language;
|
||||
|
||||
/**
|
||||
* PaymentMethod.name becomes a locale-keyed JSON array (e.g.
|
||||
* {"en": "Cash On Delivery", "el": "Αντικαταβολή"}), rendered in Filament
|
||||
* via Lunar's own Lunar\Admin\Support\Forms\Components\TranslatedText —
|
||||
* the same reusable component/data-shape Product/Collection names already
|
||||
* use (Lunar\Base\Traits\HasTranslations), just applied directly to a
|
||||
* plain column here rather than through attribute_data, since
|
||||
* PaymentMethod is a merchant-configured settings row, not a translatable
|
||||
* catalog attribute.
|
||||
*
|
||||
* Existing plain-string rows are preserved under the store's default
|
||||
* Language code (falls back to 'en' if no Language row exists yet — this
|
||||
* migration can run before lunar:install seeds one) rather than dropped,
|
||||
* so an already-configured payment method's name isn't blanked out.
|
||||
*
|
||||
* Uses a raw `ALTER COLUMN ... TYPE` rather than Blueprint::change()
|
||||
* (which requires doctrine/dbal — not installed in this project) —
|
||||
* Postgres-specific (this project runs on `pgsql`, per its own docker
|
||||
* setup), with an explicit USING clause since json isn't implicitly
|
||||
* castable from varchar.
|
||||
*/
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
$defaultLocale = Language::where('default', true)->value('code') ?? 'en';
|
||||
|
||||
$existing = DB::table('payment_methods')->pluck('name', 'id');
|
||||
|
||||
DB::statement('ALTER TABLE payment_methods ALTER COLUMN name DROP DEFAULT');
|
||||
DB::statement("ALTER TABLE payment_methods ALTER COLUMN name TYPE json USING NULL");
|
||||
|
||||
foreach ($existing as $id => $name) {
|
||||
if ($name === null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
DB::table('payment_methods')
|
||||
->where('id', $id)
|
||||
->update(['name' => json_encode([$defaultLocale => $name])]);
|
||||
}
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
$defaultLocale = Language::where('default', true)->value('code') ?? 'en';
|
||||
|
||||
$existing = DB::table('payment_methods')->pluck('name', 'id');
|
||||
|
||||
DB::statement('ALTER TABLE payment_methods ALTER COLUMN name TYPE varchar(255) USING NULL');
|
||||
|
||||
foreach ($existing as $id => $name) {
|
||||
$decoded = json_decode((string) $name, true);
|
||||
$flat = is_array($decoded) ? ($decoded[$defaultLocale] ?? reset($decoded) ?: null) : $name;
|
||||
|
||||
DB::table('payment_methods')->where('id', $id)->update(['name' => $flat]);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Lunar\Base\Migration;
|
||||
use Lunar\Models\Language;
|
||||
|
||||
/**
|
||||
* ShippingMethod.name becomes a locale-keyed JSON array (e.g.
|
||||
* {"en": "Standard Delivery", "el": "Κανονική Παράδοση"}), rendered in
|
||||
* Filament via Lunar's own Lunar\Admin\Support\Forms\Components\
|
||||
* TranslatedText (Modules\Core\Shipping\Extensions\
|
||||
* ShippingMethodResourceExtension::replaceNameField()) — same shape/
|
||||
* resolution as PaymentMethod.name (see its own migration,
|
||||
* 2026_09_15_000001_make_payment_methods_name_translatable.php) and
|
||||
* Product/Collection names (Lunar\Base\Traits\HasTranslations).
|
||||
*
|
||||
* ShippingMethod is a vendor (lunarphp/table-rate-shipping) table, but
|
||||
* converting a vendor column's type via a migration is no different from
|
||||
* any other schema change this project already makes against a vendor
|
||||
* table (see database/migrations/2026_08_31_000001_create_payment_methods_table.php's
|
||||
* sibling migrations for the same pattern against PaymentMethod) — there
|
||||
* was no good reason to route this through `data.name` instead, unlike
|
||||
* `data.fulfillment_type` which is a genuinely NEW field the vendor table
|
||||
* never had at all.
|
||||
*
|
||||
* Existing plain-string rows are preserved under the store's default
|
||||
* Language code (falls back to 'en' if no Language row exists yet)
|
||||
* rather than dropped.
|
||||
*
|
||||
* Uses a raw `ALTER COLUMN ... TYPE` rather than Blueprint::change()
|
||||
* (requires doctrine/dbal — not installed in this project) — Postgres-
|
||||
* specific (this project runs on `pgsql`), with an explicit USING clause
|
||||
* since json isn't implicitly castable from varchar.
|
||||
*/
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
$table = $this->prefix.'shipping_methods';
|
||||
$defaultLocale = Language::where('default', true)->value('code') ?? 'en';
|
||||
|
||||
// The column is NOT NULL (vendor migration never marked it
|
||||
// nullable) — converting via `USING NULL` first, then
|
||||
// backfilling with a second UPDATE, violates that constraint
|
||||
// before the backfill ever runs. json_build_object() converts
|
||||
// each existing string in place, in the same statement, so the
|
||||
// column is never transiently NULL. $defaultLocale is inlined
|
||||
// (not bound) — parameter binding inside an ALTER TABLE ... USING
|
||||
// expression isn't reliable across drivers; it's a Language::code
|
||||
// value we control, not user input, so quote_literal-safe
|
||||
// interpolation here is fine.
|
||||
$quotedLocale = DB::getPdo()->quote($defaultLocale);
|
||||
|
||||
DB::statement("ALTER TABLE {$table} ALTER COLUMN name TYPE json USING json_build_object({$quotedLocale}, name)");
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
$table = $this->prefix.'shipping_methods';
|
||||
$defaultLocale = Language::where('default', true)->value('code') ?? 'en';
|
||||
|
||||
// Same NOT NULL constraint applies going back — ->>'{locale}'
|
||||
// extracts the default locale's text value directly in the
|
||||
// USING clause, falling back to the first key present via
|
||||
// COALESCE for any row missing that locale (e.g. one only ever
|
||||
// filled in via a non-default language).
|
||||
$quotedLocale = DB::getPdo()->quote($defaultLocale);
|
||||
|
||||
DB::statement(
|
||||
"ALTER TABLE {$table} ALTER COLUMN name TYPE varchar(255) ".
|
||||
"USING COALESCE(name->>{$quotedLocale}, (SELECT value FROM json_each_text(name) LIMIT 1))"
|
||||
);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user