Skip to content

Commit bf69a4d

Browse files
authored
Merge pull request #34 from grantholle/enum-support
Add enum support for flags
2 parents dd7228b + 6ad9802 commit bf69a4d

File tree

6 files changed

+55
-33
lines changed

6 files changed

+55
-33
lines changed

.github/workflows/run-tests.yml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
strategy:
1616
fail-fast: true
1717
matrix:
18-
php: [8.0, 8.1, 8.2, 8.3]
18+
php: [8.1, 8.2, 8.3]
1919
laravel: ['9.*', '10.*', '11.*']
2020
stability: [prefer-stable]
2121
include:
@@ -28,10 +28,6 @@ jobs:
2828
exclude:
2929
- laravel: 10.*
3030
php: 8.3
31-
- laravel: 10.*
32-
php: 8.0
33-
- laravel: 11.*
34-
php: 8.0
3531
- laravel: 11.*
3632
php: 8.1
3733

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
}
1717
],
1818
"require": {
19-
"php": "^8.0",
19+
"php": "^8.1",
2020
"spatie/laravel-package-tools": "^1.13.6",
2121
"illuminate/contracts": "^9.0|^10.0|^11.0"
2222
},

src/Models/Concerns/HasFlags.php

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Spatie\ModelFlags\Models\Concerns;
44

5+
use BackedEnum;
56
use Illuminate\Database\Eloquent\Builder;
67
use Illuminate\Database\Eloquent\Model;
78
use Illuminate\Database\Eloquent\Relations\MorphMany;
@@ -18,48 +19,57 @@ public static function bootHasFlags()
1819
});
1920
}
2021

22+
protected function enumValue(string|BackedEnum $value): string
23+
{
24+
if (is_string($value)) {
25+
return $value;
26+
}
27+
28+
return (string) $value->value;
29+
}
30+
2131
public function flags(): MorphMany
2232
{
2333
return $this->morphMany(config('model-flags.flag_model'), 'flaggable');
2434
}
2535

26-
public function hasFlag(string $name): bool
36+
public function hasFlag(string|BackedEnum $name): bool
2737
{
2838
return $this
2939
->flags()
30-
->where('name', $name)
40+
->where('name', $this->enumValue($name))
3141
->exists();
3242
}
3343

34-
public function flag(string $name): self
44+
public function flag(string|BackedEnum $name): self
3545
{
36-
$this->flags()->firstOrCreate(['name' => $name])->touch();
46+
$this->flags()->firstOrCreate(['name' => $this->enumValue($name)])->touch();
3747

3848
return $this;
3949
}
4050

41-
public function unflag(string $name): self
51+
public function unflag(string|BackedEnum $name): self
4252
{
43-
$this->flags()->where('name', $name)->delete();
53+
$this->flags()->where('name', $this->enumValue($name))->delete();
4454

4555
return $this;
4656
}
4757

48-
public function scopeFlagged(Builder $query, string $name): void
58+
public function scopeFlagged(Builder $query, string|BackedEnum $name): void
4959
{
5060
$query
5161
->whereHas(
5262
'flags',
53-
fn (Builder $query) => $query->where('name', $name)
63+
fn (Builder $query) => $query->where('name', $this->enumValue($name))
5464
);
5565
}
5666

57-
public function scopeNotFlagged(Builder $query, string $name): void
67+
public function scopeNotFlagged(Builder $query, string|BackedEnum $name): void
5868
{
5969
$query
6070
->doesntHave(
6171
'flags',
62-
callback: fn (Builder $query) => $query->where('name', $name)
72+
callback: fn (Builder $query) => $query->where('name', $this->enumValue($name))
6373
);
6474
}
6575

@@ -73,17 +83,17 @@ public function flagNames(): array
7383
->toArray();
7484
}
7585

76-
public function latestFlag(?string $name = null): ?Flag
86+
public function latestFlag(string|BackedEnum|null $name = null): ?Flag
7787
{
7888
return $this
7989
->flags()
80-
->when($name, fn (Builder $query) => $query->where('name', $name))
90+
->when($name, fn (Builder $query) => $query->where('name', $this->enumValue($name)))
8191
->orderByDesc('updated_at')->orderByDesc('id')
8292
->first();
8393
}
8494

85-
public function lastFlaggedAt(string $name): ?Carbon
95+
public function lastFlaggedAt(string|BackedEnum $name): ?Carbon
8696
{
87-
return $this->latestFlag($name)?->updated_at;
97+
return $this->latestFlag($this->enumValue($name))?->updated_at;
8898
}
8999
}

tests/Datasets/Flags.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
use Spatie\ModelFlags\Tests\TestSupport\TestBackedEnum;
4+
5+
dataset('flags', [
6+
'a string' => 'flag-a',
7+
'a backed enum' => TestBackedEnum::test_case,
8+
]);

tests/HasFlagsTest.php

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,28 @@
1010
$this->otherModel = TestModel::create();
1111
});
1212

13-
it('can add a flag to a model', function () {
14-
expect($this->model->hasFlag('flag-a'))->toBeFalse();
13+
it('can add a flag to a model', function (string|BackedEnum $flag) {
14+
expect($this->model->hasFlag($flag))->toBeFalse();
1515

16-
$this->model->flag('flag-a');
16+
$this->model->flag($flag);
1717

18-
expect($this->model->hasFlag('flag-a'))->toBeTrue();
18+
expect($this->model->hasFlag($flag))->toBeTrue();
1919
expect($this->model->hasFlag('flag-B'))->toBeFalse();
20-
expect($this->otherModel->hasFlag('flag-a'))->toBeFalse();
21-
});
20+
expect($this->otherModel->hasFlag($flag))->toBeFalse();
21+
})->with('flags');
2222

23-
it('can unflag a model', function () {
24-
$this->model->unflag('flag-a');
23+
it('can unflag a model', function (string|BackedEnum $flag) {
24+
$this->model->unflag($flag);
2525

26-
$this->model->flag('flag-a');
26+
$this->model->flag($flag);
2727
$this->model->flag('flag-b');
28-
expect($this->model->hasFlag('flag-a'))->toBeTrue();
28+
expect($this->model->hasFlag($flag))->toBeTrue();
2929

30-
$this->model->unflag('flag-a');
30+
$this->model->unflag($flag);
3131

32-
expect($this->model->hasFlag('flag-a'))->toBeFalse();
32+
expect($this->model->hasFlag($flag))->toBeFalse();
3333
expect($this->model->hasFlag('flag-b'))->toBeTrue();
34-
});
34+
})->with('flags');
3535

3636
it('can get the flags from a model', function () {
3737
$this->model
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Spatie\ModelFlags\Tests\TestSupport;
4+
5+
enum TestBackedEnum: string
6+
{
7+
case test_case = 'test-flag';
8+
}

0 commit comments

Comments
 (0)