Skip to content

Commit 71ce944

Browse files
committed
device_display_default setting should invalidate device display names cache
1 parent fec8f40 commit 71ce944

5 files changed

Lines changed: 89 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+
SettingChanged::dispatch($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: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
if ($event->key !== 'device_display_default') {
17+
return;
18+
}
19+
20+
Device::withoutEvents(function () {
21+
Device::whereNull('display_template')
22+
->orWhere('display_template', '')
23+
->select(['device_id', 'display_template', 'hostname', 'sysName', 'ip', 'overwrite_ip'])
24+
->chunkById(500, function ($devices) {
25+
foreach ($devices as $device) {
26+
try {
27+
$device->regenerateDisplayName();
28+
$device->timestamps = false;
29+
$device->save();
30+
} catch (\Throwable $e) {
31+
Log::error("Failed to regen device {$device->device_id}: " . $e->getMessage());
32+
}
33+
}
34+
});
35+
});
36+
}
37+
}

app/Observers/ConfigObserver.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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+
/**
12+
* Handle the config "saved" event.
13+
*/
14+
public function saved(Config $config): void
15+
{
16+
SettingChanged::dispatch($config->config_name, $config->config_value);
17+
}
18+
19+
/**
20+
* Handle the config "deleted" event.
21+
*/
22+
public function deleted(Config $config): void
23+
{
24+
LibrenmsConfig::invalidateCache();
25+
SettingChanged::dispatch($config->config_name, LibrenmsConfig::get($config->config_name));
26+
}
27+
}

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);

0 commit comments

Comments
 (0)