Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: add API for gateway webhook events #7664

Open
wants to merge 31 commits into
base: develop
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
a7b87c0
feature: add WebhookEvents api
glaubersilva Dec 27, 2024
3e43409
feature: add service provider
glaubersilva Jan 2, 2025
1d4ed35
feature: add subscription events
glaubersilva Jan 2, 2025
5bd3a0a
refactor: remove parameter
glaubersilva Jan 2, 2025
ac58b07
refactor: move setGateway logic to constructor
glaubersilva Jan 2, 2025
be0c8af
refactor: remove status parameters
glaubersilva Jan 2, 2025
b818166
refactor: move register logic to give_init hook
glaubersilva Jan 2, 2025
5a75b35
refactor: extract status logic to action classes
glaubersilva Jan 2, 2025
911936d
refactor: remove unused value object
glaubersilva Jan 2, 2025
13a759d
refactor: better naming
glaubersilva Jan 2, 2025
a3bd5c3
refactor: use sprintf
glaubersilva Jan 2, 2025
de63d93
tests: add tests for the new classes
glaubersilva Jan 3, 2025
c8100d6
refactor: deprecated subscription statuses
glaubersilva Jan 3, 2025
9005cc4
refactor: instantiate the webhook events object
glaubersilva Jan 3, 2025
b51c389
feature: add missing event handler classes for subscription statuses
glaubersilva Jan 3, 2025
1899c09
refactor: change parameter type
glaubersilva Jan 3, 2025
44856df
tests: add new tests for new event handler classes
glaubersilva Jan 3, 2025
160b685
Merge branch 'develop' into fun/gateway-webhook-events-api
glaubersilva Jan 10, 2025
d7e57e1
chore: update composer.lock
glaubersilva Jan 10, 2025
374e0bd
refactor: add new methods for each status and tweak unit tests
glaubersilva Jan 24, 2025
19f03ca
tests: move logic used only on tests and create new tests for the new…
glaubersilva Jan 24, 2025
9d619c0
tests: simplify logic
glaubersilva Jan 24, 2025
e006205
refactor: rename methods related to subscription donations
glaubersilva Jan 24, 2025
aac3de3
feature: add new methods and contract for webhook notifications
glaubersilva Jan 24, 2025
e894899
doc: update unreleased tag
glaubersilva Jan 24, 2025
aee1666
refactor: add $args parameter
glaubersilva Jan 24, 2025
a617c1a
tests: add WebhookTest class
glaubersilva Jan 24, 2025
c91ce8b
doc: tweak comment
glaubersilva Jan 24, 2025
fa2ffe0
refactor: add condition before register route
glaubersilva Jan 24, 2025
dfbf875
fix: wrong condition
glaubersilva Jan 24, 2025
e5d8dcb
refactor: tweak exception message
glaubersilva Jan 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
feature: add WebhookEvents api
  • Loading branch information
glaubersilva committed Dec 27, 2024
commit a7b87c09e899b4a020b0d6d95e8a7eff0f5032c0
19 changes: 19 additions & 0 deletions src/Framework/PaymentGateways/PaymentGateway.php
Original file line number Diff line number Diff line change
@@ -14,6 +14,7 @@
use Give\Framework\PaymentGateways\Routes\RouteSignature;
use Give\Framework\PaymentGateways\Traits\HandleHttpResponses;
use Give\Framework\PaymentGateways\Traits\HasRouteMethods;
use Give\Framework\PaymentGateways\Webhooks\WebhookEvents;
use Give\Framework\Support\ValueObjects\Money;
use Give\Log\Log;
use Give\Subscriptions\Models\Subscription;
@@ -43,6 +44,13 @@ abstract class PaymentGateway implements PaymentGatewayInterface,
public $subscriptionModule;

/**
* @unreleased
* @var WebhookEvents $webhookEvents
*/
public $webhookEvents;

/**
* @unreleased Set the webhookEvents property
* @since 2.20.0 Change first argument type to SubscriptionModule abstract class.
* @since 2.18.0
*
@@ -55,6 +63,17 @@ public function __construct(SubscriptionModule $subscriptionModule = null)
}

$this->subscriptionModule = $subscriptionModule;
$this->webhookEvents = new WebhookEvents($this);
}

/**
* @unreleased
*/
public static function webhookEvents(): WebhookEvents
{
$instance = new static();

return $instance->webhookEvents;
}

/**
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace Give\Framework\PaymentGateways\Webhooks\ValueObjects;

use ActionScheduler_Store;
use Give\Framework\Support\ValueObjects\Enum;

/**
* @unreleased
*
* @method static WebhookEventStatus COMPLETE()
* @method static WebhookEventStatus PENDING()
* @method static WebhookEventStatus RUNNING()
* @method static WebhookEventStatus FAILED()
* @method static WebhookEventStatus CANCELED()
* @method bool isComplete()
* @method bool isPending()
* @method bool isRunning()
* @method bool isFailed()
* @method bool isCanceled()
*/
class WebhookEventStatus extends Enum
{
const COMPLETE = ActionScheduler_Store::STATUS_COMPLETE;
const PENDING = ActionScheduler_Store::STATUS_PENDING;
const RUNNING = ActionScheduler_Store::STATUS_RUNNING;
const FAILED = ActionScheduler_Store::STATUS_FAILED;
const CANCELED = ActionScheduler_Store::STATUS_CANCELED;
}
130 changes: 130 additions & 0 deletions src/Framework/PaymentGateways/Webhooks/WebhookEvents.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
<?php

namespace Give\Framework\PaymentGateways\Webhooks;

use Give\Donations\ValueObjects\DonationStatus;
use Give\Framework\PaymentGateways\PaymentGateway;
use Give\Framework\Support\Facades\ActionScheduler\AsBackgroundJobs;
use Give\Subscriptions\ValueObjects\SubscriptionStatus;

/**
* @unreleased
*/
class WebhookEvents
{
/**
* @var PaymentGateway
*/
protected $gateway;

/**
* @unreleased
*/
public function __construct(PaymentGateway $gateway)
{
$this->gateway = $gateway;
}

/**
* @unreleased
*
* @return int The webhook event ID. Zero if there was an error setting the event.
*/
public function setDonationStatus(
DonationStatus $status,
string $gatewayTransactionId,
string $message = '',
$skipRecurringDonations = false
): int {
$hook = "givewp_{$this->gateway::id()}_webhook_event_donation_{$status->getValue()}";
$args = [$gatewayTransactionId, $message, $skipRecurringDonations];
$group = $this->getGroup();

return AsBackgroundJobs::enqueueAsyncAction($hook, $args, $group);
}

/**
* @unreleased
*
* @return int The webhook event ID. Zero if there was an error setting the event.
*/
public function setSubscriptionStatus(
SubscriptionStatus $status,
string $gatewaySubscriptionId,
string $message = '',
bool $initialDonationShouldBeCompleted = false
): int {
$hook = "givewp_{$this->gateway::id()}_webhook_event_subscription_{$status->getValue()}";
$args = [$gatewaySubscriptionId, $message, $initialDonationShouldBeCompleted];
$group = $this->getGroup();

return AsBackgroundJobs::enqueueAsyncAction($hook, $args, $group);
}

/**
* @unreleased
*
* @return int The webhook event ID. Zero if there was an error setting the event.
*/
public function setSubscriptionFirstDonation(
string $gatewayTransactionId,
string $message = '',
bool $setSubscriptionActive = true
): int {
$hook = "givewp_{$this->gateway::id()}_webhook_event_subscription_first_donation";
$args = [$gatewayTransactionId, $message, $setSubscriptionActive];
$group = $this->getGroup();

return AsBackgroundJobs::enqueueAsyncAction($hook, $args, $group);
}

/**
* @unreleased
*
* @return int The webhook event ID. Zero if there was an error setting the event.
*/
public function setSubscriptionRenewalDonation(
string $gatewaySubscriptionId,
string $gatewayTransactionId,
string $message = ''
): int {
$hook = "givewp_{$this->gateway::id()}_webhook_event_subscription_renewal_donation";
$args = [$gatewaySubscriptionId, $gatewayTransactionId, $message];
$group = $this->getGroup();

return AsBackgroundJobs::enqueueAsyncAction($hook, $args, $group);
}

/**
* @unreleased
*
* @param string $returnFormat OBJECT, ARRAY_A, or ids.
* @param string $status ActionScheduler_Store::STATUS_COMPLETE, ActionScheduler_Store::STATUS_PENDING, ActionScheduler_Store::STATUS_RUNNING, ActionScheduler_Store::STATUS_FAILED, ActionScheduler_Store::STATUS_CANCELED
*
* @return array
*/
public function getAll(string $returnFormat = OBJECT, string $status = ''): array
{
return AsBackgroundJobs::getActionsByGroup($this->getGroup(), $status);
}

/**
* @unreleased
*
* @param string $status ActionScheduler_Store::STATUS_COMPLETE, ActionScheduler_Store::STATUS_PENDING, ActionScheduler_Store::STATUS_RUNNING, ActionScheduler_Store::STATUS_FAILED, ActionScheduler_Store::STATUS_CANCELED
*
* @return int Total deleted webhook events.
*/
public function deleteAll(string $status = ''): int
{
return AsBackgroundJobs::deleteActionsByGroup($this->getGroup(), $status);
}

/**
* @unreleased
*/
private function getGroup(): string
{
return 'give-' . $this->gateway::id();
}
}
Loading