From a6f1537e4eb5b259d795a7ce47c1d9393b6a3857 Mon Sep 17 00:00:00 2001 From: Dave Earley Date: Wed, 31 Dec 2025 10:45:44 +0000 Subject: [PATCH 1/3] Feature: Add mail failover (#988) --- backend/composer.json | 4 +- backend/composer.lock | 258 +++++++++++++++++++++++++++++++++++++++- backend/config/mail.php | 2 +- 3 files changed, 260 insertions(+), 4 deletions(-) diff --git a/backend/composer.json b/backend/composer.json index 55b0bb88f7..8dbd2ad25e 100644 --- a/backend/composer.json +++ b/backend/composer.json @@ -8,6 +8,7 @@ "require": { "php": "^8.2", "ext-intl": "*", + "ext-xmlwriter": "*", "barryvdh/laravel-dompdf": "^3.0", "brick/money": "^0.10.1", "doctrine/dbal": "^3.6", @@ -28,7 +29,8 @@ "spatie/laravel-data": "^4.15", "spatie/laravel-webhook-server": "^3.8", "stripe/stripe-php": "^17.0", - "ext-xmlwriter": "*" + "symfony/http-client": "^7.4", + "symfony/postmark-mailer": "^7.4" }, "suggest": { "ext-imagick": "Required for image dimension extraction and LQIP generation" diff --git a/backend/composer.lock b/backend/composer.lock index 36377458ee..c6c34f0982 100644 --- a/backend/composer.lock +++ b/backend/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0c263c1a16e8b92f9f98ae4be5574a19", + "content-hash": "7649da1e3e0f8fad888953eb259e42b7", "packages": [ { "name": "amphp/amp", @@ -8262,6 +8262,185 @@ ], "time": "2025-07-15T13:41:35+00:00" }, + { + "name": "symfony/http-client", + "version": "v7.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "26cc224ea7103dda90e9694d9e139a389092d007" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/26cc224ea7103dda90e9694d9e139a389092d007", + "reference": "26cc224ea7103dda90e9694d9e139a389092d007", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v7.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-04T21:12:57+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "75d7043853a42837e68111812f4d964b01e5101c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-29T11:18:49+00:00" + }, { "name": "symfony/http-foundation", "version": "v7.3.4", @@ -9603,6 +9782,80 @@ ], "time": "2024-09-09T11:45:10+00:00" }, + { + "name": "symfony/postmark-mailer", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/postmark-mailer.git", + "reference": "67eab9e06ff2adf74152df2ac95a07cef48eb7c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/postmark-mailer/zipball/67eab9e06ff2adf74152df2ac95a07cef48eb7c5", + "reference": "67eab9e06ff2adf74152df2ac95a07cef48eb7c5", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "symfony/mailer": "^7.2|^8.0" + }, + "conflict": { + "symfony/http-foundation": "<6.4" + }, + "require-dev": { + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/webhook": "^6.4|^7.0|^8.0" + }, + "type": "symfony-mailer-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\Bridge\\Postmark\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Postmark Mailer Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/postmark-mailer/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-08-04T07:05:15+00:00" + }, { "name": "symfony/process", "version": "v7.3.4", @@ -13445,7 +13698,8 @@ "prefer-lowest": false, "platform": { "php": "^8.2", - "ext-intl": "*" + "ext-intl": "*", + "ext-xmlwriter": "*" }, "platform-dev": {}, "plugin-api-version": "2.6.0" diff --git a/backend/config/mail.php b/backend/config/mail.php index 811c09f308..5bb2254529 100644 --- a/backend/config/mail.php +++ b/backend/config/mail.php @@ -82,7 +82,7 @@ 'transport' => 'failover', 'mailers' => [ 'smtp', - 'log', + 'postmark', ], ], ], From 6d0de5f9b59d28eac425457865a5b6ea570c23f3 Mon Sep 17 00:00:00 2001 From: Dave Earley Date: Wed, 31 Dec 2025 10:50:42 +0000 Subject: [PATCH 2/3] Fix: Missing property casting (#989) --- backend/app/Models/OrderPaymentPlatformFee.php | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/app/Models/OrderPaymentPlatformFee.php b/backend/app/Models/OrderPaymentPlatformFee.php index 6250f1be3f..d71599eab1 100644 --- a/backend/app/Models/OrderPaymentPlatformFee.php +++ b/backend/app/Models/OrderPaymentPlatformFee.php @@ -17,6 +17,7 @@ protected function getCastMap(): array 'application_fee_gross_amount' => 'float', 'application_fee_net_amount' => 'float', 'application_fee_vat_amount' => 'float', + 'application_fee_vat_rate' => 'float', ]; } From 3abc0d1bc03fe5fd1be8387a12dcdf618eb9f0be Mon Sep 17 00:00:00 2001 From: Dave Earley Date: Wed, 31 Dec 2025 11:06:42 +0000 Subject: [PATCH 3/3] Fix: Large user agents causing errors in order audit logs --- ...er_order_audit_logs_user_agent_to_text.php | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 backend/database/migrations/2025_12_31_000000_alter_order_audit_logs_user_agent_to_text.php diff --git a/backend/database/migrations/2025_12_31_000000_alter_order_audit_logs_user_agent_to_text.php b/backend/database/migrations/2025_12_31_000000_alter_order_audit_logs_user_agent_to_text.php new file mode 100644 index 0000000000..56ae2e3ef5 --- /dev/null +++ b/backend/database/migrations/2025_12_31_000000_alter_order_audit_logs_user_agent_to_text.php @@ -0,0 +1,22 @@ +text('user_agent')->nullable()->change(); + }); + } + + public function down(): void + { + Schema::table('order_audit_logs', function (Blueprint $table) { + $table->string('user_agent')->nullable()->change(); + }); + } +};