Completed
Push — master ( 95cc27...d32772 )
by Vladimir
05:08 queued 03:05
created

Pulse   B

Complexity

Total Complexity 38

Size/Duplication

Total Lines 679
Duplicated Lines 2.8 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 100%

Importance

Changes 5
Bugs 0 Features 0
Metric Value
wmc 38
c 5
b 0
f 0
lcom 1
cbo 5
dl 19
loc 679
ccs 89
cts 89
cp 1
rs 8.3999

25 Methods

Rating   Name   Duplication   Size   Complexity  
A pulseInjection() 9 9 1
A getTextColumn() 0 4 1
A getNotes() 0 6 1
A createUpdate() 0 4 1
A getPulses() 0 6 1
A initializeValues() 0 6 1
A getUrl() 0 6 1
A getName() 0 6 1
A getUpdatesCount() 0 6 1
A getBoardId() 0 6 1
A getCreatedAt() 0 7 1
A getUpdatedAt() 0 7 1
B getGroupId() 0 21 5
A editName() 0 10 1
A archivePulse() 0 10 1
A deletePulse() 10 10 1
A duplicatePulse() 0 18 2
A getStatusColumn() 0 4 1
A getDateColumn() 0 4 1
A getNumericColumn() 0 4 1
A getPersonColumn() 0 4 1
A getTimelineColumn() 0 4 1
B getColumn() 0 50 6
B addNote() 0 27 4
A getUpdates() 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
 * @copyright 2017 Vladimir Jimenez
5
 * @license   https://github.com/allejo/PhpPulse/blob/master/LICENSE.md MIT
6
 */
7
8
namespace allejo\DaPulse;
9
10
use allejo\DaPulse\Exceptions\ColumnNotFoundException;
11
use allejo\DaPulse\Exceptions\HttpException;
12
use allejo\DaPulse\Exceptions\InvalidColumnException;
13
use allejo\DaPulse\Exceptions\InvalidObjectException;
14
use allejo\DaPulse\Objects\PulseColumnDateValue;
15
use allejo\DaPulse\Objects\PulseColumnNumericValue;
16
use allejo\DaPulse\Objects\PulseColumnPersonValue;
17
use allejo\DaPulse\Objects\PulseColumnStatusValue;
18
use allejo\DaPulse\Objects\PulseColumnTextValue;
19
use allejo\DaPulse\Objects\PulseColumnTimelineValue;
20
use allejo\DaPulse\Objects\PulseColumnValue;
21
use allejo\DaPulse\Objects\SubscribableObject;
22
use allejo\DaPulse\Utilities\ArrayUtilities;
23
24
/**
25
 * A class representing a single pulse in a board
26
 *
27
 * @api
28
 * @package allejo\DaPulse
29
 * @since   0.1.0
30
 */
31
class Pulse extends SubscribableObject
32
{
33
    /**
34
     * @ignore
35
     */
36
    const API_PREFIX = "pulses";
37
38
    // ================================================================================================================
39
    //   Instance Variables
40
    // ================================================================================================================
41
42
    /**
43
     * The resource's URL.
44
     *
45
     * @var string
46
     */
47
    protected $url;
48
49
    /**
50
     * The pulse's name.
51
     *
52
     * @var string
53
     */
54
    protected $name;
55
56
    /**
57
     * The amount of updates a pulse has.
58
     *
59
     * @var int
60
     */
61
    protected $updates_count;
62
63
    /**
64
     * The ID of the parent board.
65
     *
66
     * @var int
67
     */
68
    protected $board_id;
69
70
    /**
71
     * Creation time.
72
     *
73
     * @var \DateTime
74
     */
75
    protected $created_at;
76
77
    /**
78
     * Last update time.
79
     *
80
     * @var \DateTime
81
     */
82
    protected $updated_at;
83
84
    /**
85
     * The ID of the group this pulse belongs to
86
     *
87
     * @var string
88
     */
89
    protected $group_id;
90
91
    /**
92
     * @var PulseColumn[]
93
     */
94
    protected $column_structure;
95
96
    /**
97
     * An array containing all of the values a pulse has for each column
98
     *
99
     * @var mixed
100
     */
101
    protected $raw_column_values;
102
103
    /**
104
     * An array containing objects extended from PulseColumnValue storing all of the values for each column
105
     *
106
     * @var array
107
     */
108
    protected $column_values;
109
110
    /**
111
     * The common URL path for retrieving objects relating a pulse such as subscribers, notes, or updates
112
     *
113
     * @var string
114
     */
115
    private $urlSyntax = "%s/%s/%s.json";
116
117
    // ================================================================================================================
118
    //   Overloaded functions
119
    // ================================================================================================================
120
121 96
    protected function initializeValues ()
122
    {
123 96
        $this->column_values     = [];
124 96
        $this->column_structure  = [];
125 96
        $this->raw_column_values = [];
126 96
    }
127
128
    // ================================================================================================================
129
    //   Getter functions
130
    // ================================================================================================================
131
132
    /**
133
     * The resource's URL.
134
     *
135
     * @api
136
     *
137
     * @since  0.1.0
138
     *
139
     * @return string
140
     */
141 1
    public function getUrl ()
142
    {
143 1
        $this->lazyLoad();
144
145 1
        return $this->url;
146
    }
147
148
    /**
149
     * The pulse's name.
150
     *
151
     * @api
152
     *
153
     * @since  0.1.0
154
     *
155
     * @return string
156
     */
157 4
    public function getName ()
158
    {
159 4
        $this->lazyLoad();
160
161 4
        return $this->name;
162
    }
163
164
    /**
165
     * The amount of updates a pulse has.
166
     *
167
     * @api
168
     *
169
     * @since  0.1.0
170
     *
171
     * @return int
172
     */
173 1
    public function getUpdatesCount ()
174
    {
175 1
        $this->lazyLoad();
176
177 1
        return $this->updates_count;
178
    }
179
180
    /**
181
     * The ID of the parent board.
182
     *
183
     * @api
184
     *
185
     * @since  0.1.0
186
     *
187
     * @return int
188
     */
189 41
    public function getBoardId ()
190
    {
191 41
        $this->lazyLoad();
192
193 41
        return $this->board_id;
194
    }
195
196
    /**
197
     * Creation time.
198
     *
199
     * @api
200
     *
201
     * @since  0.1.0
202
     *
203
     * @return \DateTime
204
     */
205 1
    public function getCreatedAt ()
206
    {
207 1
        $this->lazyLoad();
208 1
        self::lazyCast($this->created_at, '\DateTime');
209
210 1
        return $this->created_at;
211
    }
212
213
    /**
214
     * Last update time.
215
     *
216
     * @api
217
     *
218
     * @since  0.1.0
219
     *
220
     * @return \DateTime
221
     */
222 3
    public function getUpdatedAt ()
223
    {
224 3
        $this->lazyLoad();
225 3
        self::lazyCast($this->updated_at, '\DateTime');
226
227 3
        return $this->updated_at;
228
    }
229
230
    /**
231
     * Get the ID of the group this Pulse is a part of. If this value is not available, an API call will be made to
232
     * find the group ID via brute force.
233
     *
234
     * **Note** The group ID is cached if it is not available. To update the cached value, use $forceFetch to force an
235
     * API call to get a new value.
236
     *
237
     * **Warning** An API call is always slower than using the cached value.
238
     *
239
     * @api
240
     *
241
     * @param bool $forceFetch Force an API call to get an updated group ID if it has been changed
242
     *
243
     * @since 0.1.0
244
     *
245
     * @return string
246
     */
247 3
    public function getGroupId ($forceFetch = false)
248
    {
249 3
        $this->lazyLoad();
250
251 3
        if (empty($this->group_id) || $forceFetch)
252
        {
253 2
            $parentBoard = new PulseBoard($this->board_id, true);
254 2
            $pulses      = $parentBoard->getPulses();
255
256 2
            foreach ($pulses as $pulse)
257
            {
258 2
                if ($this->getId() === $pulse->getId())
259
                {
260 2
                    $this->group_id = $pulse->getGroupId();
261 2
                    break;
262
                }
263
            }
264
        }
265
266 3
        return $this->group_id;
267
    }
268
269
    // ================================================================================================================
270
    //   Pulse functions
271
    // ================================================================================================================
272
273
    /**
274
     * Edit the name of the pulse
275
     *
276
     * @api
277
     *
278
     * @param string $title
279
     *
280
     * @since 0.1.0
281
     */
282 1
    public function editName ($title)
283
    {
284 1
        $editUrl    = sprintf("%s/%d.json", self::apiEndpoint(), $this->getId());
285
        $postParams = [
286 1
            'name' => $title
287
        ];
288
289 1
        $this->jsonResponse = self::sendPut($editUrl, $postParams);
0 ignored issues
show
Documentation Bug introduced by
It seems like self::sendPut($editUrl, $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...
290 1
        $this->assignResults();
291 1
    }
292
293
    /**
294
     * Archive the current pulse
295
     *
296
     * This is the equivalent of a soft delete and can be restored from the DaPulse website.
297
     *
298
     * @api
299
     *
300
     * @since 0.1.0
301
     */
302 1
    public function archivePulse ()
303
    {
304 1
        $archiveURL = sprintf("%s/%d.json", self::apiEndpoint(), $this->getId());
305
        $getParams  = [
306
            'archive' => true
307 1
        ];
308
309 1
        $this->jsonResponse = self::sendDelete($archiveURL, $getParams);
0 ignored issues
show
Documentation Bug introduced by
It seems like self::sendDelete($archiveURL, $getParams) 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...
310 1
        $this->assignResults();
311 1
    }
312
313
    /**
314
     * Delete the current Pulse
315
     *
316
     * @api
317
     *
318
     * @since 0.1.0
319
     *
320
     * @throws InvalidObjectException
321
     */
322 1 View Code Duplication
    public function deletePulse ()
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...
323
    {
324 1
        $this->checkInvalid();
325
326 1
        $deleteURL          = sprintf("%s/%d.json", self::apiEndpoint(), $this->getId());
327 1
        $this->jsonResponse = self::sendDelete($deleteURL);
0 ignored issues
show
Documentation Bug introduced by
It seems like self::sendDelete($deleteURL) 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...
328 1
        $this->assignResults();
329
330 1
        $this->deletedObject = true;
331 1
    }
332
333
    public function duplicatePulse ($groupId = null, $ownerId = null)
334
    {
335
        $url        = sprintf("%s/%s/pulses/%s/duplicate.json", self::apiEndpoint("boards"), $this->getBoardId(), $this->getId());
336
        $postParams = [];
337
338
        if ($ownerId instanceof PulseUser)
339
        {
340
            $ownerId = $ownerId->getId();
341
        }
342
343
        self::setIfNotNullOrEmpty($postParams, "group_id", $groupId);
344
        self::setIfNotNullOrEmpty($postParams, "owner_id", $ownerId);
345
346
        $result = self::sendPost($url, $postParams);
347
        $this->pulseInjection($result);
348
349
        return (new Pulse($result['pulse']));
350
    }
351
352 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...
353
    {
354
        $parentBoard = new PulseBoard($this->getBoardId());
355
356
        // Inject some information so a Pulse object can survive on its own
357
        $result["pulse"]["group_id"]          = $result["board_meta"]["group_id"];
358
        $result["pulse"]["column_structure"]  = $parentBoard->getColumns();
359
        $result["pulse"]["raw_column_values"] = $result["column_values"];
360
    }
361
362
    // ================================================================================================================
363
    //   Column data functions
364
    // ================================================================================================================
365
366
    /**
367
     * Access a color type column value belonging to this pulse in order to read it or modify.
368
     *
369
     * This function should only be used to access color type values; an exception will be thrown otherwise.
370
     *
371
     * @api
372
     *
373
     * @param  string $columnId The ID of the column to access. This is typically a slugified version of the column name
374
     *
375
     * @since  0.1.0
376
     *
377
     * @throws ColumnNotFoundException The specified column ID does not exist for this Pulse
378
     * @throws InvalidColumnException  The specified column is not a "color" type column
379
     * @throws InvalidObjectException  The specified column exists but modification of its value is unsupported either
380
     *                                 by this library or the DaPulse API.
381
     *
382
     * @return PulseColumnStatusValue A column object with access to its contents
383
     */
384 6
    public function getStatusColumn ($columnId)
385
    {
386 6
        return $this->getColumn($columnId, PulseColumn::Status);
387
    }
388
389
    /**
390
     * Access a date type column value belonging to this pulse in order to read it or modify.
391
     *
392
     * This function should only be used to access data type values; an exception will be thrown otherwise.
393
     *
394
     * @api
395
     *
396
     * @param  string $columnId The ID of the column to access. This is typically a slugified version of the column name
397
     *
398
     * @since  0.1.0
399
     *
400
     * @throws ColumnNotFoundException The specified column ID does not exist for this Pulse
401
     * @throws InvalidColumnException  The specified column is not a "date" type column
402
     * @throws InvalidObjectException  The specified column exists but modification of its value is unsupported either
403
     *                                 by this library or the DaPulse API.
404
     *
405
     * @return PulseColumnDateValue A column object with access to its contents
406
     */
407 9
    public function getDateColumn ($columnId)
408
    {
409 9
        return $this->getColumn($columnId, PulseColumn::Date);
410
    }
411
412
    /**
413
     * Access a numeric type column value belonging to this pulse in order to read it or modify.
414
     *
415
     * This function should only be used to access data type values; an exception will be thrown otherwise.
416
     *
417
     * @api
418
     *
419
     * @param  string $columnId The ID of the column to access. This is typically a slugified version of the column name
420
     *
421
     * @since  0.2.0
422
     *
423
     * @throws ColumnNotFoundException The specified column ID does not exist for this Pulse
424
     * @throws InvalidColumnException  The specified column is not a "numeric" type column
425
     * @throws InvalidObjectException  The specified column exists but modification of its value is unsupported either
426
     *                                 by this library or the DaPulse API.
427
     *
428
     * @return PulseColumnNumericValue A column object with access to its contents
429
     */
430 7
    public function getNumericColumn ($columnId)
431
    {
432 7
        return $this->getColumn($columnId, PulseColumn::Numeric);
433
    }
434
435
    /**
436
     * Access a person type column value belonging to this pulse in order to read it or modify.
437
     *
438
     * This function should only be used to access person type values; an exception will be thrown otherwise.
439
     *
440
     * @api
441
     *
442
     * @param  string $columnId The ID of the column to access. This is typically a slugified version of the column name
443
     *
444
     * @since  0.1.0
445
     *
446
     * @throws ColumnNotFoundException The specified column ID does not exist for this Pulse
447
     * @throws InvalidColumnException  The specified column is not a "person" type column
448
     * @throws InvalidObjectException  The specified column exists but modification of its value is unsupported either
449
     *                                 by this library or the DaPulse API.
450
     *
451
     * @return PulseColumnPersonValue A column object with access to its contents
452
     */
453 9
    public function getPersonColumn ($columnId)
454
    {
455 9
        return $this->getColumn($columnId, PulseColumn::Person);
456
    }
457
458
    /**
459
     * Access a text type column value belonging to this pulse in order to read it or modify.
460
     *
461
     * This function should only be used to access text type values; an exception will be thrown otherwise.
462
     *
463
     * @api
464
     *
465
     * @param  string $columnId The ID of the column to access. This is typically a slugified version of the column name
466
     *
467
     * @since  0.1.0
468
     * @throws ColumnNotFoundException The specified column ID does not exist for this Pulse
469
     * @throws InvalidColumnException  The specified column is not a "text" type column
470
     * @throws InvalidObjectException  The specified column exists but modification of its value is unsupported either
471
     *                                 by this library or the DaPulse API.
472
     *
473
     * @return PulseColumnTextValue A column object with access to its contents
474
     */
475 4
    public function getTextColumn ($columnId)
476
    {
477 4
        return $this->getColumn($columnId, PulseColumn::Text);
478
    }
479
480
    /**
481
     * Access a timeline type column value belonging to this pulse in order to read it or modify.
482
     *
483
     * This function should only be used to access data type values; an exception will be thrown otherwise.
484
     *
485
     * @api
486
     *
487
     * @param  string $columnId The ID of the column to access. This is typically a slugified version of the column name
488
     *
489
     * @since  0.2.1
490
     *
491
     * @throws ColumnNotFoundException The specified column ID does not exist for this Pulse
492
     * @throws InvalidColumnException  The specified column is not a "numeric" type column
493
     * @throws InvalidObjectException  The specified column exists but modification of its value is unsupported either
494
     *                                 by this library or the DaPulse API.
495
     *
496
     * @return PulseColumnTimelineValue A column object with access to its contents
497
     */
498 5
    public function getTimelineColumn ($columnId)
499
    {
500 5
        return $this->getColumn($columnId, PulseColumn::Timeline);
501
    }
502
503
    /**
504
     * Build a pulse's column object if it doesn't exist or return the existing column.
505
     *
506
     * @param  string $columnId   The ID of the column to access. This is typically a slugified version of the column
507
     *                            title
508
     * @param  string $columnType The type of column being accessed: 'text', 'color', 'person', 'numeric', or 'date'
509
     *
510
     * @since  0.1.0
511
     *
512
     * @throws ColumnNotFoundException The specified column ID does not exist for this Pulse
513
     * @throws InvalidColumnException  The specified column is not the same type as specified in `$columnType`
514
     * @throws InvalidObjectException  The specified column exists but modification of its value is unsupported either
515
     *                                 by this library or the DaPulse API.
516
     *
517
     * @return PulseColumnValue The returned object will be a child of this abstract class.
518
     */
519 40
    private function getColumn ($columnId, $columnType)
520
    {
521 40
        if (!isset($this->column_values) || !array_key_exists($columnId, $this->column_values))
522
        {
523 40
            $key  = ArrayUtilities::array_search_column($this->raw_column_values, 'cid', $columnId);
524 40
            $data = [];
525
526
            // We can't find the key, this means that we got our information from accessing a Pulse directly instead of
527
            // getting it through a PulseBoard. This isn't as robust as accessing a PulseBoard but it's more efficient.
528
            // We make a separate API call to get the value of a column.
529 40
            if ($key === false)
530
            {
531 29
                $url    = sprintf("%s/%d/columns/%s/value.json", self::apiEndpoint("boards"), $this->getBoardId(), $columnId);
532
                $params = [
533 29
                    "pulse_id" => $this->getId()
534
                ];
535
536
                try
537
                {
538 29
                    $results = self::sendGet($url, $params);
539
                }
540 1
                catch (HttpException $e)
541
                {
542 1
                    throw new ColumnNotFoundException("The '$columnId' column could not be found");
543
                }
544
545
                // Store our value inside of jsonResponse so all of the respective objects can treat the data the same
546
                // as when accessed through a PulseBoard
547 28
                $data['jsonResponse']['value'] = $results['value'];
548
            }
549
            else
550
            {
551 11
                $data = $this->raw_column_values[$key];
552 11
                $type = $this->column_structure[$key]->getType();
553
554 11
                if ($type !== $columnType)
555
                {
556 1
                    throw new InvalidColumnException("The '$columnId' column was expected to be '$columnType' but was '$type' instead.");
557
                }
558
            }
559
560 38
            $data['column_id'] = $columnId;
561 38
            $data['board_id']  = $this->getBoardId();
562 38
            $data['pulse_id']  = $this->getId();
563
564 38
            $this->column_values[$columnId] = PulseColumnValue::_createColumnType($columnType, $data);
565
        }
566
567 38
        return $this->column_values[$columnId];
568
    }
569
570
    // ================================================================================================================
571
    //   Notes functions
572
    // ================================================================================================================
573
574
    /**
575
     * Create a new note in this project
576
     *
577
     * @api
578
     *
579
     * @param  string   $title         The title of the note
580
     * @param  string   $content       The body of the note
581
     * @param  bool     $ownersOnly    Set to true if only pulse owners can edit this note.
582
     * @param  int|null $user          The id of the user to be marked as the note's last updater
583
     * @param  bool     $createUpdate  Indicates whether to create an update on the pulse notifying subscribers on the
584
     *                                 changes (required user_id to be set).
585
     *
586
     * @throws \InvalidArgumentException if $createUpdate is true and $user is null or $user is not a valid user ID or
587
     *                                   PulseUser object
588
     *
589
     * @since  0.1.0
590
     *
591
     * @return PulseNote
592
     */
593
    public function addNote ($title, $content, $ownersOnly = false, $user = null, $createUpdate = false)
594
    {
595
        $url        = sprintf($this->urlSyntax, self::apiEndpoint(), $this->id, "notes");
596
        $postParams = [
597
            "id"            => $this->id,
598
            "title"         => $title,
599
            "content"       => $content,
600
            "owners_only"   => $ownersOnly,
601
            "create_update" => $createUpdate
602
        ];
603
604
        if (!is_null($user))
605
        {
606
            $user = PulseUser::_castToInt($user);
607
        }
608
609
        self::setIfNotNullOrEmpty($postParams, 'user_id', $user);
610
611
        if ($createUpdate && is_null($user))
612
        {
613
            throw new \InvalidArgumentException("The user_id value must be set if an update is to be created");
614
        }
615
616
        $noteResult = self::sendPost($url, $postParams);
617
618
        return (new PulseNote($noteResult));
619
    }
620
621
    /**
622
     * Return all of the notes belonging to this project
623
     *
624
     * @api
625
     *
626
     * @since  0.1.0
627
     *
628
     * @return PulseNote[]
629
     */
630
    public function getNotes ()
631
    {
632
        $url = sprintf($this->urlSyntax, self::apiEndpoint(), $this->id, "notes");
633
634
        return self::fetchAndCastToObjectArray($url, "PulseNote");
635
    }
636
637
    // ================================================================================================================
638
    //   Updates functions
639
    // ================================================================================================================
640
641
    /**
642
     * Get all of the updates that belong to this Pulse in reverse chronological order
643
     *
644
     * @api
645
     *
646
     * @since 0.1.0
647
     *
648
     * @return PulseUpdate[]
649
     */
650 20
    public function getUpdates ()
651
    {
652 20
        $url = sprintf($this->urlSyntax, self::apiEndpoint(), $this->id, "updates");
653
654 20
        return self::fetchAndCastToObjectArray($url, "PulseUpdate");
655
    }
656
657
    /**
658
     * Create an update for the current Pulse
659
     *
660
     * @api
661
     *
662
     * @param  int|PulseUser $user
663
     * @param  string        $text
664
     * @param  null|bool     $announceToAll
665
     *
666
     * @since  0.3.0 A PulseUpdate object is returned containing the information of the newly created Update
667
     * @since  0.1.0
668
     *
669
     * @return PulseUpdate
670
     */
671
    public function createUpdate ($user, $text, $announceToAll = null)
672
    {
673
        return PulseUpdate::createUpdate($user, $this->getId(), $text, $announceToAll);
674
    }
675
676
    // ================================================================================================================
677
    //   Static functions
678
    // ================================================================================================================
679
680
    /**
681
     * Get all of the pulses that belong to the organization across all boards.
682
     *
683
     * To modify the amount of data returned with pagination, use the following values in the array to configure your
684
     * pagination or offsets.
685
     *
686
     * ```php
687
     * $params = array(
688
     *     "page"     => 1,          // (int) Page offset to fetch
689
     *     "per_page" => 10,         // (int) Number of results per page
690
     *     "offset"   => 5,          // (int) Instead of starting at result 0, start counting from result 5
691
     *     "order_by_latest" => true // (bool) Order the pulses with the most recent first
692
     * );
693
     * ```
694
     *
695
     * @api
696
     *
697
     * @param array $params GET parameters passed to with the query to modify the data returned.
698
     *
699
     * @since 0.1.0
700
     *
701
     * @return Pulse[]
702
     */
703
    public static function getPulses ($params = [])
704
    {
705
        $url = sprintf("%s.json", self::apiEndpoint());
706
707
        return self::fetchAndCastToObjectArray($url, "Pulse", $params);
708
    }
709
}
710