From 2e7f5733ef263c3c48db3936f32be3567af62bcf Mon Sep 17 00:00:00 2001 From: Harry Lewis Date: Wed, 24 May 2023 18:05:28 +0100 Subject: [PATCH] Fix Enom transfer() logic to only return success upon transfer completion --- src/Enom/Helper/EnomApi.php | 2 +- src/Enom/Provider.php | 39 ++++++++++++++++++------------------- src/Helper/Utils.php | 6 +++++- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/Enom/Helper/EnomApi.php b/src/Enom/Helper/EnomApi.php index 9002119..a9133ad 100644 --- a/src/Enom/Helper/EnomApi.php +++ b/src/Enom/Helper/EnomApi.php @@ -571,7 +571,7 @@ public function getDomainTransferOrders(string $sld, string $tld): ?array 'orderId' => (int) $childData->transferorderid, 'status' => (string) $childData->orderstatus, 'statusId' => (int) $childData->statusid, - 'date' => Utils::formatDate((string) $childData->orderdate) + 'date' => Utils::formatDate((string) $childData->orderdate, null, (string)$result->TimeDifference) ]; } } diff --git a/src/Enom/Provider.php b/src/Enom/Provider.php index 7d9e4d4..131ba1f 100644 --- a/src/Enom/Provider.php +++ b/src/Enom/Provider.php @@ -206,35 +206,34 @@ public function transfer(TransferParams $params): DomainResult $sld = $params->sld; $tld = $params->tld; - $domain = Utils::getDomain($sld, $tld); // TODO: `renew_years` (period) is not needed here. //$period = Arr::get($params, 'renew_years', 1); // TODO: In development, `epp_code` is not needed as well, but required when sending the requests, so we may just send a random string $eppCode = $params->epp_code ?: '1234'; + try { + return $this->_getInfo($sld, $tld, 'Domain is active in registrar account'); + } catch (\Throwable $e) { + // Domain not active in account: proceed to initiate or check transfer order below + } + try { // Check for previous order first - $prevOrder = $this->api()->getDomainTransferOrders($sld, $tld); - - if (is_null($prevOrder)) { - // Attempt to create a new transfer order. - $transfer = $this->api()->initiateTransfer($sld, $tld, $eppCode); - - // Transfer is most probably still pending, so we'll return just a basic info with the transfer order id, the domain and the order creation date - return DomainResult::create([ - 'id' => (string) $transfer['orderId'], - 'domain' => $domain, - 'ns' => [], - 'statuses' => [], - 'created_at' => Utils::formatDate($transfer['date']), - 'updated_at' => Utils::formatDate($transfer['date']), - 'expires_at' => Utils::formatDate($transfer['date']) - ]); - } else { - $this->errorResult(sprintf('Transfer order(s) for %s already exists!', $domain), $prevOrder, $params); + if ($prevOrders = $this->api()->getDomainTransferOrders($sld, $tld)) { + $prevOrder = collect($prevOrders)->sortByDesc('date')->first(); + throw $this->errorResult( + sprintf('Transfer order in progress since %s', $prevOrder['date']), + $prevOrders, + $params + ); } + + // Attempt to create a new transfer order. + $this->api()->initiateTransfer($sld, $tld, $eppCode); + + throw $this->errorResult('Domain transfer order initiated'); } catch (\Throwable $e) { - $this->handleException($e, $params); + throw $this->handleException($e, $params); } } diff --git a/src/Helper/Utils.php b/src/Helper/Utils.php index c5a7d64..906edca 100644 --- a/src/Helper/Utils.php +++ b/src/Helper/Utils.php @@ -18,7 +18,7 @@ class Utils * @param string|null $format * @return string|null Formatted date, or null */ - public static function formatDate(?string $date, ?string $format = null): ?string + public static function formatDate(?string $date, ?string $format = null, ?string $adjustHours = null): ?string { if (empty($date)) { return null; @@ -26,6 +26,10 @@ public static function formatDate(?string $date, ?string $format = null): ?strin $dateObject = Carbon::parse($date); + if ($adjustHours) { + $dateObject->addHours($adjustHours); + } + if (!is_null($format)) { return $dateObject->format($format); }