mirror of
https://github.com/pelican-dev/panel.git
synced 2026-07-16 04:03:50 +03:00
Updates + stan
This commit is contained in:
@@ -9,6 +9,7 @@ use App\Traits\Filament\CanCustomizePages;
|
||||
use BackedEnum;
|
||||
use Filament\Resources\Pages\PageRegistration;
|
||||
use Filament\Resources\Resource;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class ActivityLogResource extends Resource
|
||||
{
|
||||
@@ -45,17 +46,17 @@ class ActivityLogResource extends Resource
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function canEdit($record): bool
|
||||
public static function canEdit(Model $record): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function canDelete($record): bool
|
||||
public static function canDelete(Model $record): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function canView($record): bool
|
||||
public static function canView(Model $record): bool
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Observers;
|
||||
use App\Facades\Activity;
|
||||
use App\Models\Egg;
|
||||
use App\Models\Node;
|
||||
use App\Models\Role;
|
||||
use App\Models\Server;
|
||||
use App\Models\User;
|
||||
use Filament\Facades\Filament;
|
||||
@@ -33,6 +34,8 @@ class AdminActivityObserver
|
||||
* @param string $event The event name (e.g. 'admin:user.create')
|
||||
* @param Model $model The model being acted upon
|
||||
* @param array<string, mixed> $properties Additional properties to log
|
||||
*
|
||||
* @throws \Throwable
|
||||
*/
|
||||
private function log(string $event, Model $model, array $properties = []): void
|
||||
{
|
||||
@@ -47,10 +50,10 @@ class AdminActivityObserver
|
||||
|
||||
// Deduplicate identical events for the same record within a single request.
|
||||
$key = $event . ':' . get_class($model) . ':' . $model->getKey();
|
||||
if (isset(static::$logged[$key])) {
|
||||
if (isset(self::$logged[$key])) {
|
||||
return;
|
||||
}
|
||||
static::$logged[$key] = true;
|
||||
self::$logged[$key] = true;
|
||||
|
||||
$log = Activity::event($event)
|
||||
->actor($actor)
|
||||
@@ -62,7 +65,6 @@ class AdminActivityObserver
|
||||
|
||||
$log->log();
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// User events
|
||||
// -------------------------------------------------------------------------
|
||||
@@ -74,7 +76,13 @@ class AdminActivityObserver
|
||||
|
||||
public function userUpdated(User $user): void
|
||||
{
|
||||
$this->log('admin:user.update', $user, ['name' => $user->username]);
|
||||
$changedFields = $this->changedFieldsFor($user);
|
||||
|
||||
$this->log('admin:user.update', $user, [
|
||||
'name' => empty($changedFields) ? $user->username : sprintf('%s (%s)', $user->username, implode(', ', $changedFields)),
|
||||
'count' => count($changedFields),
|
||||
'changes' => implode(', ', $changedFields),
|
||||
]);
|
||||
}
|
||||
|
||||
public function userDeleted(User $user): void
|
||||
@@ -93,7 +101,13 @@ class AdminActivityObserver
|
||||
|
||||
public function serverUpdated(Server $server): void
|
||||
{
|
||||
$this->log('admin:server.update', $server, ['name' => $server->name]);
|
||||
$changedFields = $this->changedFieldsFor($server);
|
||||
|
||||
$this->log('admin:server.update', $server, [
|
||||
'name' => empty($changedFields) ? $server->name : sprintf('%s (%s)', $server->name, implode(', ', $changedFields)),
|
||||
'count' => count($changedFields),
|
||||
'changes' => implode(', ', $changedFields),
|
||||
]);
|
||||
}
|
||||
|
||||
public function serverDeleted(Server $server): void
|
||||
@@ -112,7 +126,13 @@ class AdminActivityObserver
|
||||
|
||||
public function nodeUpdated(Node $node): void
|
||||
{
|
||||
$this->log('admin:node.update', $node, ['name' => $node->name]);
|
||||
$changedFields = $this->changedFieldsFor($node);
|
||||
|
||||
$this->log('admin:node.update', $node, [
|
||||
'name' => empty($changedFields) ? $node->name : sprintf('%s (%s)', $node->name, implode(', ', $changedFields)),
|
||||
'count' => count($changedFields),
|
||||
'changes' => implode(', ', $changedFields),
|
||||
]);
|
||||
}
|
||||
|
||||
public function nodeDeleted(Node $node): void
|
||||
@@ -131,11 +151,64 @@ class AdminActivityObserver
|
||||
|
||||
public function eggUpdated(Egg $egg): void
|
||||
{
|
||||
$this->log('admin:egg.update', $egg, ['name' => $egg->name]);
|
||||
$changedFields = $this->changedFieldsFor($egg);
|
||||
|
||||
$this->log('admin:egg.update', $egg, [
|
||||
'name' => empty($changedFields) ? $egg->name : sprintf('%s (%s)', $egg->name, implode(', ', $changedFields)),
|
||||
'count' => count($changedFields),
|
||||
'changes' => implode(', ', $changedFields),
|
||||
]);
|
||||
}
|
||||
|
||||
public function eggDeleted(Egg $egg): void
|
||||
{
|
||||
$this->log('admin:egg.delete', $egg, ['name' => $egg->name]);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Role events
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
public function roleCreated(Role $role): void
|
||||
{
|
||||
$this->log('admin:role.create', $role, ['name' => $role->name]);
|
||||
}
|
||||
|
||||
public function roleUpdated(Role $role): void
|
||||
{
|
||||
$changedFields = $this->changedFieldsFor($role);
|
||||
|
||||
$this->log('admin:role.update', $role, [
|
||||
'name' => empty($changedFields) ? $role->name : sprintf('%s (%s)', $role->name, implode(', ', $changedFields)),
|
||||
'count' => count($changedFields),
|
||||
'changes' => implode(', ', $changedFields),
|
||||
]);
|
||||
}
|
||||
|
||||
public function roleDeleted(Role $role): void
|
||||
{
|
||||
$this->log('admin:role.delete', $role, ['name' => $role->name]);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Helpers
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Returns the sorted list of attribute names that changed on the given model,
|
||||
* excluding internal timestamps.
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
private function changedFieldsFor(Model $model): array
|
||||
{
|
||||
$fields = collect(array_keys($model->getChanges()))
|
||||
->reject(fn (string $field) => $field === 'updated_at')
|
||||
->values()
|
||||
->all();
|
||||
|
||||
sort($fields);
|
||||
|
||||
return $fields;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ use App\Models\Database;
|
||||
use App\Models\Egg;
|
||||
use App\Models\EggVariable;
|
||||
use App\Models\Node;
|
||||
use App\Models\Role;
|
||||
use App\Models\Schedule;
|
||||
use App\Models\Server;
|
||||
use App\Models\Task;
|
||||
@@ -123,6 +124,9 @@ class AppServiceProvider extends ServiceProvider
|
||||
Egg::created(fn (Egg $egg) => $observer->eggCreated($egg));
|
||||
Egg::updated(fn (Egg $egg) => $observer->eggUpdated($egg));
|
||||
Egg::deleted(fn (Egg $egg) => $observer->eggDeleted($egg));
|
||||
Role::created(fn (Role $role) => $observer->roleCreated($role));
|
||||
Role::updated(fn (Role $role) => $observer->roleUpdated($role));
|
||||
Role::deleted(fn (Role $role) => $observer->roleDeleted($role));
|
||||
|
||||
Gate::before(fn (User $user, $ability) => $user->isRootAdmin() ? true : null);
|
||||
|
||||
|
||||
@@ -125,4 +125,34 @@ return [
|
||||
],
|
||||
'crashed' => 'Server crashed',
|
||||
],
|
||||
'admin' => [
|
||||
'settings' => [
|
||||
'update' => 'Updated panel settings (<b>:count</b>): <b>:settings</b>',
|
||||
],
|
||||
'user' => [
|
||||
'create' => 'Created user <b>:name</b>',
|
||||
'update' => 'Updated user <b>:name</b>',
|
||||
'delete' => 'Deleted user <b>:name</b>',
|
||||
],
|
||||
'server' => [
|
||||
'create' => 'Created server <b>:name</b>',
|
||||
'update' => 'Updated server <b>:name</b>',
|
||||
'delete' => 'Deleted server <b>:name</b>',
|
||||
],
|
||||
'node' => [
|
||||
'create' => 'Created node <b>:name</b>',
|
||||
'update' => 'Updated node <b>:name</b>',
|
||||
'delete' => 'Deleted node <b>:name</b>',
|
||||
],
|
||||
'egg' => [
|
||||
'create' => 'Created egg <b>:name</b>',
|
||||
'update' => 'Updated egg <b>:name</b>',
|
||||
'delete' => 'Deleted egg <b>:name</b>',
|
||||
],
|
||||
'role' => [
|
||||
'create' => 'Created role <b>:name</b>',
|
||||
'update' => 'Updated role <b>:name</b>',
|
||||
'delete' => 'Deleted role <b>:name</b>',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user