From c8a83c1fc48a438d940478b8513442d2902c15e6 Mon Sep 17 00:00:00 2001 From: giagara Date: Fri, 21 Jun 2024 10:55:08 +0200 Subject: [PATCH 1/2] feature: added frequency as enum --- README.md | 22 ++++++++-------- src/Enum/FrequencyEnum.php | 42 ++++++++++++++++++++++++++++++ src/LimitManager.php | 27 ++++++++----------- src/Models/Limit.php | 31 +++++++++++++--------- tests/Feature/LimitManagerTest.php | 5 +++- 5 files changed, 86 insertions(+), 41 deletions(-) create mode 100644 src/Enum/FrequencyEnum.php diff --git a/README.md b/README.md index 38234ba..5158f10 100644 --- a/README.md +++ b/README.md @@ -89,19 +89,19 @@ $projectsStandardLimit->incrementBy(10); $projectsProLimit->decrementBy(3); ``` -###### Possible values for "reset_frequency" column +###### Possible values for "reset_frequency" column came from src/Enum/FrequencyEnum.php - null -- "every second" // works in Laravel >= 10 -- "every minute" -- "every hour" -- "every day" -- "every week", -- "every two weeks", -- "every month", -- "every quarter", -- "every six months", -- "every year" +- EVERY_SECOND = 'every second' // works in laravel >= 10.x +- EVERY_MINUTE = 'every minute' +- EVERY_HOUR = 'every hour' +- EVERY_DAY = 'every day' +- EVERY_WEEK = 'every week' +- EVERY_TWO_WEEKS = 'every two weeks' +- EVERY_MONTH = 'every month' +- EVERY_QUARTER = 'every quarter' +- EVERY_SIX_MONTHS = 'every six months' +- EVERY_YEAR = 'every year' #### Set Limits on models diff --git a/src/Enum/FrequencyEnum.php b/src/Enum/FrequencyEnum.php new file mode 100644 index 0000000..d0ecbbb --- /dev/null +++ b/src/Enum/FrequencyEnum.php @@ -0,0 +1,42 @@ + $lastReset->addSecond(), + self::EVERY_MINUTE => $lastReset->addMinute(), + self::EVERY_HOUR => $lastReset->addHour(), + self::EVERY_DAY => $lastReset->addDay(), + self::EVERY_WEEK => $lastReset->addWeek(), + self::EVERY_TWO_WEEKS => $lastReset->addWeeks(2), + self::EVERY_MONTH => $lastReset->addMonth(), + self::EVERY_QUARTER => $lastReset->addQuarter(), + self::EVERY_SIX_MONTHS => $lastReset->addMonths(6), + self::EVERY_YEAR => $lastReset->addYear(), + }; + } +} \ No newline at end of file diff --git a/src/LimitManager.php b/src/LimitManager.php index f28bf6d..9772a8f 100644 --- a/src/LimitManager.php +++ b/src/LimitManager.php @@ -7,6 +7,7 @@ use Illuminate\Support\Facades\Cache; use InvalidArgumentException; use NabilHassen\LaravelUsageLimiter\Contracts\Limit; +use NabilHassen\LaravelUsageLimiter\Enum\FrequencyEnum; use NabilHassen\LaravelUsageLimiter\Exceptions\InvalidLimitResetFrequencyValue; class LimitManager @@ -52,26 +53,20 @@ public function initCache(): void $this->cache = Cache::store($cacheStore); } - public function getNextReset(string $limitResetFrequency, string|Carbon $lastReset): Carbon + public function getNextReset(string|FrequencyEnum $limitResetFrequency, string|Carbon $lastReset): Carbon { - if ($this->limitClass->getResetFrequencyOptions()->doesntContain($limitResetFrequency)) { + if(!$limitResetFrequency instanceof FrequencyEnum) { + if(!$limitResetFrequency = FrequencyEnum::tryFrom($limitResetFrequency)){ + throw new InvalidLimitResetFrequencyValue; + } + } + + if ($this->limitClass->getResetFrequencyOptions()->doesntContain($limitResetFrequency->value)) { throw new InvalidLimitResetFrequencyValue; } - $lastReset = Carbon::parse($lastReset); - - return match ($limitResetFrequency) { - 'every second' => $lastReset->addSecond(), - 'every minute' => $lastReset->addMinute(), - 'every hour' => $lastReset->addHour(), - 'every day' => $lastReset->addDay(), - 'every week' => $lastReset->addWeek(), - 'every two weeks' => $lastReset->addWeeks(2), - 'every month' => $lastReset->addMonth(), - 'every quarter' => $lastReset->addQuarter(), - 'every six months' => $lastReset->addMonths(6), - 'every year' => $lastReset->addYear(), - }; + return $limitResetFrequency->getCarbonEquivalent($lastReset); + } public function loadLimits(): void diff --git a/src/Models/Limit.php b/src/Models/Limit.php index 1813f89..cbd8d43 100644 --- a/src/Models/Limit.php +++ b/src/Models/Limit.php @@ -8,6 +8,7 @@ use Illuminate\Support\Collection; use InvalidArgumentException; use NabilHassen\LaravelUsageLimiter\Contracts\Limit as LimitContract; +use NabilHassen\LaravelUsageLimiter\Enum\FrequencyEnum; use NabilHassen\LaravelUsageLimiter\Exceptions\InvalidLimitResetFrequencyValue; use NabilHassen\LaravelUsageLimiter\Exceptions\LimitAlreadyExists; use NabilHassen\LaravelUsageLimiter\Exceptions\LimitDoesNotExist; @@ -20,19 +21,23 @@ class Limit extends Model implements LimitContract protected $guarded = ['id', 'created_at', 'updated_at', 'deleted_at']; - protected static array $resetFrequencyPossibleValues = [ - 'every second', - 'every minute', - 'every hour', - 'every day', - 'every week', - 'every two weeks', - 'every month', - 'every quarter', - 'every six months', - 'every year', + protected $casts = [ + 'reset_frequency' => FrequencyEnum::class, ]; + // protected static array $resetFrequencyPossibleValues = [ + // 'every second', + // 'every minute', + // 'every hour', + // 'every day', + // 'every week', + // 'every two weeks', + // 'every month', + // 'every quarter', + // 'every six months', + // 'every year', + // ]; + public function __construct(array $attributes = []) { parent::__construct($attributes); @@ -75,7 +80,7 @@ protected static function validateArgs(array $data): array if ( Arr::has($data, ['reset_frequency']) && filled($data['reset_frequency']) && - array_search($data['reset_frequency'], static::$resetFrequencyPossibleValues) === false + !in_array($data['reset_frequency'], FrequencyEnum::toArray()) ) { throw new InvalidLimitResetFrequencyValue; } @@ -141,6 +146,6 @@ public function decrementBy(float|int $amount = 1.0): bool public function getResetFrequencyOptions(): Collection { - return collect(static::$resetFrequencyPossibleValues); + return collect(FrequencyEnum::toArray()); } } diff --git a/tests/Feature/LimitManagerTest.php b/tests/Feature/LimitManagerTest.php index b5e1906..64e5bef 100644 --- a/tests/Feature/LimitManagerTest.php +++ b/tests/Feature/LimitManagerTest.php @@ -8,6 +8,7 @@ use Illuminate\Support\Str; use InvalidArgumentException; use NabilHassen\LaravelUsageLimiter\Contracts\Limit; +use NabilHassen\LaravelUsageLimiter\Enum\FrequencyEnum; use NabilHassen\LaravelUsageLimiter\Exceptions\InvalidLimitResetFrequencyValue; use NabilHassen\LaravelUsageLimiter\LimitManager; use NabilHassen\LaravelUsageLimiter\Tests\TestCase; @@ -112,7 +113,9 @@ public function test_exception_is_thrown_if_invalid_reset_frequency_is_passed_to public function test_get_next_reset_returns_carbon_date(): void { - $date = $this->limitManagerClass->getNextReset(app(Limit::class)->getResetFrequencyOptions()->random(), now()); + $limit_frequency = FrequencyEnum::from(app(Limit::class)->getResetFrequencyOptions()->random()); + + $date = $this->limitManagerClass->getNextReset($limit_frequency, now()); $this->assertInstanceOf(Carbon::class, $date); } From 51cb09ce28bb576ab8bcd23ca8170fb3fa9053cc Mon Sep 17 00:00:00 2001 From: giagara Date: Fri, 21 Jun 2024 11:00:54 +0200 Subject: [PATCH 2/2] wip --- src/Models/Limit.php | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/Models/Limit.php b/src/Models/Limit.php index cbd8d43..81c000f 100644 --- a/src/Models/Limit.php +++ b/src/Models/Limit.php @@ -25,19 +25,6 @@ class Limit extends Model implements LimitContract 'reset_frequency' => FrequencyEnum::class, ]; - // protected static array $resetFrequencyPossibleValues = [ - // 'every second', - // 'every minute', - // 'every hour', - // 'every day', - // 'every week', - // 'every two weeks', - // 'every month', - // 'every quarter', - // 'every six months', - // 'every year', - // ]; - public function __construct(array $attributes = []) { parent::__construct($attributes);