Completed
Push — develop ( 76527a...6d8075 )
by Nate
03:43
created

Contacts::syncUp()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 54

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
dl 0
loc 54
ccs 0
cts 33
cp 0
rs 9.0036
c 0
b 0
f 0
cc 4
nc 4
nop 4
crap 20

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * @copyright  Copyright (c) Flipbox Digital Limited
5
 * @license    https://flipboxfactory.com/software/hubspot/license
6
 * @link       https://www.flipboxfactory.com/software/hubspot/
7
 */
8
9
namespace flipbox\hubspot\services\resources;
10
11
use craft\base\Element;
12
use craft\base\ElementInterface;
13
use craft\helpers\ArrayHelper;
14
use craft\helpers\Json;
15
use flipbox\hubspot\builders\ContactBuilder;
16
use flipbox\hubspot\builders\ObjectBuilderInterface;
17
use flipbox\hubspot\connections\ConnectionInterface;
18
use flipbox\hubspot\criteria\ContactCriteria;
19
use flipbox\hubspot\criteria\ObjectCriteriaInterface;
20
use flipbox\hubspot\fields\Objects;
21
use flipbox\hubspot\HubSpot;
22
use flipbox\hubspot\pipeline\Resource;
23
use flipbox\hubspot\pipeline\stages\ElementAssociationStage;
24
use flipbox\hubspot\transformers\collections\DynamicTransformerCollection;
25
use flipbox\hubspot\transformers\collections\TransformerCollectionInterface;
26
use flipbox\hubspot\transformers\DynamicModelSuccess;
27
use Flipbox\Relay\HubSpot\Builder\Resources\Contact\Create;
28
use Flipbox\Relay\HubSpot\Builder\Resources\Contact\Delete;
29
use Flipbox\Relay\HubSpot\Builder\Resources\Contact\ReadById;
30
use Flipbox\Relay\HubSpot\Builder\Resources\Contact\Update;
31
use Psr\SimpleCache\CacheInterface;
32
use yii\base\Component;
33
34
/**
35
 * @author Flipbox Factory <[email protected]>
36
 * @since 1.0.0
37
 */
38
class Contacts extends Component implements CRUDInterface
39
{
40
    use traits\SyncByElementTrait,
41
        traits\ReadObjectTrait,
42
        traits\UpsertObjectTrait,
43
        traits\DeleteObjectTrait;
44
45
    /**
46
     * The HubSpot Resource name
47
     */
48
    const HUBSPOT_RESOURCE = 'contacts';
49
50
    /**
51
     * @return array
52
     */
53
    public static function defaultTransformer()
54
    {
55
        return [
56
            'class' => DynamicTransformerCollection::class,
57
            'handle' => self::HUBSPOT_RESOURCE,
58
            'transformers' => [
59
                TransformerCollectionInterface::SUCCESS_KEY => [
60
                    'class' => DynamicModelSuccess::class,
61
                    'resource' => self::HUBSPOT_RESOURCE
62
                ]
63
            ]
64
        ];
65
    }
66
67
    /**
68
     * @param array $config
69
     * @return ObjectCriteriaInterface
70
     */
71
    public function getCriteria(array $config = []): ObjectCriteriaInterface
72
    {
73
        return new ContactCriteria($config);
74
    }
75
76
    /**
77
     * @param array $config
78
     * @return ObjectBuilderInterface
79
     */
80
    public function getBuilder(array $config = []): ObjectBuilderInterface
81
    {
82
        return new ContactBuilder($config);
83
    }
84
85
    /**
86
     * @inheritdoc
87
     */
88
    protected static function createRelayBuilderClass(): string
89
    {
90
        return Create::class;
91
    }
92
93
    /**
94
     * @inheritdoc
95
     */
96
    protected static function readRelayBuilderClass(): string
97
    {
98
        return ReadById::class;
99
    }
100
101
    /**
102
     * @inheritdoc
103
     */
104
    protected static function updateRelayBuilderClass(): string
105
    {
106
        return Update::class;
107
    }
108
109
    /**
110
     * @inheritdoc
111
     */
112
    protected static function deleteRelayBuilderClass(): string
113
    {
114
        return Delete::class;
115
    }
116
117
    /*******************************************
118
     * SYNC
119
     *******************************************/
120
121
    /**
122
     * @inheritdoc
123
     * @throws \yii\base\InvalidConfigException
124
     */
125
    public function syncUp(
126
        ElementInterface $element,
127
        Objects $field,
128
        ConnectionInterface $connection = null,
129
        CacheInterface $cache = null
130
    ): bool {
131
        /** @var Element $element */
132
        $httpResponse = $this->rawHttpUpsert(
133
            $this->transformElementPayload($element, $field),
134
            $this->transformElementId($element, $field),
1 ignored issue
show
Bug introduced by
It seems like $this->transformElementId($element, $field) targeting flipbox\hubspot\traits\T...t::transformElementId() can also be of type array; however, flipbox\hubspot\services...tTrait::rawHttpUpsert() does only seem to accept null|string, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
135
            $connection,
136
            $cache
137
        );
138
139
        if ($httpResponse->getStatusCode() === 409) {
140
            $data = Json::decodeIfJson(
141
                $httpResponse->getBody()->getContents()
142
            );
143
144
            $contactId = ArrayHelper::getValue($data, 'identityProfile.vid');
145
146
            if (!HubSpot::getInstance()->getObjectAssociations()->associateByIds(
147
                $contactId,
148
                $element->getId(),
149
                $field->id,
150
                $element->siteId
151
            )) {
152
                return false;
153
            }
154
155
            if ($field->syncToHubSpotOnMatch === true) {
156
                return $this->syncUp(
157
                    $element,
158
                    $field,
159
                    $connection,
160
                    $cache
161
                );
162
            }
163
164
            return true;
165
        }
166
167
        (new Resource(
168
            function () use ($httpResponse) {
169
                return $httpResponse;
170
            },
171
            null,
172
            HubSpot::getInstance()->getPsrLogger()
173
        ))->build()->pipe(
174
            new ElementAssociationStage($field)
175
        )(null, $element);
176
177
        return !$element->hasErrors();
178
    }
179
}
180