53 lines
2.2 KiB
PHP
53 lines
2.2 KiB
PHP
<?php
|
|||
|
|
|
||
|
|
namespace Modules\Core\Command;
|
||
|
|
|
||
|
|
use Illuminate\Console\Command;
|
||
|
|
use Modules\Core\Payment\Models\PaymentMethod;
|
||
|
|
use Modules\Core\Payment\Services\PaymentDriverRegistry;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Reconciles every Modules\Core\Payment\Models\PaymentMethod row's `driver`
|
||
|
|
* column against PaymentDriverRegistry — the registry only knows "which
|
||
|
|
* driver classes exist THIS deploy," and only at the moment something
|
||
|
|
* calls resolve(); nothing else notices a driver disappearing (a package
|
||
|
|
* removed, a custom Registry::register() call deleted) on its own. Meant
|
||
|
|
* to run unconditionally on every container start/deploy (alongside
|
||
|
|
* `migrate`), not on a schedule — "did the set of registered drivers
|
||
|
|
* change" is a deploy-time event, cheap enough to check every single time
|
||
|
|
* regardless of whether anything actually changed. See docs/payments.md.
|
||
|
|
*
|
||
|
|
* Sets/clears `driver_missing_at` — deliberately NOT the `enabled` column,
|
||
|
|
* so an admin's own manual toggle is never confused with "the driver
|
||
|
|
* vanished," and a driver that comes back in a later deploy auto-clears
|
||
|
|
* this with no admin action needed.
|
||
|
|
*/
|
||
|
|
class SyncPaymentDriversCommand extends Command
|
||
|
|
{
|
||
|
|
protected $signature = 'boboko:payment:sync-drivers';
|
||
|
|
|
||
|
|
protected $description = 'Flag PaymentMethod rows whose driver no longer resolves via the registry, and clear the flag for ones that do again';
|
||
|
|
|
||
|
|
public function handle(PaymentDriverRegistry $registry): int
|
||
|
|
{
|
||
|
|
$missing = 0;
|
||
|
|
$restored = 0;
|
||
|
|
|
||
|
|
PaymentMethod::query()->each(function (PaymentMethod $method) use ($registry, &$missing, &$restored) {
|
||
|
|
$resolves = $method->driver !== null && $registry->resolve($method->driver) !== null;
|
||
|
|
|
||
|
|
if (! $resolves && $method->driver_missing_at === null) {
|
||
|
|
$method->update(['driver_missing_at' => now()]);
|
||
|
|
$missing++;
|
||
|
|
} elseif ($resolves && $method->driver_missing_at !== null) {
|
||
|
|
$method->update(['driver_missing_at' => null]);
|
||
|
|
$restored++;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
$this->components->info("Payment driver sync complete: {$missing} newly flagged, {$restored} restored.");
|
||
|
|
|
||
|
|
return self::SUCCESS;
|
||
|
|
}
|
||
|
|
}
|