Completed
Push — master ( 39f807...391e9b )
by Vladimir
03:25
created

PulseBoard   A

Complexity

Total Complexity 23

Size/Duplication

Total Lines 404
Duplicated Lines 3.96 %

Coupling/Cohesion

Components 2
Dependencies 4

Importance

Changes 23
Bugs 1 Features 7
Metric Value
wmc 23
c 23
b 1
f 7
lcom 2
cbo 4
dl 16
loc 404
rs 10

17 Methods

Rating   Name   Duplication   Size   Complexity  
A getUrl() 0 4 1
A getId() 0 4 1
A getName() 0 4 1
A getDescription() 0 4 1
A getCreatedAt() 0 6 1
A getUpdatedAt() 0 6 1
A getColumns() 0 9 1
B createColumn() 0 25 6
A getGroups() 0 9 1
A createGroup() 0 11 1
A deleteGroup() 0 6 1
A getPulses() 0 15 2
A createPulse() 0 17 1
A pulseInjection() 7 7 1
A archiveBoard() 9 9 1
A createBoard() 0 14 1
A getBoards() 0 6 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
/**
4
 * This file contains the PulseBoard class
5
 *
6
 * @copyright 2015 Vladimir Jimenez
7
 * @license   https://github.com/allejo/PhpPulse/blob/master/LICENSE.md MIT
8
 */
9
10
namespace allejo\DaPulse;
11
12
use allejo\DaPulse\Exceptions\ArgumentMismatchException;
13
use allejo\DaPulse\Exceptions\InvalidArraySizeException;
14
use allejo\DaPulse\Objects\SubscribableObject;
15
16
/**
17
 * This class contains all of the respective functionality for working a board on DaPulse
18
 *
19
 * @api
20
 * @package allejo\DaPulse
21
 * @since   0.1.0
22
 */
23
class PulseBoard extends SubscribableObject
24
{
25
    /**
26
     * The suffix that is appended to the URL to access functionality for certain objects
27
     *
28
     * @internal
29
     */
30
    const API_PREFIX = "boards";
31
32
    // =================================================================================================================
33
    //   Instance Variables
34
    // =================================================================================================================
35
36
    /**
37
     * The resource's URL.
38
     *
39
     * @var string
40
     */
41
    protected $url;
42
43
    /**
44
     * The board's unique identifier.
45
     *
46
     * @var int
47
     */
48
    protected $id;
49
50
    /**
51
     * The board's name.
52
     *
53
     * @var string
54
     */
55
    protected $name;
56
57
    /**
58
     * The board's description.
59
     *
60
     * @var string
61
     */
62
    protected $description;
63
64
    /**
65
     * The board's visible columns.
66
     *
67
     * @var array
68
     */
69
    protected $columns;
70
71
    /**
72
     * Creation time.
73
     *
74
     * @var \DateTime
75
     */
76
    protected $created_at;
77
78
    /**
79
     * Last update time.
80
     *
81
     * @var \DateTime
82
     */
83
    protected $updated_at;
84
85
    // =================================================================================================================
86
    //   Getter functions
87
    // =================================================================================================================
88
89
    /**
90
     * The resource's URL.
91
     *
92
     * @api
93
     *
94
     * @since  0.1.0
95
     *
96
     * @return string
97
     */
98
    public function getUrl ()
99
    {
100
        return $this->url;
101
    }
102
103
    /**
104
     * The board's unique identifier.
105
     *
106
     * @api
107
     *
108
     * @since  0.1.0
109
     *
110
     * @return int
111
     */
112
    public function getId ()
113
    {
114
        return $this->id;
115
    }
116
117
    /**
118
     * The board's name.
119
     *
120
     * @api
121
     *
122
     * @since  0.1.0
123
     *
124
     * @return string
125
     */
126
    public function getName ()
127
    {
128
        return $this->name;
129
    }
130
131
    /**
132
     * The board's description.
133
     *
134
     * @api
135
     *
136
     * @since  0.1.0
137
     *
138
     * @return string
139
     */
140
    public function getDescription ()
141
    {
142
        return $this->description;
143
    }
144
145
    /**
146
     * Creation time.
147
     *
148
     * @api
149
     *
150
     * @since  0.1.0
151
     *
152
     * @return \DateTime
153
     */
154
    public function getCreatedAt ()
155
    {
156
        self::lazyLoad($this->created_at, '\DateTime');
157
158
        return $this->created_at;
159
    }
160
161
    /**
162
     * Last update time.
163
     *
164
     * @api
165
     *
166
     * @since  0.1.0
167
     *
168
     * @return \DateTime
169
     */
170
    public function getUpdatedAt ()
171
    {
172
        self::lazyLoad($this->updated_at, '\DateTime');
173
174
        return $this->updated_at;
175
    }
176
177
    // =================================================================================================================
178
    //   Columns functions
179
    // =================================================================================================================
180
181
    /**
182
     * The board's visible columns.
183
     *
184
     * @api
185
     *
186
     * @since  0.1.0
187
     *
188
     * @return PulseColumn[]
189
     */
190
    public function getColumns ()
191
    {
192
        self::lazyInject($this->columns, array(
193
            "board_id" => $this->getId()
194
        ));
195
        self::lazyArray($this->columns, "PulseColumn");
196
197
        return $this->columns;
198
    }
199
200
    /**
201
     * Create a new column for the current board.
202
     *
203
     * If you are creating a status column, use the constants available in the **PulseColumnColorValue** class to match
204
     * the colors. Keep in mind this array cannot have a key higher than 11 nor can it be an associative array. Here's
205
     * an example of how to match statuses with specific colors.
206
     *
207
     * ```php
208
     * $labels = array(
209
     *     PulseColumnColorValue::Orange  => "Working on it",
210
     *     PulseColumnColorValue::L_Green => "Done",
211
     *     PulseColumnColorValue::Red     => "Delayed"
212
     * );
213
     * ```
214
     *
215
     * @api
216
     *
217
     * @param string $title  The title of the column. This title will automatically be "slugified" and become the ID
218
     *                       of the column.
219
     * @param string $type   The type of value that this column will use. Either use the available constants in the
220
     *                       PulseColumn class or use the following strings: "date", "person", "status", "text".
221
     * @param array  $labels If the column type will be "status," then this array will be the values for each of the
222
     *                       colors.
223
     *
224
     * @see   PulseColumn::Date   PulseColumn::Date
225
     * @see   PulseColumn::Person PulseColumn::Person
226
     * @see   PulseColumn::Status PulseColumn::Status
227
     * @see   PulseColumn::Text   PulseColumn::Text
228
     * @see   PulseColumnColorValue::Orange  PulseColumnColorValue::Orange
229
     * @see   PulseColumnColorValue::L_Green PulseColumnColorValue::L_Green
230
     * @see   PulseColumnColorValue::Red     PulseColumnColorValue::Red
231
     * @see   PulseColumnColorValue::Blue    PulseColumnColorValue::Blue
232
     * @see   PulseColumnColorValue::Purple  PulseColumnColorValue::Purple
233
     * @see   PulseColumnColorValue::Grey    PulseColumnColorValue::Grey
234
     * @see   PulseColumnColorValue::Green   PulseColumnColorValue::Green
235
     * @see   PulseColumnColorValue::L_Blue  PulseColumnColorValue::L_Blue
236
     * @see   PulseColumnColorValue::Gold    PulseColumnColorValue::Gold
237
     * @see   PulseColumnColorValue::Yellow  PulseColumnColorValue::Yellow
238
     * @see   PulseColumnColorValue::Black   PulseColumnColorValue::Black
239
     *
240
     * @since 0.1.0
241
     *
242
     * @throws ArgumentMismatchException Status definitions were defined yet the type of the column was not a status
243
     *                                   type column
244
     * @throws InvalidArraySizeException The array containing the value of statuses has a key larger than the
245
     *                                   supported 10 indices
246
     *
247
     * @return $this This instance will be updated to have updated information to reflect the new column that was
248
     *               created
249
     */
250
    public function createColumn ($title, $type, $labels = array())
251
    {
252
        if ($type !== PulseColumn::Status && !empty($labels))
253
        {
254
            throw new ArgumentMismatchException("No color definitions are required for a non-color column.");
255
        }
256
257
        if ($type === PulseColumn::Status && count($labels) > 0 && max(array_keys($labels)) > 10)
258
        {
259
            throw new InvalidArraySizeException("The range of status can only be from 0-10.");
260
        }
261
262
        $url        = sprintf("%s/%d/columns.json", self::apiEndpoint(), $this->getId());
263
        $postParams = array(
264
            "title" => $title,
265
            "type"  => $type
266
        );
267
268
        self::setIfNotNullOrEmpty($postParams, "labels", $labels);
0 ignored issues
show
Documentation introduced by
$labels is of type array, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
269
270
        $this->jsonResponse = self::sendPost($url, $postParams);
0 ignored issues
show
Documentation Bug introduced by
It seems like self::sendPost($url, $postParams) of type * is incompatible with the declared type array of property $jsonResponse.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
271
        $this->assignResults();
272
273
        return $this;
274
    }
275
276
    // =================================================================================================================
277
    //   Group functions
278
    // =================================================================================================================
279
280
    /**
281
     * Get all of the groups belonging to a board.
282
     *
283
     * A group is defined as the colorful headers that split up pulses into categories.
284
     *
285
     * @api
286
     *
287
     * @param bool $showArchived Set to true if you would like to get archived groups in a board as well
0 ignored issues
show
Documentation introduced by
Should the type for parameter $showArchived not be boolean|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
288
     *
289
     * @since 0.1.0
290
     *
291
     * @return PulseGroup[]
292
     */
293
    public function getGroups ($showArchived = NULL)
294
    {
295
        $url    = sprintf("%s/%d/groups.json", self::apiEndpoint(), $this->getId());
296
        $params = array();
297
298
        self::setIfNotNullOrEmpty($params, "show_archived", $showArchived);
0 ignored issues
show
Documentation introduced by
$showArchived is of type boolean|null, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
299
300
        return self::fetchJsonArrayToObjectArray($url, "PulseGroup", $params);
301
    }
302
303
    /**
304
     * Create a new group in a board
305
     *
306
     * @api
307
     *
308
     * @param  string $title The title of the board
309
     *
310
     * @since  0.1.0
311
     *
312
     * @return PulseGroup
313
     */
314
    public function createGroup ($title)
315
    {
316
        $url        = sprintf("%s/%s/groups.json", self::apiEndpoint(), $this->getId());
317
        $postParams = array("title" => $title);
318
319
        // The API doesn't return the board ID, so since we have access to it here: set it manually
320
        $groupResult             = self::sendPost($url, $postParams);
321
        $groupResult["board_id"] = $this->getId();
322
323
        return (new PulseGroup($groupResult));
324
    }
325
326
    /**
327
     * Delete a group from a board
328
     *
329
     * @api
330
     *
331
     * @param string $groupId The group ID to be deleted
332
     *
333
     * @since 0.1.0
334
     */
335
    public function deleteGroup ($groupId)
336
    {
337
        $url = sprintf("%s/%d/groups/%s.json", self::apiEndpoint(), $this->getId(), $groupId);
338
339
        self::sendDelete($url);
340
    }
341
342
    // =================================================================================================================
343
    //   Pulse functions
344
    // =================================================================================================================
345
346
    /**
347
     * @return Pulse[]
348
     */
349
    public function getPulses ()
350
    {
351
        $url    = sprintf("%s/%d/pulses.json", self::apiEndpoint(), $this->getId());
352
        $data   = self::sendGet($url);
353
        $pulses = array();
354
355
        foreach ($data as $entry)
356
        {
357
            $this->pulseInjection($entry);
358
359
            $pulses[] = new Pulse($entry["pulse"]);
360
        }
361
362
        return $pulses;
363
    }
364
365
    public function createPulse ($name, $owner, $groupId = NULL)
366
    {
367
        $url        = sprintf("%s/%d/pulses.json", self::apiEndpoint(), $this->getId());
368
        $postParams = array(
369
            "user_id" => $owner,
370
            "pulse"   => array(
371
                "name" => $name
372
            )
373
        );
374
375
        self::setIfNotNullOrEmpty($postParams, "group_id", $groupId);
376
377
        $result = self::sendPost($url, $postParams);
378
        $this->pulseInjection($result);
379
380
        return (new Pulse($result["pulse"]));
381
    }
382
383 View Code Duplication
    private function pulseInjection (&$result)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
384
    {
385
        // Inject some information so a Pulse object can survive on its own
386
        $result["pulse"]["group_id"]          = $result["board_meta"]["group_id"];
387
        $result["pulse"]["column_structure"]  = $this->getColumns();
388
        $result["pulse"]["raw_column_values"] = $result["column_values"];
389
    }
390
391
    // =================================================================================================================
392
    //   Board functions
393
    // =================================================================================================================
394
395 View Code Duplication
    public function archiveBoard ()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
396
    {
397
        $this->checkInvalid();
398
399
        $url = sprintf("%s/%s.json", self::apiEndpoint(), $this->getId());
400
        self::sendDelete($url);
401
402
        $this->deletedObject = true;
403
    }
404
405
    public static function createBoard ($name, $userId, $description = NULL)
406
    {
407
        $url        = sprintf("%s.json", self::apiEndpoint());
408
        $postParams = array(
409
            "user_id" => $userId,
410
            "name"    => $name
411
        );
412
413
        self::setIfNotNullOrEmpty($postParams, "description", $description);
414
415
        $boardResult = self::sendPost($url, $postParams);
416
417
        return (new PulseBoard($boardResult));
418
    }
419
420
    public static function getBoards ($params = array())
421
    {
422
        $url = sprintf("%s.json", self::apiEndpoint());
423
424
        return self::fetchJsonArrayToObjectArray($url, "PulseBoard", $params);
425
    }
426
}