Skip to content

Commit 55fd7a5

Browse files
committed
device_display_default setting should invalidate device display names cache
1 parent fec8f40 commit 55fd7a5

6 files changed

Lines changed: 92 additions & 0 deletions

File tree

app/ConfigRepository.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
namespace App;
2828

29+
use App\Events\SettingChanged;
2930
use App\Models\Callback;
3031
use App\Models\GraphType;
3132
use Exception;
@@ -263,7 +264,9 @@ public function erase(string $key): bool
263264
$deleted = Models\Config::withChildren($key)->delete();
264265

265266
if ($deleted > 0) {
267+
// delete statement above doens't trigger Eloquent events
266268
$this->invalidateCache();
269+
event("setting.changed.$key", new SettingChanged($key, $this->get($key)));
267270
}
268271

269272
return true;

app/Events/SettingChanged.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace App\Events;
4+
5+
use Illuminate\Broadcasting\InteractsWithSockets;
6+
use Illuminate\Foundation\Events\Dispatchable;
7+
use Illuminate\Queue\SerializesModels;
8+
9+
class SettingChanged
10+
{
11+
use Dispatchable, InteractsWithSockets, SerializesModels;
12+
13+
/**
14+
* Create a new event instance.
15+
*/
16+
public function __construct(
17+
public readonly string $key,
18+
public readonly mixed $value = null,
19+
) {
20+
}
21+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace App\Listeners;
4+
5+
use App\Events\SettingChanged;
6+
use App\Models\Device;
7+
use Illuminate\Support\Facades\Log;
8+
9+
class RegenerateDeviceDisplayNames
10+
{
11+
/**
12+
* Handle the event.
13+
*/
14+
public function handle(SettingChanged $event): void
15+
{
16+
Device::withoutEvents(function () {
17+
Device::whereNull('display_template')
18+
->orWhere('display_template', '')
19+
->select(['device_id', 'display_template', 'hostname', 'sysName', 'ip', 'overwrite_ip'])
20+
->chunkById(500, function ($devices) {
21+
foreach ($devices as $device) {
22+
try {
23+
$device->regenerateDisplayName();
24+
$device->timestamps = false;
25+
$device->save();
26+
} catch (\Throwable $e) {
27+
Log::error("Failed to regen device {$device->device_id}: " . $e->getMessage());
28+
}
29+
}
30+
});
31+
});
32+
}
33+
}

app/Observers/ConfigObserver.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace App\Observers;
4+
5+
use App\Events\SettingChanged;
6+
use App\Facades\LibrenmsConfig;
7+
use App\Models\Config;
8+
9+
class ConfigObserver
10+
{
11+
public function saved(Config $config): void
12+
{
13+
event("setting.changed.$config->config_name", new SettingChanged($config->config_name, $config->config_value));
14+
}
15+
16+
/**
17+
* Handle the config "deleted" event.
18+
*/
19+
public function deleted(Config $config): void
20+
{
21+
LibrenmsConfig::invalidateCache();
22+
event("setting.changed.$config->config_name", new SettingChanged($config->config_name, LibrenmsConfig::get($config->config_name)));
23+
}
24+
}

app/Providers/AppServiceProvider.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ private function registerGeocoder()
149149

150150
private function bootObservers()
151151
{
152+
\App\Models\Config::observe(\App\Observers\ConfigObserver::class);
152153
\App\Models\Device::observe(\App\Observers\DeviceObserver::class);
153154
\App\Models\Mempool::observe(\App\Observers\MempoolObserver::class);
154155
\App\Models\Package::observe(\App\Observers\PackageObserver::class);

app/Providers/ConfigServiceProvider.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use App\ConfigRepository;
66
use App\Facades\LibrenmsConfig;
7+
use App\Listeners\RegenerateDeviceDisplayNames;
8+
use Illuminate\Support\Facades\Event;
79
use Illuminate\Support\Facades\Log;
810
use Illuminate\Support\ServiceProvider;
911

@@ -26,4 +28,12 @@ public function register(): void
2628
}
2729
});
2830
}
31+
32+
/**
33+
* Bootstrap services.
34+
*/
35+
public function boot(): void
36+
{
37+
Event::listen('setting.changed.device_display_default', RegenerateDeviceDisplayNames::class);
38+
}
2939
}

0 commit comments

Comments
 (0)