Skip to content

Commit

Permalink
Working Dynamic Shopify Data Source Block Registration
Browse files Browse the repository at this point in the history
  • Loading branch information
jblz committed Sep 2, 2024
1 parent fa0088e commit 3206064
Show file tree
Hide file tree
Showing 9 changed files with 87 additions and 63 deletions.
4 changes: 2 additions & 2 deletions example/shopify/register.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
namespace RemoteDataBlocks\Example\Shopify;

use RemoteDataBlocks\Config\ShopifyDatasource;
use RemoteDataBlocks\Config\ShopifyGetProductQuery;
use RemoteDataBlocks\Config\ShopifySearchProductsQuery;
use RemoteDataBlocks\Editor\ConfigurationLoader;
use RemoteDataBlocks\Logging\LoggerManager;
use function add_action;

require_once __DIR__ . '/inc/interactivity-store/interactivity-store.php';
require_once __DIR__ . '/inc/queries/class-shopify-add-to-cart-mutation.php';
require_once __DIR__ . '/inc/queries/class-shopify-create-cart-mutation.php';
require_once __DIR__ . '/inc/queries/class-shopify-get-product-query.php';
require_once __DIR__ . '/inc/queries/class-shopify-remove-from-cart-mutation.php';
require_once __DIR__ . '/inc/queries/class-shopify-search-products-query.php';

function register_shopify_block() {
$block_name = 'Shopify Product';
Expand Down
2 changes: 2 additions & 0 deletions inc/config/airtable-datasource/airtable-datasource.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
use RemoteDataBlocks\Config\HttpDatasource;

class AirtableDatasource extends HttpDatasource {
use DynamicDatasource;

private $tables;

public function __construct( private string $access_token, private string $base, mixed $tables ) {
Expand Down
24 changes: 24 additions & 0 deletions inc/config/dynamic-datasource-trait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace RemoteDataBlocks\Config;

trait DynamicDatasource {
private string $slug;
private string $uuid;

public function set_slug( string $slug ): void {
$this->slug = $slug;
}

public function get_slug(): string {
return $this->slug;
}

public function set_uuid( string $uuid ): void {
$this->uuid = $uuid;
}

public function get_uuid(): string {
return $this->uuid;
}
}
31 changes: 31 additions & 0 deletions inc/config/shopify-datasource/class-shopify-datasource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace RemoteDataBlocks\Config;

use RemoteDataBlocks\Config\HttpDatasource;
use function plugins_url;

class ShopifyDatasource extends HttpDatasource {
use DynamicDatasource;

public function __construct( private string $access_token, private string $store_name ) {}

public function get_store_name(): string {
return $this->store_name;
}

public function get_endpoint(): string {
return 'https://' . $this->store_name . '.myshopify.com/api/2024-04/graphql.json';
}

public function get_request_headers(): array {
return [
'Content-Type' => 'application/json',
'X-Shopify-Storefront-Access-Token' => $this->access_token,
];
}

public function get_image_url(): string {
return plugins_url( '../../assets/shopify_logo_black.png', __FILE__ );
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
<?php

namespace RemoteDataBlocks\Example\Shopify;

use RemoteDataBlocks\Config\GraphqlQueryContext;
namespace RemoteDataBlocks\Config;

class ShopifyGetProductQuery extends GraphqlQueryContext {
public array $input_variables = [
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
<?php

namespace RemoteDataBlocks\Example\Shopify;

use RemoteDataBlocks\Config\GraphqlQueryContext;
namespace RemoteDataBlocks\Config;

class ShopifySearchProductsQuery extends GraphqlQueryContext {
public array $input_variables = [
Expand Down
26 changes: 3 additions & 23 deletions inc/config/shopify-datasource/shopify-datasource.php
Original file line number Diff line number Diff line change
@@ -1,25 +1,5 @@
<?php

namespace RemoteDataBlocks\Config;

use RemoteDataBlocks\Config\HttpDatasource;
use function plugins_url;

class ShopifyDatasource extends HttpDatasource {
public function __construct( private string $access_token, private string $store_name ) {}

public function get_endpoint(): string {
return 'https://' . $this->store_name . '.myshopify.com/api/2024-04/graphql.json';
}

public function get_request_headers(): array {
return [
'Content-Type' => 'application/json',
'X-Shopify-Storefront-Access-Token' => $this->access_token,
];
}

public function get_image_url(): string {
return plugins_url( '../../assets/shopify_logo_black.png', __FILE__ );
}
}
require_once __DIR__ . '/class-shopify-datasource.php';
require_once __DIR__ . '/class-shopify-get-product-query.php';
require_once __DIR__ . '/class-shopify-search-products-query.php';
52 changes: 20 additions & 32 deletions inc/editor/configuration-loader/configuration-loader.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@
defined( 'ABSPATH' ) || exit();

use Error;
use RemoteDataBlocks\Config\AirtableDatasource;
use RemoteDataBlocks\Config\HttpDatasourceConfig;
use RemoteDataBlocks\Config\QueryContext;
use RemoteDataBlocks\Config\ShopifyDatasource;
use RemoteDataBlocks\Config\ShopifyGetProductQuery;
use RemoteDataBlocks\Config\ShopifySearchProductsQuery;
use RemoteDataBlocks\Logging\Logger;
use RemoteDataBlocks\Logging\LoggerManager;
use RemoteDataBlocks\REST\DatasourceCRUD;
use WP_Error;

use function add_action;
use function do_action;
Expand Down Expand Up @@ -253,43 +252,32 @@ public static function unregister_all(): void {
self::$configurations = [];
}

// TODO: Move everything below to its own class maybe...?
private static function register_blocks_for_dynamic_data_sources(): void {
$data_sources_from_config = DatasourceCRUD::get_data_sources();

private static function get_datasource_from_config( object $source ): HttpDatasourceConfig|WP_Error {
try {
switch ( $source->service ) {
case 'airtable':
return new AirtableDatasource( $source->token, $source->base?->id, $source->table?->id );
foreach ( $data_sources_from_config as $_source ) {
switch ( $_source->service ) {
case 'shopify':
return new ShopifyDatasource( $source->token, $source->store );
$datasource = new ShopifyDatasource( $_source->token, $_source->store );
$datasource->set_uuid( $_source->uuid );
$datasource->set_slug( $_source->slug );
self::register_blocks_for_shopify_data_source( $datasource );
break;
default:
return new WP_Error( 'unsupported_data_source', __( 'Unsupported data source.', 'remote-data-blocks' ), $source );
break;
}
} catch ( Error $e ) {
return new WP_Error( 'invalid_data_source', $e->getMessage(), $source );
}
}

private static function register_blocks_for_dynamic_data_sources(): void {
$data_sources_from_config = DatasourceCRUD::get_data_sources();

foreach ( $data_sources_from_config as $_source ) {
$datasource = self::get_datasource_from_config( $_source );
if ( $datasource instanceof WP_Error ) {
self::$logger->error( $datasource->get_error_message() );
continue;
}
private static function register_blocks_for_shopify_data_source( ShopifyDatasource $datasource ): void {
$block_name = 'Shopify ' . $datasource->get_store_name();

// TODO: Store these as settings and iteratively call these against each config:
$block_name = 'RDB ' . $_source->service . ' ' . $_source->slug; // TODO: more friendly name
$query_context = new QueryContext( $datasource );
$shopify_get_product_query = new ShopifyGetProductQuery( $datasource );
self::register_block( $block_name, $shopify_get_product_query );
self::$logger->debug( sprintf( 'Registered "%s" block for dynamic data source - %s', $block_name, $datasource->get_slug() ) );

self::register_block( $block_name, $query_context );

self::$logger->debug( sprintf( 'Registered "%s" block for dynamic data source: %s', $block_name, $_source->uuid ) );
// self::register_list_query( $block_name, $query_context );
// self::register_loop_block( $block_name . ' List', $query_context );
// self::register_page( $block_name, '...' );
}
$shopify_search_products_query = new ShopifySearchProductsQuery( $datasource );
self::register_search_query( $block_name, $shopify_search_products_query );
self::$logger->debug( sprintf( 'Registered "%s" _search query_ block for dynamic data source - %s', $block_name, $datasource->get_slug() ) );
}
}
3 changes: 3 additions & 0 deletions remote-data-blocks.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
require_once __DIR__ . '/inc/autoloader.php';
require_once __DIR__ . '/vendor/autoload.php';

// TODO: Figure out autoloader for this:
require_once __DIR__ . '/inc/config/dynamic-datasource-trait.php';

// Other editor modifications
Editor\AdminNotices::init();
Editor\BlockBindings::init();
Expand Down

0 comments on commit 3206064

Please sign in to comment.