Skip to content

Commit d293eeb

Browse files
author
Stiven Katuuk
committed
build(actions): centralized business logic for value resolver
1 parent e24fd68 commit d293eeb

File tree

3 files changed

+60
-6
lines changed

3 files changed

+60
-6
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace Spatie\Activitylog\Actions;
4+
5+
class ResolveForPropertyValueAction
6+
{
7+
/**
8+
* Action that resolve property value of log
9+
* that cannot be handled by PHP or This Package
10+
*
11+
* @param mixed $value
12+
* @return mixed
13+
*/
14+
public static function execute(mixed $value): mixed
15+
{
16+
$instance = new static;
17+
18+
if ($instance->isValueAreEnum($value)) {
19+
return $value->value ?? $value->name;
20+
}
21+
22+
return $value;
23+
}
24+
25+
protected function isValueAreEnum($value): bool
26+
{
27+
if (! function_exists('enum_exists')){
28+
return false;
29+
}
30+
31+
$enumNamespace = is_object($value)
32+
? get_class($value)
33+
: $value;
34+
35+
return enum_exists($enumNamespace);
36+
}
37+
}

src/ActivityLogger.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Illuminate\Support\Str;
1111
use Illuminate\Support\Traits\Conditionable;
1212
use Illuminate\Support\Traits\Macroable;
13+
use Spatie\Activitylog\Actions\ResolveForPropertyValueAction;
1314
use Spatie\Activitylog\Contracts\Activity as ActivityContract;
1415

1516
class ActivityLogger
@@ -102,16 +103,14 @@ public function setEvent(string $event): static
102103

103104
public function withProperties(mixed $properties): static
104105
{
105-
$this->getActivity()->properties = collect($properties);
106+
$this->getActivity()->properties = collect($properties)->map(fn ($value) => ResolveForPropertyValueAction::execute($value));
106107

107108
return $this;
108109
}
109110

110111
public function withProperty(string $key, mixed $value): static
111112
{
112-
if (is_object($value) && function_exists('enum_exists') && enum_exists(get_class($value))) {
113-
$value = $value->value ?? $value->name;
114-
}
113+
$value = ResolveForPropertyValueAction::execute($value);
115114

116115
$this->getActivity()->properties = $this->getActivity()->properties->put($key, $value);
117116

tests/AbleStoreNonBackedEnumTest.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,30 @@
66
use Spatie\Activitylog\Test\Models\Activity;
77
use Spatie\Activitylog\Test\Models\User;
88

9-
it('can store non backed enum', function () {
9+
afterEach(fn() => Activity::query()->latest()->first()->delete());
10+
11+
it('can store non backed only a property', function () {
1012
$description = 'ROLE LOG';
1113

1214
activity()
1315
->performedOn(User::first())
1416
->withProperty('role', NonBackedEnum::User)->log($description);
1517

16-
expect(Activity::query()->latest()->first()->description)->toEqual($description);
18+
$latestActivity = Activity::query()->latest()->first();
19+
20+
expect($latestActivity->description)->toEqual($description)
21+
->and($latestActivity->properties['role'])->toEqual('User');
22+
});
23+
24+
it('can store non backed with properties', function () {
25+
$description = 'ROLE LOG';
26+
27+
activity()
28+
->performedOn(User::first())
29+
->withProperties(['role' => NonBackedEnum::User])->log($description);
30+
31+
$latestActivity = Activity::query()->latest()->first();
32+
33+
expect($latestActivity->description)->toEqual($description)
34+
->and($latestActivity->properties['role'])->toEqual('User');
1735
});

0 commit comments

Comments
 (0)