eoneopay/webhooks

This package is abandoned and no longer maintained. The author suggests using the eonx-com/webhooks package instead.

Package to allow payloads to be sent based on event triggers


README

This library adds support for creating Activities which are then fired as webhooks to subscribers of those activities.

Installation

Use Composer to install the package in your project:

composer require eoneopay/webhooks

Usage

Inject the \EoneoPay\Webhooks\Activities\Interface\ActivityFactoryInterface service into your application where an activity needs to be created. The send method on this interface accepts an ActivityDataInterface implementation that represents a specific activity to be created.

For each of the different activities you will fire inside your application you will need to create a class that implements ActivityDataInterface.

Theory of Operation

  • ActivityFactoryInterface receives an instance of ActivityDataInterface
    • The factory will then call the PayloadManager to build the payload for the ActivityDataInterface
    • The factory will take the payload and the ActivityDataInterface and save it as a new ActivityInterface entity.
    • Finally, the factory will dispatch an ActivityCreatedEvent
  • The listeners will receive the event inside an asynchronous queue worker and call WebhookManager#processActivity
    • The WebhookManager will resolve any subscriptions for the activity
    • Then it will create a new WebhookRequest for each subscription
    • And dispatch a new WebhookRequestCreatedEvent.
  • Another listener will accept this event and call RequestProcessor#process
    • Which builds a PSR7 Request
    • Sends the request
    • Records the result as a WebhookResponse

Integration

Laravel

To integrate the package into your Laravel or Lumen you need to register the following service providers:

\EoneoPay\Webhooks\Bridge\Laravel\Providers\WebhookServiceProvider
\EoneoPay\Webhooks\Bridge\Laravel\Providers\WebhookEventServiceProvider

Any implementation of this library will need to:

  • Implement and bind a service for the interface EoneoPay\Webhooks\Subscription\Interfaces\SubscriptionResolverInterface
  • Implement a service for the interface EoneoPay\Webhooks\Payload\Interfaces\PayloadBuilderInterface
    • example
    interface WebHookPayloadBuilderInterface extends PayloadBuilderInterface
    { ... }
    
    final class PayloadBuilder implements WebHookPayloadBuilderInterface
    { ... }
    
    • bind and tag the service for the interface YourNamespace\WebHookPayloadBuilderInterface
    $this->app->bind(WebHookPayloadBuilderInterface::class, PayloadBuilder::class);
    $this->app->tag([WebHookPayloadBuilderInterface::class], ['webhooks_payload_builders']);
    
  • Add EoneoPay\Externals\Bridge\Laravel\ORM\ResolveTargetEntityExtension to config/doctrine.php under the extensions key
  • Modify config/doctrine.php to add the following changes to the configuration:
<?php
declare(strict_types=1);

use EoneoPay\Externals\Bridge\LaravelDoctrine\Extensions\ResolveTargetEntityExtension;
use EoneoPay\Webhooks\Models\ActivityInterface;
use EoneoPay\Webhooks\Models\WebhookRequestInterface;
use EoneoPay\Webhooks\Models\WebhookResponseInterface;
use EoneoPay\Webhooks\Bridge\Doctrine\Entities\Activity;
use EoneoPay\Webhooks\Bridge\Doctrine\Entities\Lifecycle\Request;
use EoneoPay\Webhooks\Bridge\Doctrine\Entities\Lifecycle\Response;

return [
    'managers' => [
        'default' => [
            // ...
            'namespaces' => [
                // ...
                // Add the Webhooks Entities to the namespace mappings
                'Eoneopay\\Webhooks\\Bridge\\Doctrine\\Entities'
            ],
            'paths' => [
                // ...
                // Add the Webhooks filepath to the Entity Manager
                \base_path('vendor/eoneopay/webhooks/src/Bridge/Doctrine/Entities')
            ]
            // ...
        ]
    ],
    
    // ...
    
    'extensions' => [
        // ...
        // Add the ResolveTargetEntityExtension to Doctrine
        ResolveTargetEntityExtension::class
    ],
    
    // ...
    
    'replacements' => [
        // Add replacements so Doctrine can look up entities by interface
        ActivityInterface::class => Activity::class,
        WebhookRequestInterface::class => Request::class,
        WebhookResponseInterface::class => Response::class
    ]
];