Skip to content
Snippets Groups Projects
Commit f4430a56 authored by Lucas García's avatar Lucas García
Browse files

feat: json rpc api

parent da2a3f91
No related branches found
No related tags found
1 merge request!3Git submodules
Pipeline #128630 failed
......@@ -10,42 +10,66 @@ abstract class Integration extends Singleton
{
abstract public function serialize_submission($submission, $form);
abstract public function serialize_form($form);
abstract public function get_uploads($submission, $form_data);
abstract public function init();
abstract public function get_uploads($submission, $form_data);
abstract public function init();
protected function __construct()
{
add_action('init', [$this, 'init']);
add_filter('option_wpct-erp-forms_rest-api', function ($setting) {
return $this->populate_refs($setting);
}, 10, 1);
add_filter('option_wpct-erp-forms_rpc-api', function ($setting) {
return $this->populate_refs($setting);
}, 10, 1);
add_action('update_option', function ($option, $from, $to) {
if ($option === 'wpct-erp-forms_rest-api' || $option === 'wpct-erp-forms_rpc-api') {
foreach ($to['forms'] as $form) {
$this->set_form_ref($form['form_id'], $form['ref']);
}
}
}, 10, 3);
}
public function submit($payload, $endpoints, $uploads, $form_data)
{
$success = true;
foreach ($endpoints as $endpoint) {
foreach ($endpoints as $proto => $urls) {
foreach ($urls as $url) {
if (!$success) {
continue;
}
if (empty($uploads)) {
$response = Wpct_Http_Client::post($endpoint, $payload);
} else {
$response = Wpct_Http_Client::post_multipart($endpoint, $payload, $uploads);
}
if ($proto === 'rpc') {
$data = $this->rpc_payload($payload);
} else {
$data = $payload;
}
if (empty($uploads)) {
$response = Wpct_Http_Client::post($url, $data);
} else {
$response = Wpct_Http_Client::post_multipart($url, $data, $uploads);
}
if (!$response) {
$success = false;
$success = $success && (bool) $response;
}
}
$settings = get_option('wpct-erp-forms_general');
if (!isset($settings['notification_receiver'])) {
return;
}
if (!$success) {
$email = Settings::get_setting('wpct-erp-forms', 'general', 'notification_receiver');
if (empty($email)) {
return;
}
$to = $settings['notification_receiver'];
$subject = 'Wpct ERP Forms Error';
$body = "Form ID: {$form_data['id']}\n";
$body .= "Form title: {$form_data['title']}";
$body .= 'Submission: ' . print_r($payload, true);
$success = wp_mail($to, $subject, $body);
if (!$success) {
throw new Exception('Error while submitting form ' . $form_data['id']);
}
$to = $email;
$subject = 'Wpct ERP Forms Error';
$body = "Form ID: {$form_data['id']}\n";
$body .= "Form title: {$form_data['title']}";
$body .= 'Submission: ' . print_r($payload, true);
$success = wp_mail($to, $subject, $body);
if (!$success) {
throw new Exception('Error while submitting form ' . $form_data['id']);
}
}
......@@ -55,7 +79,7 @@ abstract class Integration extends Singleton
public function do_submission($submission, $form)
{
$form_data = $this->serialize_form($form);
if (!$this->has_endpoints($form_data['id'])) {
if ($form_data['ref'] === null) {
return;
}
......@@ -76,7 +100,7 @@ abstract class Integration extends Singleton
$this->cleanup_empties($data);
$payload = apply_filters('wpct_erp_forms_payload', $data, $uploads, $form_data);
$endpoints = apply_filters('wpct_erp_forms_endpoints', $this->get_endpoints($form_data['id']), $payload, $uploads, $form_data);
$endpoints = apply_filters('wpct_erp_forms_endpoints', $this->get_form_endpoints($form_data['id']), $payload, $uploads, $form_data);
do_action('wpct_erp_forms_before_submission', $payload, $uploads, $form_data);
$success = $this->submit($payload, $endpoints, $uploads, $form_data);
......@@ -99,31 +123,37 @@ abstract class Integration extends Singleton
return $submission;
}
public function has_endpoints($form_id)
{
return sizeof($this->get_endpoints($form_id)) > 0;
}
private function get_endpoints($form_id)
private function get_form_endpoints($form_id)
{
$maps = array_filter(
get_option('wpct-erp-forms_api', ['endpoints' => []])['endpoints'],
function ($map) use ($form_id) {
return (string) $map['form_id'] === (string) $form_id;
}
);
$rest_forms = Settings::get_setting('wpct-erp-forms', 'rest-api', 'forms');
$rpc_forms = Settings::get_setting('wpct-erp-forms', 'rpc-api', 'forms');
$rpc_endpoint = Settings::get_setting('wpct-erp-forms', 'rpc-api', 'endpoint');
$endpoints = [
'rpc' => $rpc_forms,
'rest' => $rest_forms,
];
foreach ($endpoints as $proto => $forms) {
$endpoints[$proto] = array_map(function ($form) use ($rpc_endpoint) {
return isset($form['endpoint']) ? $form['endpoint'] : $rpc_endpoint;
}, array_filter(
$forms,
function ($form) use ($form_id) {
return (string) $form['form_id'] === (string) $form_id;
}
));
}
return array_map(function ($map) {
return $map['endpoint'];
}, $maps);
return $endpoints;
}
public function get_form_ref($form_id)
{
$setting = get_option('wpct-erp-forms_api', ['endpoints' => []]);
foreach ($setting['endpoints'] as $endpoint) {
if ((string) $endpoint['form_id'] === (string) $form_id) {
return isset($endpoint['ref']) ? $endpoint['ref'] : null;
$setting = get_option('wpct-erp-forms_refs', []);
foreach ($setting as $ref_id => $ref) {
if ((string) $ref_id === (string) $form_id) {
return $ref;
}
}
......@@ -132,14 +162,46 @@ abstract class Integration extends Singleton
public function set_form_ref($form_id, $ref)
{
$setting = get_option('wpct-erp-forms_api', ['endpoints' => []]);
for ($i = 0; $i < count($setting['endpoints']); $i++) {
if ((string) $setting['endpoints'][$i]['form_id'] === (string) $form_id) {
$endpoints[$i]['ref'] = $ref;
break;
$setting = get_option('wpct-erp-forms_refs', []);
$setting[$form_id] = $ref;
update_option('wpct-erp-forms_refs', $setting);
}
private function populate_refs($setting)
{
$refs = get_option('wpct-erp-forms_refs', []);
for ($i = 0; $i < count($setting['forms']); $i++) {
$form = $setting['forms'][$i];
if (!isset($refs[$form['form_id']])) {
continue;
}
$form['ref'] = $refs[$form['form_id']];
$setting['forms'][$i] = $form;
}
update_option('wpct-erp-forms_api', $setting);
return $setting;
}
private function rpc_payload($payload)
{
$setting = Settings::get_setting('wpct-erp-forms', 'rpc-api');
return [
'jsonrpc' => '2.0',
'method' => 'call',
'id' => time(),
'params' => [
'service' => 'object',
'method' => 'execute',
'args' => [
$setting['database'],
$setting['user'],
$setting['password'],
$setting['model'],
'create',
$payload
]
]
];
}
}
......@@ -18,27 +18,31 @@ class Settings extends BaseSettings
public function register()
{
$setting_name = $this->group_name . '_general';
$this->register_setting($setting_name, [
'notification_receiver' => [
'type' => 'string'
],
], [
'notification_receiver' => 'admin@' . parse_url(get_bloginfo('url'))['host'],
]);
$setting_name = $this->group_name . '_api';
$host = parse_url(get_bloginfo('url'))['host'];
$this->register_setting(
$setting_name,
'general',
[
'protocol' => [
'notification_receiver' => [
'type' => 'string',
],
'base_url' => [
'type' => 'string',
'enum' => [
'JSON-RPC',
'JSON-REST'
]
],
'endpoints' => [
'api_key' => [
'type' => 'string',
],
],
[
'notification_receiver' => 'admin@' . $host,
'base_url' => 'https://erp.' . $host,
'api_key' => '',
],
);
$this->register_setting(
'rest-api',
[
'forms' => [
'type' => 'array',
'items' => [
'form_id' => 'number',
......@@ -48,12 +52,52 @@ class Settings extends BaseSettings
]
],
[
'protocol' => 'JSON-RPC',
'endpoints' => [
'forms' => [
[
'endpoint' => '/api/crm-lead',
'form_id' => null,
'ref' => null
]
]
]
);
$this->register_setting(
'rpc-api',
[
'endpoint' => [
'type' => 'string'
],
'user' => [
'type' => 'string'
],
'password' => [
'type' => 'string'
],
'database' => [
'type' => 'string'
],
'model' => [
'type' => 'string'
],
'forms' => [
'type' => 'array',
'items' => [
'form_id' => 'string',
'ref' => 'string'
]
]
],
[
'endpoint' => '/jsonrpc',
'user' => 'admin',
'password' => 'admin',
'database' => 'default',
'model' => 'crm.lead',
'forms' => [
[
'endpoint' => '/wp-json/wp/v2',
'form_id' => 0,
'ref' => ''
'ref' => null
]
]
]
......@@ -62,34 +106,20 @@ class Settings extends BaseSettings
protected function input_render($setting, $field, $value)
{
if (preg_match('/^endpoints.*form_id$/', $field)) {
if (preg_match('/^forms.*form_id$/', $field)) {
return $this->render_forms_dropdown($setting, $field, $value);
} elseif ($field === 'api_protocol') {
return $this->render_protocol_radio($setting, $field, $value);
}
return parent::input_render($setting, $field, $value);
}
private function render_protocol_radio($setting, $field, $value)
{
$options = ['JSON REST API', 'JSON-RPC'];
$fieldset = '<fieldset class="structure-selection">';
foreach ($options as $option) {
$fieldset .= "<div class='row'><input type='radio' id=name='{$setting}[{$field}]' name='{$setting}[{$field}]' value={$option}><div><label for=name='{$setting}[{$field}]'>Description</div></div>";
}
$fieldset .= '</fieldset>';
return $fieldset;
}
private function render_forms_dropdown($setting, $field, $value)
{
$forms = self::get_forms();
$options = array_map(function ($form) use ($value) {
$options = array_merge(['<option value=""></option>'], array_map(function ($form) use ($value) {
$selected = $form->id == $value ? 'selected' : '';
return "<option value='{$form->id}' {$selected}>{$form->title}</option>";
}, $forms);
}, $forms));
return "<select name='{$setting}[{$field}]'>" . implode('', $options) . '</select>';
}
}
......@@ -2,7 +2,7 @@
namespace WPCT_ERP_FORMS\WPCF7;
use WPCT_ERP_FORMS\Abstract\Integration as BaseIntegration;
use WPCT_ERP_FORMS\Integration as BaseIntegration;
class Integration extends BaseIntegration
{
......@@ -13,22 +13,6 @@ class Integration extends BaseIntegration
add_filter('wpcf7_before_send_mail', function ($form, &$abort, $submission) {
$this->do_submission($submission, $form);
}, 10, 3);
// add_action('wpcf7_save_contact_form', function ($form, $args, $context) {
// $field = array_filter($form->scan_form_tags(), function ($tag) {
// $field = $this->serialize_field($tag, null);
// return $field['name'] === 'erp_form_ref';
// });
// if (sizeof($field) === 0) {
// return;
// } else {
// $field = $field[0];
// $ref = $field->get_option('default')[0];
// }
// do_action('wpct_erp_forms_ref', ['form_id' => $form->id(), 'ref' => $ref]);
// }, 10, 3);
}
public function init()
......
......@@ -34,7 +34,6 @@ require_once 'wpct-i18n/wpct-i18n.php';
require_once 'includes/class-integration.php';
require_once 'includes/class-menu.php';
require_once 'includes/class-settings.php';
require_once 'includes/class-rest-controller.php';
class Wpct_Erp_Forms extends BasePlugin
{
......@@ -68,12 +67,13 @@ class Wpct_Erp_Forms extends BasePlugin
array_unshift($links, $link);
return $links;
}, 5, 2);
new REST_Controller();
}
public function init()
{
add_filter('option_wpct-http-bridge_general', function () {
return Settings::get_setting('wpct-erp-forms', 'general');
});
}
public static function activate()
......
Subproject commit 427059d1c82c9506b9471f63c1c5700be7ceb653
Subproject commit f625b3c83f952ff5e2d7c9d10453bab2bed146e3
Subproject commit b4cfb8c2641380f160f5f147f5b6167a4d2fcba3
Subproject commit dfda2d8fc482fc8c8ccbd6e44f77578edd11d88b
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment