From 4d7ea19c7f10a3f5c9d26c5e725728dd1750d069 Mon Sep 17 00:00:00 2001 From: Marek Isalski Date: Tue, 15 Mar 2016 21:56:18 +0100 Subject: [PATCH] refactor to have createupdate and delete methods --- fulcrm_webhook.module | 103 ++++++++++++++---- .../fulcrm_webhook_user.module | 16 ++- 2 files changed, 98 insertions(+), 21 deletions(-) diff --git a/fulcrm_webhook.module b/fulcrm_webhook.module index 24e61b1..869b70f 100644 --- a/fulcrm_webhook.module +++ b/fulcrm_webhook.module @@ -46,7 +46,9 @@ function fulcrm_webhook_get_pk_for_entity_type( $entity_type, $entity_id, $fulcr return $result->fetchField(); } -function fulcrm_webhook_find_entity( $data ) { +function fulcrm_webhook_createupdate_entity( $data ) { + $return = array( 'data' => $data ); + if ( array_key_exists( 'url', $data ) ) { $url = $data[ 'url' ]; $fulcrm_type = fulcrm_apiv2_url_to_type( $url ); @@ -59,14 +61,70 @@ function fulcrm_webhook_find_entity( $data ) { $result = $query->execute(); foreach ( $result as $row ) { - return entity_load( $row->entity_type, array( $row->entity_id ) ); + $return = array( 'data' => $data, 'entity' => entity_load( $row->entity_type, array( $row->entity_id ) ) ); + + foreach ( module_implements( 'update_entity_for_fulcrm_' . $fulcrm_type ) as $module ) { + $function = $module . '_' . 'update_entity_for_fulcrm_' . $fulcrm_type; + if ( function_exists( $function ) ) { + $function( $return ); + } + } + return $return; } - module_invoke_all( 'fulcrm_find_entity', $fulcrm_type, $fulcrm_pk ); + foreach ( module_implements( 'create_entity_for_fulcrm_' . $fulcrm_type ) as $module ) { + $function = $module . '_' . 'create_entity_for_fulcrm_' . $fulcrm_type; + if ( function_exists( $function ) ) { + $function( $return ); + + if ( array_key_exists( 'entity', $return ) ) { + db_insert( 'fulcrm_webhook_entity_mapping' )->fields( array( 'fulcrm_type' => $fulcrm_type, + 'fulcrm_pk' => $fulcrm_pk, + 'entity_type' => $return[ 'entity_type' ], + 'bundle' => array_key_exists( 'bundle', $return ) ? $return[ 'bundle' ] : $return[ 'entity_type' ], + 'entity_id' => $return[ 'entity_id' ], + ) )->execute(); + return $return; + } + } + } } + + return $return; } -function fulcrm_webhook_fulcrm_find_entity( $fulcrm_type, $fulcrm_pk ) { +function fulcrm_webhook_delete_entity( $data ) { + $return = array( 'data' => $data ); + + if ( array_key_exists( 'url', $data ) ) { + $url = $data[ 'url' ]; + $fulcrm_type = fulcrm_apiv2_url_to_type( $url ); + $fulcrm_pk = fulcrm_apiv2_url_to_pk( $url ); + + $query = db_select( 'fulcrm_webhook_entity_mapping', 'fwem' ) + ->fields( 'fwem', array( 'entity_type', 'entity_id' ) ) + ->condition( 'fulcrm_type', $fulcrm_type ) + ->condition( 'fulcrm_pk', $fulcrm_pk ); + + $result = $query->execute(); + foreach ( $result as $row ) { + $return[ 'entity' ] = entity_load( $row->entity_type, array( $row->entity_id ) ); + + foreach ( module_implements( 'delete_entity_for_fulcrm_' . $fulcrm_type ) as $module ) { + $function = $module . '_' . 'delete_entity_for_fulcrm_' . $fulcrm_type; + if ( function_exists( $function ) ) { + $function( $return ); + } + } + } + + db_delete( 'fulcrm_webhook_entity_mapping', 'fwem' ) + ->condition( 'fulcrm_type', $fulcrm_type ) + ->condition( 'fulcrm_pk', $fulcrm_pk ) + ->execute(); + } + + return $return; } function fulcrm_webhook_webhook( $uuid ) { @@ -77,7 +135,7 @@ function fulcrm_webhook_webhook( $uuid ) { $method = $_SERVER[ 'REQUEST_METHOD' ]; if ( array_key_exists( 'Content-Type', $headers ) && ( $headers[ 'Content-Type' ] === 'application/json' ) ) { - $payload = json_decode( file_get_contents( "php://input" ) ); + $payload = json_decode( file_get_contents( "php://input" ), $assoc = TRUE ); $payload_error = json_last_error(); $payload_error_msg = json_last_error_msg(); } @@ -87,32 +145,39 @@ function fulcrm_webhook_webhook( $uuid ) { if ( fulcrm_apiv2_prevent_loop( $headers ) ) { $op = null; - switch ( $method ) { - case 'GET': + if ( $method === 'GET' ) { drupal_json_output( array( "status" => "error", "info" => "GET requests do nothing; webhooks must POST, PATCH, PUT, or DELETE" ) ); - break; + return; + } + + if ( $payload === null ) { + drupal_json_output( array( 'status' => 'error', 'info' => $payload_error_msg ) ); + return; + } + + $return = null; + + switch ( $method ) { case 'DELETE': - $op = 'DELETE'; + $return = fulcrm_webhook_delete_entity( $payload ); break; case 'POST': - $op = 'CREATE'; - break; case 'PATCH': case 'PUT': - $op = 'UPDATE'; + $return = fulcrm_webhook_createupdate_entity( $payload ); break; default: drupal_json_output( array( 'status' => 'error', 'info' => 'unsupported method' ) ); break; } - if ( $op ) { - if ( $payload === null ) { - drupal_json_output( array( 'status' => 'error', 'info' => $payload_error_msg ) ); - } else { - // actually do something :) - drupal_json_output( array( 'status' => 'ok', 'headers' => $headers, 'method' => $method ) ); - } + if ( is_array( $return ) ) { + if ( array_key_exists( 'response', $return ) ) + drupal_json_output( array( 'status' => 'ok', 'response' => $return[ 'response' ] ) ); + else + drupal_json_output( array( 'status' => 'ok' ) ); + } else { + drupal_json_output( array( 'status' => 'error', 'info' => 'no return from internal methods' ) ); } } else { drupal_json_output( array( 'status' => 'ok', 'info' => 'loop prevention' ) ); diff --git a/fulcrm_webhook_user/fulcrm_webhook_user.module b/fulcrm_webhook_user/fulcrm_webhook_user.module index 111bf7e..83944aa 100644 --- a/fulcrm_webhook_user/fulcrm_webhook_user.module +++ b/fulcrm_webhook_user/fulcrm_webhook_user.module @@ -22,6 +22,18 @@ function fulcrm_webhook_menu() { return $items; } -function fulcrm_webhook_user_fulcrm_find_entity( $fulcrm_type, $fulcrm_pk ) { - +function fulcrm_webhook_create_entity_for_fulcrm_person( &$vars ) { + // $vars[ 'data' ]; + // $vars[ 'entity' ] = XXX; + // $vars[ 'entity_type' ] = 'user'; + // $vars[ 'entity_id' ] = XXX; +} + +function fulcrm_webhook_update_entity_for_fulcrm_person( &$vars ) { + // $vars[ 'data' ]; + // $vars[ 'entity' ]; +} + +function fulcrm_webhook_delete_entity_for_fulcrm_person( &$vars ) { + // $vars[ 'entity' ]; }