From 65b26e80c6f07e27aa86a50f88a960fca0c80014 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lucas=20Garc=C3=ADa?= <lucas@codeccoop.org>
Date: Thu, 11 Jul 2024 23:54:19 +0200
Subject: [PATCH] feat: handle rpc response errors

---
 ...tegration.php => abstract-integration.php} | 23 +++++++++++++++++--
 wpct-erp-forms.php                            |  2 +-
 2 files changed, 22 insertions(+), 3 deletions(-)
 rename includes/{class-integration.php => abstract-integration.php} (91%)

diff --git a/includes/class-integration.php b/includes/abstract-integration.php
similarity index 91%
rename from includes/class-integration.php
rename to includes/abstract-integration.php
index 7a0d33d..471eb86 100644
--- a/includes/class-integration.php
+++ b/includes/abstract-integration.php
@@ -46,7 +46,7 @@ abstract class Integration extends Singleton
                 $response = Wpct_Http_Client::post_multipart($endpoint, $payload, $attachments);
             }
 
-            $success = $success && !is_wp_error($response);
+            $success = $success && !is_wp_error($response) && apply_filters('_wpct_erp_forms_validate_rpc_response', true, $response);
         }
 
         if (!$success) {
@@ -115,7 +115,13 @@ abstract class Integration extends Singleton
             ];
         }, $models);
 
-        return $this->submit($requests);
+        $validation = fn ($result, $res) => $this->rpc_response_validation($res);
+        add_filter('_wpct_erp_forms_validate_rpc_response', $validation, 2, 10);
+
+        $result = $this->submit($requests);
+
+        remove_filter('_wpct_erp_forms_validate_rpc_response', $validation, 2, 10);
+        return $result;
     }
 
     private function submit_rest($endpoints, $payload, $attachments, $form_data)
@@ -225,6 +231,9 @@ abstract class Integration extends Singleton
         }
 
         $login = (array) json_decode($res['body'], true);
+        if (isset($login['error'])) {
+            throw new Exception('RPC login error');
+        }
         $user_id = $login['result'];
         return [$session_id, $user_id];
     }
@@ -242,4 +251,14 @@ abstract class Integration extends Singleton
             ],
         ];
     }
+
+    private function rpc_response_validation($res)
+    {
+        $payload = (array) json_decode($res['body'], true);
+        if (isset($payload['error'])) {
+            return false;
+        }
+
+        return true;
+    }
 }
diff --git a/wpct-erp-forms.php b/wpct-erp-forms.php
index 3877499..7044d94 100755
--- a/wpct-erp-forms.php
+++ b/wpct-erp-forms.php
@@ -31,7 +31,7 @@ require_once 'abstracts/class-settings.php';
 require_once 'wpct-http-bridge/wpct-http-bridge.php';
 require_once 'wpct-i18n/wpct-i18n.php';
 
-require_once 'includes/class-integration.php';
+require_once 'includes/abstract-integration.php';
 require_once 'includes/class-menu.php';
 require_once 'includes/class-settings.php';
 
-- 
GitLab