Passed
Push — develop ( cc6e0d...eb2865 )
by nguereza
03:00
created

Rate::getInterval()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
/**
4
 * Platine Framework
5
 *
6
 * Platine Framework is a lightweight, high-performance, simple and elegant
7
 * PHP Web framework
8
 *
9
 * This content is released under the MIT License (MIT)
10
 *
11
 * Copyright (c) 2020 Platine Framework
12
 *
13
 * Permission is hereby granted, free of charge, to any person obtaining a copy
14
 * of this software and associated documentation files (the "Software"), to deal
15
 * in the Software without restriction, including without limitation the rights
16
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17
 * copies of the Software, and to permit persons to whom the Software is
18
 * furnished to do so, subject to the following conditions:
19
 *
20
 * The above copyright notice and this permission notice shall be included in all
21
 * copies or substantial portions of the Software.
22
 *
23
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29
 * SOFTWARE.
30
 */
31
32
/**
33
 *  @file Rate.php
34
 *
35
 *  The Rate class
36
 *
37
 *  @package    Platine\Framework\Http\RateLimit
38
 *  @author Platine Developers team
39
 *  @copyright  Copyright (c) 2020
40
 *  @license    http://opensource.org/licenses/MIT  MIT License
41
 *  @link   https://www.platine-php.com
42
 *  @version 1.0.0
43
 *  @filesource
44
 */
45
46
declare(strict_types=1);
47
48
namespace Platine\Framework\Http\RateLimit;
49
50
use InvalidArgumentException;
51
52
/**
53
 * @class Rate
54
 * @package Platine\Framework\Http\RateLimit
55
 */
56
class Rate
57
{
58
    /**
59
     * The rate limit quota
60
     * @var int
61
     */
62
    protected int $quota;
63
64
    /**
65
     * The rate limit interval in seconds
66
     * @var int
67
     */
68
    protected int $interval;
69
70
71
    /**
72
     * Create new instance
73
     * @param int $quota
74
     * @param int $interval
75
     */
76
    final protected function __construct(int $quota, int $interval)
77
    {
78
        if ($quota <= 0) {
79
            throw new InvalidArgumentException(sprintf(
80
                'Quota must be greater than zero, received [%d]',
81
                $quota
82
            ));
83
        }
84
85
        if ($interval <= 0) {
86
            throw new InvalidArgumentException(sprintf(
87
                'Seconds interval must be greater than zero, received [%d]',
88
                $interval
89
            ));
90
        }
91
92
        $this->quota = $quota;
93
        $this->interval = $interval;
94
    }
95
96
    /**
97
     * Set quota to be used per second
98
     * @param int $quota
99
     * @return self
100
     */
101
    public static function perSecond(int $quota): self
102
    {
103
        return new static($quota, 1);
104
    }
105
106
     /**
107
     * Set quota to be used per minute
108
     * @param int $quota
109
     * @return self
110
     */
111
    public static function perMinute(int $quota): self
112
    {
113
        return new static($quota, 60);
114
    }
115
116
    /**
117
     * Set quota to be used per hour
118
     * @param int $quota
119
     * @return self
120
     */
121
    public static function perHour(int $quota): self
122
    {
123
        return new static($quota, 3600);
124
    }
125
126
    /**
127
     * Set quota to be used per day
128
     * @param int $quota
129
     * @return self
130
     */
131
    public static function perDay(int $quota): self
132
    {
133
        return new static($quota, 86400);
134
    }
135
136
    /**
137
     * Set custom quota and interval
138
     * @param int $quota
139
     * @param int $interval
140
     * @return self
141
     */
142
    public static function custom(int $quota, int $interval): self
143
    {
144
        return new static($quota, $interval);
145
    }
146
147
    /**
148
     * Return the rate limit quota
149
     * @return int
150
     */
151
    public function getQuota(): int
152
    {
153
        return $this->quota;
154
    }
155
156
    /**
157
     * Return the interval in second
158
     * @return int
159
     */
160
    public function getInterval(): int
161
    {
162
        return $this->interval;
163
    }
164
}
165