From 93f75c520853518e9bda54ef18be2894ad389c59 Mon Sep 17 00:00:00 2001 From: jfrosorio Date: Sat, 26 Sep 2026 18:00:49 +0100 Subject: [PATCH] refactor(types): add a reference state enum and precise return types --- src/Enums/ReferenceState.php | 12 ++++++++++++ src/Events/Dispatchable.php | 2 +- src/Http/Controllers/Controller.php | 8 +++++--- src/Http/Controllers/MBController.php | 8 +++++--- src/Models/CreditCardReference.php | 7 +++++-- src/Models/MbReference.php | 14 +++++++++----- src/Models/MbwayReference.php | 7 +++++-- src/Models/PayShopReference.php | 7 +++++-- src/Models/PaysafeCardReference.php | 7 +++++-- src/Providers/EuPagoServiceProvider.php | 6 +++--- 10 files changed, 55 insertions(+), 23 deletions(-) create mode 100644 src/Enums/ReferenceState.php diff --git a/src/Enums/ReferenceState.php b/src/Enums/ReferenceState.php new file mode 100644 index 0000000..510de5e --- /dev/null +++ b/src/Enums/ReferenceState.php @@ -0,0 +1,12 @@ +getConnection()->transaction(function () use ($query, $transaction) { + $reference = $query->getConnection()->transaction(function () use ($query, $transaction): ?Model { // A reference already paid by this transaction comes first, so a // redelivery never marks another pending match as paid. $reference = $query - ->where(fn ($query) => $query->where('state', 0)->orWhere('transaction_id', $transaction)) + ->where(fn ($query) => $query->where('state', ReferenceState::Pending->value)->orWhere('transaction_id', $transaction)) ->orderByDesc('state') ->lockForUpdate() ->first(); if ($reference && $reference->getAttribute('transaction_id') !== $transaction) { $reference->update([ - 'state' => 1, + 'state' => ReferenceState::Paid->value, 'transaction_id' => $transaction, ]); } diff --git a/src/Http/Controllers/MBController.php b/src/Http/Controllers/MBController.php index 2068108..fa159ef 100644 --- a/src/Http/Controllers/MBController.php +++ b/src/Http/Controllers/MBController.php @@ -2,9 +2,11 @@ namespace CodeTech\EuPago\Http\Controllers; +use CodeTech\EuPago\Enums\ReferenceState; use CodeTech\EuPago\Events\MBReferencePaid; use CodeTech\EuPago\Http\Requests\MbCallbackRequest; use CodeTech\EuPago\Models\MbReference; +use CodeTech\EuPago\Models\MbReferencePayment; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -39,7 +41,7 @@ public function callback(Request $request) */ private function recordPayment(Builder $query, string $transaction, string $value): JsonResponse { - $payment = $query->getConnection()->transaction(function () use ($query, $transaction, $value) { + $payment = $query->getConnection()->transaction(function () use ($query, $transaction, $value): ?MbReferencePayment { $reference = $query->lockForUpdate()->first(); if (! $reference) { @@ -55,12 +57,12 @@ private function recordPayment(Builder $query, string $transaction, string $valu // A reference can allow repeat payments, so one already paid still // takes a new payment, as long as its payments are recorded to tell // it from a redelivered one. - if ((int) $reference->getAttribute('state') !== 0 && ! $reference->payments()->exists()) { + if ((int) $reference->getAttribute('state') !== ReferenceState::Pending->value && ! $reference->payments()->exists()) { return null; } $reference->update([ - 'state' => 1, + 'state' => ReferenceState::Paid->value, 'transaction_id' => $transaction, ]); diff --git a/src/Models/CreditCardReference.php b/src/Models/CreditCardReference.php index c99886d..05c741d 100644 --- a/src/Models/CreditCardReference.php +++ b/src/Models/CreditCardReference.php @@ -2,6 +2,8 @@ namespace CodeTech\EuPago\Models; +use CodeTech\EuPago\Enums\ReferenceState; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class CreditCardReference extends Model @@ -38,11 +40,12 @@ class CreditCardReference extends Model /** * Scopes a query to only include paid references. * - * @return mixed + * @param Builder $query + * @return Builder */ public function scopePaid($query) { - return $query->where('state', 1); + return $query->where('state', ReferenceState::Paid->value); } /* diff --git a/src/Models/MbReference.php b/src/Models/MbReference.php index 308c3a2..389f1d3 100644 --- a/src/Models/MbReference.php +++ b/src/Models/MbReference.php @@ -2,6 +2,8 @@ namespace CodeTech\EuPago\Models; +use CodeTech\EuPago\Enums\ReferenceState; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -36,22 +38,24 @@ class MbReference extends Model /** * Scopes a query to only include paid references. * - * @return mixed + * @param Builder $query + * @return Builder */ public function scopePaid($query) { - return $query->where('state', 1); + return $query->where('state', ReferenceState::Paid->value); } /** * Scopes a query to the references that accept a payment of the given * value: their own value, or any amount within their range. * - * @return mixed + * @param Builder $query + * @return Builder */ - public function scopeAccepting($query, $value) + public function scopeAccepting(Builder $query, string $value): Builder { - return $query->where(function ($query) use ($value) { + return $query->where(function (Builder $query) use ($value): void { $query->where('value', $value) ->orWhere(fn ($query) => $query->where('min_value', '<=', $value)->where('max_value', '>=', $value)); }); diff --git a/src/Models/MbwayReference.php b/src/Models/MbwayReference.php index d1a05d3..57b9d57 100644 --- a/src/Models/MbwayReference.php +++ b/src/Models/MbwayReference.php @@ -2,6 +2,8 @@ namespace CodeTech\EuPago\Models; +use CodeTech\EuPago\Enums\ReferenceState; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class MbwayReference extends Model @@ -31,11 +33,12 @@ class MbwayReference extends Model /** * Scopes a query to only include paid references. * - * @return mixed + * @param Builder $query + * @return Builder */ public function scopePaid($query) { - return $query->where('state', 1); + return $query->where('state', ReferenceState::Paid->value); } /* diff --git a/src/Models/PayShopReference.php b/src/Models/PayShopReference.php index 41442e8..e2384b2 100644 --- a/src/Models/PayShopReference.php +++ b/src/Models/PayShopReference.php @@ -2,6 +2,8 @@ namespace CodeTech\EuPago\Models; +use CodeTech\EuPago\Enums\ReferenceState; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class PayShopReference extends Model @@ -35,11 +37,12 @@ class PayShopReference extends Model /** * Scopes a query to only include paid references. * - * @return mixed + * @param Builder $query + * @return Builder */ public function scopePaid($query) { - return $query->where('state', 1); + return $query->where('state', ReferenceState::Paid->value); } /* diff --git a/src/Models/PaysafeCardReference.php b/src/Models/PaysafeCardReference.php index d310f7b..ecbf832 100644 --- a/src/Models/PaysafeCardReference.php +++ b/src/Models/PaysafeCardReference.php @@ -2,6 +2,8 @@ namespace CodeTech\EuPago\Models; +use CodeTech\EuPago\Enums\ReferenceState; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class PaysafeCardReference extends Model @@ -37,11 +39,12 @@ class PaysafeCardReference extends Model /** * Scopes a query to only include paid references. * - * @return mixed + * @param Builder $query + * @return Builder */ public function scopePaid($query) { - return $query->where('state', 1); + return $query->where('state', ReferenceState::Paid->value); } /* diff --git a/src/Providers/EuPagoServiceProvider.php b/src/Providers/EuPagoServiceProvider.php index cbd5627..5721ca6 100644 --- a/src/Providers/EuPagoServiceProvider.php +++ b/src/Providers/EuPagoServiceProvider.php @@ -35,7 +35,7 @@ public function boot() /** * Sets the configuration files. */ - private function setConfigurations() + private function setConfigurations(): void { $this->mergeConfigFrom( __DIR__.'/../../config/eupago.php', 'eupago' @@ -45,7 +45,7 @@ private function setConfigurations() /** * Loads the package routes. */ - private function loadRoutes() + private function loadRoutes(): void { if (! $this->app['config']->get('eupago.routes')) { return; @@ -65,7 +65,7 @@ private function loadRoutes() /** * Sets the publishable files. */ - private function setPublishableFiles() + private function setPublishableFiles(): void { // The unprefixed tags are kept for backward compatibility; the docs use the prefixed ones. $this->publishes([