From cf8230a246ea0eee795e460b65b29d90195589c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lucas=20Garc=C3=ADa?= <lucas@codeccoop.org>
Date: Tue, 23 Jan 2024 10:56:27 +0100
Subject: [PATCH] feat: integrations registry

---
 includes/integrations/Integration.php        | 40 +++++++++++++++++---
 includes/integrations/contactform7/index.php |  7 +---
 includes/integrations/gravityforms/index.php |  5 ---
 includes/integrations/index.php              | 16 ++++++++
 readme.txt                                   | 21 ++++++++--
 5 files changed, 69 insertions(+), 20 deletions(-)

diff --git a/includes/integrations/Integration.php b/includes/integrations/Integration.php
index 47f647f..e62be1e 100644
--- a/includes/integrations/Integration.php
+++ b/includes/integrations/Integration.php
@@ -6,8 +6,33 @@ use Exception;
 
 class Integration
 {
-    public function register()
+    private static $instances = [];
+
+    public function __construct()
+    {
+        add_action('init', function () {
+            $integration = self::get_instance();
+            $integration->register();
+        });
+    }
+
+    protected function __clone()
+    {
+    }
+
+    public function __wakeup()
+    {
+        throw new \Exception("Cannot unserialize a singleton.");
+    }
+
+    public static function get_instance()
     {
+        $cls = static::class;
+        if (!isset(self::$instances[$cls])) {
+            self::$instances[$cls] = new static();
+        }
+
+        return self::$instances[$cls];
     }
 
     public function submit($payload, $endpoints)
@@ -23,7 +48,7 @@ class Integration
                 if (!isset($settings['notification_receiver'])) return;
 
                 $to = $settings['notification_receiver'];
-                $subject = 'WPCT ERP Forms Error';
+                $subject = 'Wpct ERP Forms Error';
                 $body = "Form ID: {$form['id']}\n";
                 $body .= "Form title: {$form['title']}";
                 $body .= 'Submission: ' . print_r($payload, true);
@@ -73,7 +98,7 @@ class Integration
             ];
         }
 
-        return $payload;
+        return apply_filters('wpct_erp_forms_payload', $payload);
     }
 
     private function cleanup_empties(&$submission)
@@ -101,9 +126,14 @@ class Integration
             }
         );
 
-        return array_map(function ($map) {
+        return apply_filters('wpct_erp_forms_endpoints', array_map(function ($map) {
             return $map['endpoint'];
-        }, $maps);
+        }, $maps));
+    }
+
+    public function register()
+    {
+        throw new Exception('Method to overwrite by inheritance');
     }
 
     public function serialize_submission($submission, $form)
diff --git a/includes/integrations/contactform7/index.php b/includes/integrations/contactform7/index.php
index ddbcc67..72f9c93 100644
--- a/includes/integrations/contactform7/index.php
+++ b/includes/integrations/contactform7/index.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace WPCT_ERP_FORMS\Integrations\WPCF7;
+namespace WPCT_ERP_FORMS\Integrations;
 
 use WPCT_ERP_FORMS\Integrations\Integration;
 
@@ -9,8 +9,6 @@ class WPCF7 extends Integration
 
     public function register()
     {
-        parent::register();
-
         add_filter('wpcf7_before_send_mail', function ($form, &$abort, $submission) {
             $this->do_submission($submission, $form);
         }, 10, 3);
@@ -36,6 +34,3 @@ class WPCF7 extends Integration
         ];
     }
 }
-
-$wpct_erp_forms_wpct7 = new WPCF7();
-$wpct_erp_forms_wpct7->register();
diff --git a/includes/integrations/gravityforms/index.php b/includes/integrations/gravityforms/index.php
index 73caa2e..980e290 100644
--- a/includes/integrations/gravityforms/index.php
+++ b/includes/integrations/gravityforms/index.php
@@ -14,8 +14,6 @@ class GF extends Integration
 
     public function register()
     {
-        parent::register();
-
         add_action('gform_after_submission', function ($entry, $form) {
             $this->do_submission($entry, $form);
         }, 10, 2);
@@ -114,6 +112,3 @@ class GF extends Integration
         }
     }
 }
-
-$wpct_erp_forms_gf = new GF();
-$wpct_erp_forms_gf->register();
diff --git a/includes/integrations/index.php b/includes/integrations/index.php
index 73a9f87..a2e5cda 100644
--- a/includes/integrations/index.php
+++ b/includes/integrations/index.php
@@ -1,11 +1,27 @@
 <?php
 
+namespace WPCT_ERP_FORMS\Integrations;
+
+use WPCT_ERP_FORMS\Integrations\WPCF7;
+use WPCT_ERP_FORMS\Integrations\GF;
+
 require_once 'Integration.php';
 
+class WPCTIntegrationsRegistry
+{
+    public static $instances = [];
+}
+
 if (defined('WPCF7_VERSION')) {
     require_once 'contactform7/index.php';
+    add_action('plugins_loaded', function () {
+        WPCTIntegrationsRegistry::$instances[] = new WPCF7();
+    });
 }
 
 if (class_exists('GFForms')) {
     require_once 'gravityforms/index.php';
+    add_action('plugins_loaded', function () {
+        WPCTIntegrationsRegistry::$instances[] = new GF();
+    });
 }
diff --git a/readme.txt b/readme.txt
index 88ef6bc..27ce5e9 100755
--- a/readme.txt
+++ b/readme.txt
@@ -1,6 +1,6 @@
-=== Wpct CRM Forms ===
+=== Wpct ERP Forms ===
 Contributors: codeccoop, coopdevs
-Tags: forms, odoo, crm
+Tags: forms, erp, crm
 Requires at least: 6.3.1
 Tested up to: 6.3.1
 Requires PHP: 8.0
@@ -8,11 +8,24 @@ Stable tag: 1.0.0
 License: GPLv2 or later
 License URI: https://www.gnu.org/licenses/gpl-2.0.html
 
-Form submissions to the CRM Lead Odoo module
+Form submissions to ERP backends
 
 == Description ==
 
-GravityForm's submissions to the [CRM Lead](https://git.coopdevs.org/coopdevs/odoo/odoo-addons/enhancements/enhancements-crm) Odoo module. The plugin should work with [WPCT Odoo Connect](https://git.coopdevs.org/coopdevs/website/wp/wp-plugins/wpct-odoo-connect) to perform http requests, and with [GravityForms](https://www.gravityforms.com/) to build forms.
+Bridge WP form builder plugins' submissions to a ERP backend. The plugin should work with [WPCT Odoo Connect](https://git.coopdevs.org/coopdevs/website/wp/wp-plugins/wpct-odoo-connect) to perform http requests.
+
+The plugin has two integrations, with GravityForms and with Contactform7. Choose your preferred form builder.
+
+== Hooks ==
+
+Filters:
+* wpct_erp_forms_before_submission (array $submission, array $form) -> array $submission: Filter form submission
+* wpct_erp_forms_payload (array $payload) -> array $payload: Filter submission payload
+* wpct_erp_forms_endpoints (array $endpoints) -> array $endpoints: Filter endpoints array
+
+Actions:
+* wpct_erp_forms_on_failure (array $submission, array $form): Fired on submission failure
+* wpct_erp_forms_after_submission (array $submission, array $form): Fired on successfully submited
 
 == Changelog ==
 
-- 
GitLab