From ee286716e68c49d7cac6d5a2be229d4dc9e8fcae Mon Sep 17 00:00:00 2001 From: Bhupesh Pandey Date: Fri, 31 Jan 2025 14:12:49 +0530 Subject: [PATCH] added: error notification on draft creation failure --- src/services/repository/DraftRepository.php | 39 +++++++++++++++++---- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/services/repository/DraftRepository.php b/src/services/repository/DraftRepository.php index 25c2c3c3..70ddf350 100644 --- a/src/services/repository/DraftRepository.php +++ b/src/services/repository/DraftRepository.php @@ -46,8 +46,10 @@ public function getDraftById($draftId, $siteId) public function saveDraft($element) { $element->validate(); - if($element->getErrors()){ - return $element->getErrors(); + if($element->getErrors()) { + // Extract the error messages from the element's errors + $errorMessages = $this->extractErrorMessages($element->getErrors()); + throw new Exception("Validation failed: " . $errorMessages); } return Craft::$app->elements->saveElement($element, true, true, false); @@ -188,9 +190,12 @@ public function createOrderDrafts($orderId, $wordCounts, $publish, $fileIds, $qu $currentElement = 0; $createDrafts = new CreateDrafts(); - $transaction = Craft::$app->db->beginTransaction(); - + foreach ($order->getFiles() as $file) { + /* Create transaction per file so that in case a file has validation error + only that will be rolledback and others can be processed */ + $transaction = Craft::$app->db->beginTransaction(); + if (! in_array($file->id, $fileIds)) { continue; } @@ -231,12 +236,13 @@ public function createOrderDrafts($orderId, $wordCounts, $publish, $fileIds, $qu if ($publish) { $this->applyDrafts($order->id, [$element->id], [$file->id], $queue); } + $transaction->commit(); } catch(Exception $e) { $transaction->rollback(); - throw $e; + $this->setError($e->getMessage()); + continue; } } - $transaction->commit(); if ($isNewDraft) $order->logActivity(Translations::$plugin->translator->translate('app', 'Drafts created')); @@ -418,4 +424,25 @@ public function deleteDraft($draftId, $siteId) throw $e; } } + + /** + * Extract error messages from an error object in string format + */ + private function extractErrorMessages($errorObject) + { + $errorMessages = []; + + // Iterate through each key in the error object + foreach ($errorObject as $field => $messages) { + if (is_array($messages)) { + // Iterate through each error message in the array + foreach ($messages as $message) { + $errorMessages[] = $message; // Add the message to the list + } + } + } + + // Return the concatenated error messages as a string + return implode("\n", $errorMessages); + } }