Completed
Push — master ( a84807...ecaeb0 )
by Martin
13:02
created

StockTimeSeries::getFunction()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace cHeeSaW\AlphaVantageBundle\Endpoints;
6
7
use InvalidArgumentException;
8
use function in_array;
9
10
/**
11
 * @link https://www.alphavantage.co/documentation/#time-series-data
12
 */
13
class StockTimeSeries implements Endpoint
14
{
15
    public const TIME_SERIES_INTRADAY = 'TIME_SERIES_INTRADAY';
16
    public const TIME_SERIES_DAILY = 'TIME_SERIES_DAILY';
17
    public const TIME_SERIES_DAILY_ADJUSTED = 'TIME_SERIES_DAILY_ADJUSTED';
18
    public const TIME_SERIES_WEEKLY = 'TIME_SERIES_WEEKLY';
19
    public const TIME_SERIES_WEEKLY_ADJUSTED = 'TIME_SERIES_WEEKLY_ADJUSTED';
20
    public const TIME_SERIES_MONTHLY = 'TIME_SERIES_MONTHLY';
21
    public const TIME_SERIES_MONTHLY_ADJUSTED = 'TIME_SERIES_MONTHLY_ADJUSTED';
22
    public const GLOBAL_QUOTE = 'GLOBAL_QUOTE';
23
    public const SYMBOL_SEARCH = 'SYMBOL_SEARCH';
24
25
    private static array $validFunctions = [
26
        self::TIME_SERIES_INTRADAY,
27
        self::TIME_SERIES_DAILY,
28
        self::TIME_SERIES_DAILY_ADJUSTED,
29
        self::TIME_SERIES_WEEKLY .
30
        self::TIME_SERIES_WEEKLY_ADJUSTED,
31
        self::TIME_SERIES_MONTHLY,
32
        self::TIME_SERIES_MONTHLY_ADJUSTED,
33
        self::GLOBAL_QUOTE,
34
        self::SYMBOL_SEARCH
35
    ];
36
37
    private string $function;
38
39
    /**
40
     * @see https://www.alphavantage.co/physical_currency_list/
41
     */
42
    private ?string $symbol;
43
44
    /**
45
     * By default, datatype=json. Strings json and csv are accepted with the following specifications:
46
     * json returns the intraday time series in JSON format; csv returns the time series as a
47
     * CSV (comma separated value) file.
48
     */
49
    private string $dataType;
50
51
    /**
52
     * By default, outputsize=compact. Strings compact and full are accepted with the following specifications:
53
     * compact returns only the latest 100 data points in the intraday time series; full returns the full-length
54
     * intraday time series. The "compact" option is recommended if you would like to reduce the data size of
55
     * each API call.
56
     */
57
    private string $outputsize;
58
    private string $interval;
59
60
    public function __construct(
61
        string $function,
62
        string $symbol = null,
63
        string $dataType = self::DATATYPE_JSON,
64
        string $outputsize = self::OUTPUTSIZE_COMPACT,
65
        string $interval = self::INTERVAL_5_MIN
66
    ) {
67
        if (!in_array($outputsize, [self::OUTPUTSIZE_COMPACT, self::OUTPUTSIZE_FULL], true)) {
68
            throw new InvalidArgumentException('Invalid outputsize given, valid values are: full, compact');
69
        }
70
71
        if ($dataType !== self::DATATYPE_JSON && $dataType !== self::DATATYPE_CSV) {
72
            throw new InvalidArgumentException($dataType . ' is not valid, try: csv or json');
73
        }
74
75
        if (!in_array($function, self::$validFunctions, true)) {
76
            throw new InvalidArgumentException(
77
                $function . ' is not valid, check https://www.alphavantage.co/documentation/ 
78
                for valid Stock Time Series functions'
79
            );
80
        }
81
82
        $this->outputsize = $outputsize;
83
        $this->dataType = $dataType;
84
        $this->function = $function;
85
        $this->symbol = $symbol;
86
        $this->interval = $interval;
87
    }
88
89
    public static function getValidFunctions(): array
90
    {
91
        return self::$validFunctions;
92
    }
93
94
    public function getFunction(): string
95
    {
96
        return $this->function;
97
    }
98
99
    public function getSymbol(): ?string
100
    {
101
        return $this->symbol;
102
    }
103
104
    public function getDataType(): string
105
    {
106
        return $this->dataType;
107
    }
108
109
    public function getOutputsize(): string
110
    {
111
        return $this->outputsize;
112
    }
113
114
    public function getInterval(): string
115
    {
116
        return $this->interval;
117
    }
118
119
    public function getQueryString(): string
120
    {
121
        return http_build_query($this);
122
    }
123
}
124