StatusRecurringSubscriptionAction   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 35
dl 0
loc 75
rs 10
c 0
b 0
f 0
wmc 11

4 Methods

Rating   Name   Duplication   Size   Complexity  
A supports() 0 5 2
A __construct() 0 6 1
A applyStateMachineTransition() 0 9 2
B execute() 0 38 6
1
<?php
2
3
/*
4
 * This file has been created by developers from BitBag.
5
 * Feel free to contact us once you face any issues or want to start
6
 * You can find more information about us on https://bitbag.io and write us
7
 * an email on [email protected].
8
 */
9
10
declare(strict_types=1);
11
12
namespace BitBag\SyliusMolliePlugin\Action\StateMachine;
13
14
use BitBag\SyliusMolliePlugin\Action\Api\BaseApiAwareAction;
15
use BitBag\SyliusMolliePlugin\Entity\SubscriptionInterface;
16
use BitBag\SyliusMolliePlugin\Request\Api\CancelRecurringSubscription;
17
use BitBag\SyliusMolliePlugin\Request\StateMachine\StatusRecurringSubscription;
18
use BitBag\SyliusMolliePlugin\Transitions\SubscriptionTransitions;
19
use Doctrine\ORM\EntityManagerInterface;
20
use Mollie\Api\Resources\Customer;
21
use Mollie\Api\Resources\Subscription;
22
use Mollie\Api\Types\SubscriptionStatus;
23
use Payum\Core\Action\ActionInterface;
24
use Payum\Core\ApiAwareInterface;
25
use Payum\Core\Exception\RequestNotSupportedException;
26
use SM\Factory\FactoryInterface;
27
28
final class StatusRecurringSubscriptionAction extends BaseApiAwareAction implements ActionInterface, ApiAwareInterface
29
{
30
    /** @var EntityManagerInterface */
31
    private $subscriptionManager;
32
33
    /** @var FactoryInterface */
34
    private $subscriptionSateMachineFactory;
35
36
    public function __construct(
37
        EntityManagerInterface $subscriptionManager,
38
        FactoryInterface $subscriptionSateMachineFactory
39
    ) {
40
        $this->subscriptionManager = $subscriptionManager;
41
        $this->subscriptionSateMachineFactory = $subscriptionSateMachineFactory;
42
    }
43
44
    /** @param CancelRecurringSubscription $request */
45
    public function execute($request): void
46
    {
47
        RequestNotSupportedException::assertSupports($this, $request);
48
49
        /** @var SubscriptionInterface $subscription */
50
        $subscription = $request->getModel();
51
52
        /** @var Customer $customer */
53
        $customer = $this->mollieApiClient->customers->get($subscription->getCustomerId());
54
55
        /** @var Subscription $subscriptionApiResult */
56
        $subscriptionApiResult = $customer->getSubscription($subscription->getSubscriptionId());
57
58
        switch ($subscriptionApiResult->status) {
59
            case SubscriptionStatus::STATUS_ACTIVE:
60
                $this->applyStateMachineTransition($subscription, SubscriptionTransitions::TRANSITION_ACTIVATE);
61
62
                break;
63
            case SubscriptionStatus::STATUS_PENDING:
64
                $this->applyStateMachineTransition($subscription, SubscriptionTransitions::TRANSITION_PROCESS);
65
66
                break;
67
            case SubscriptionStatus::STATUS_CANCELED:
68
                $this->applyStateMachineTransition($subscription, SubscriptionTransitions::TRANSITION_CANCEL);
69
70
                break;
71
            case SubscriptionStatus::STATUS_COMPLETED:
72
                $this->applyStateMachineTransition($subscription, SubscriptionTransitions::TRANSITION_COMPLETE);
73
74
                break;
75
            case SubscriptionStatus::STATUS_SUSPENDED:
76
                $this->applyStateMachineTransition($subscription, SubscriptionTransitions::TRANSITION_SUSPEND);
77
78
                break;
79
            default:
80
                $this->applyStateMachineTransition($subscription, SubscriptionTransitions::TRANSITION_FAIL);
81
82
                break;
83
        }
84
    }
85
86
    public function supports($request): bool
87
    {
88
        return
89
            $request instanceof StatusRecurringSubscription &&
90
            $request->getModel() instanceof SubscriptionInterface
91
        ;
92
    }
93
94
    private function applyStateMachineTransition(SubscriptionInterface $subscription, string $transitions): void
95
    {
96
        $stateMachine = $this->subscriptionSateMachineFactory->get($subscription, SubscriptionTransitions::GRAPH);
97
98
        if (!$stateMachine->can($transitions)) {
99
            return;
100
        }
101
102
        $stateMachine->apply($transitions);
103
    }
104
}
105